aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.circleci/config.yml26
-rw-r--r--.gitignore2
-rw-r--r--.pre-commit-config.yaml16
-rw-r--r--.travis.yml154
-rw-r--r--INFO32
-rw-r--r--INFO.yaml43
-rw-r--r--PI.md32
-rw-r--r--README.md211
-rw-r--r--ansible/host_vars/127.0.0.15
-rw-r--r--ansible/site.cntt.yml48
-rw-r--r--ansible/site.gate.yml90
-rw-r--r--ansible/site.yml58
-rw-r--r--api/apidoc/functest.core.cloudify.rst7
-rw-r--r--api/apidoc/functest.core.rst16
-rw-r--r--api/apidoc/functest.core.singlevm.rst7
-rw-r--r--api/apidoc/functest.core.tenantnetwork.rst7
-rw-r--r--api/apidoc/functest.core.vnf.rst7
-rw-r--r--api/apidoc/functest.opnfv_tests.openstack.api.connection_check.rst7
-rw-r--r--api/apidoc/functest.opnfv_tests.openstack.api.rst17
-rw-r--r--api/apidoc/functest.opnfv_tests.openstack.cinder.cinder_test.rst7
-rw-r--r--api/apidoc/functest.opnfv_tests.openstack.cinder.rst17
-rw-r--r--api/apidoc/functest.opnfv_tests.openstack.patrole.patrole.rst7
-rw-r--r--api/apidoc/functest.opnfv_tests.openstack.patrole.rst17
-rw-r--r--api/apidoc/functest.opnfv_tests.openstack.rally.rally.rst7
-rw-r--r--api/apidoc/functest.opnfv_tests.openstack.rally.rst17
-rw-r--r--api/apidoc/functest.opnfv_tests.openstack.refstack.refstack.rst7
-rw-r--r--api/apidoc/functest.opnfv_tests.openstack.refstack.rst17
-rw-r--r--api/apidoc/functest.opnfv_tests.openstack.rst25
-rw-r--r--api/apidoc/functest.opnfv_tests.openstack.shaker.rst17
-rw-r--r--api/apidoc/functest.opnfv_tests.openstack.shaker.shaker.rst7
-rw-r--r--api/apidoc/functest.opnfv_tests.openstack.tempest.rst17
-rw-r--r--api/apidoc/functest.opnfv_tests.openstack.tempest.tempest.rst7
-rw-r--r--api/apidoc/functest.opnfv_tests.openstack.vmtp.rst17
-rw-r--r--api/apidoc/functest.opnfv_tests.openstack.vmtp.vmtp.rst7
-rw-r--r--api/apidoc/functest.opnfv_tests.openstack.vping.rst18
-rw-r--r--api/apidoc/functest.opnfv_tests.openstack.vping.vping_ssh.rst7
-rw-r--r--api/apidoc/functest.opnfv_tests.openstack.vping.vping_userdata.rst7
-rw-r--r--api/apidoc/functest.opnfv_tests.rst19
-rw-r--r--api/apidoc/functest.opnfv_tests.sdn.odl.odl.rst4
-rw-r--r--api/apidoc/functest.opnfv_tests.sdn.odl.rst16
-rw-r--r--api/apidoc/functest.opnfv_tests.sdn.rst17
-rw-r--r--api/apidoc/functest.opnfv_tests.vnf.epc.juju_epc.rst7
-rw-r--r--api/apidoc/functest.opnfv_tests.vnf.epc.rst17
-rw-r--r--api/apidoc/functest.opnfv_tests.vnf.ims.clearwater.rst7
-rw-r--r--api/apidoc/functest.opnfv_tests.vnf.ims.cloudify_ims.rst7
-rw-r--r--api/apidoc/functest.opnfv_tests.vnf.ims.heat_ims.rst7
-rw-r--r--api/apidoc/functest.opnfv_tests.vnf.ims.rst19
-rw-r--r--api/apidoc/functest.opnfv_tests.vnf.router.cloudify_vrouter.rst7
-rw-r--r--api/apidoc/functest.opnfv_tests.vnf.router.rst27
-rw-r--r--api/apidoc/functest.opnfv_tests.vnf.router.test_controller.function_test_exec.rst7
-rw-r--r--api/apidoc/functest.opnfv_tests.vnf.router.test_controller.rst17
-rw-r--r--api/apidoc/functest.opnfv_tests.vnf.router.utilvnf.rst7
-rw-r--r--api/apidoc/functest.opnfv_tests.vnf.router.vnf_controller.checker.rst7
-rw-r--r--api/apidoc/functest.opnfv_tests.vnf.router.vnf_controller.command_generator.rst7
-rw-r--r--api/apidoc/functest.opnfv_tests.vnf.router.vnf_controller.rst21
-rw-r--r--api/apidoc/functest.opnfv_tests.vnf.router.vnf_controller.ssh_client.rst7
-rw-r--r--api/apidoc/functest.opnfv_tests.vnf.router.vnf_controller.vm_controller.rst7
-rw-r--r--api/apidoc/functest.opnfv_tests.vnf.router.vnf_controller.vnf_controller.rst7
-rw-r--r--api/apidoc/functest.opnfv_tests.vnf.router.vrouter_base.rst7
-rw-r--r--api/apidoc/functest.opnfv_tests.vnf.rst19
-rw-r--r--api/apidoc/functest.rst14
-rw-r--r--api/apidoc/functest.utils.config.rst7
-rw-r--r--api/apidoc/functest.utils.constants.rst7
-rw-r--r--api/apidoc/functest.utils.env.rst7
-rw-r--r--api/apidoc/functest.utils.functest_utils.rst7
-rw-r--r--api/apidoc/functest.utils.rst20
-rw-r--r--api/requirements.txt37
-rw-r--r--build.sh73
-rw-r--r--commons/traffic-profile-guidelines.rst8
-rw-r--r--docker/benchmarking-cntt/Dockerfile5
-rw-r--r--docker/benchmarking-cntt/blacklist.yaml48
-rw-r--r--docker/benchmarking-cntt/testcases.yaml67
-rw-r--r--docker/benchmarking/Dockerfile30
-rw-r--r--docker/benchmarking/hooks/post_checkout (renamed from docker/features/hooks/post_checkout)2
-rw-r--r--docker/benchmarking/testcases.yaml67
-rw-r--r--docker/components/Dockerfile33
-rw-r--r--docker/components/hooks/post_checkout6
-rw-r--r--docker/components/testcases.yaml39
-rw-r--r--docker/core/Dockerfile61
-rw-r--r--docker/core/Switch-to-threading.Thread-for-Rally-tasks.patch49
-rw-r--r--docker/features/Dockerfile41
-rw-r--r--docker/features/testcases.yaml89
-rw-r--r--docker/features/thirdparty-requirements.txt7
-rw-r--r--docker/healthcheck/Dockerfile13
-rw-r--r--docker/healthcheck/testcases.yaml177
-rw-r--r--docker/healthcheck/thirdparty-requirements.txt (renamed from docker/smoke/thirdparty-requirements.txt)2
-rw-r--r--docker/parser/Dockerfile19
-rw-r--r--docker/parser/hooks/post_checkout6
-rw-r--r--docker/parser/testcases.yaml25
-rw-r--r--docker/parser/thirdparty-requirements.txt3
-rw-r--r--docker/smoke-cntt/Dockerfile5
-rw-r--r--docker/smoke-cntt/tempest_conf.yaml104
-rw-r--r--docker/smoke-cntt/testcases.yaml321
-rw-r--r--docker/smoke/Dockerfile138
-rw-r--r--docker/smoke/compute.txt (renamed from functest/opnfv_tests/openstack/tempest/custom_tests/defcore_req.txt)163
-rw-r--r--docker/smoke/hooks/post_checkout4
-rw-r--r--docker/smoke/object.txt66
-rw-r--r--docker/smoke/platform.txt432
-rw-r--r--docker/smoke/testcases.yaml414
-rw-r--r--docker/vnf/Dockerfile78
-rw-r--r--docker/vnf/clearwater-heat-singlenet-deps.patch1849
-rw-r--r--docker/vnf/hooks/post_checkout2
-rw-r--r--docker/vnf/testcases.yaml45
-rw-r--r--docs/com/css/theme/OPNFV-Berlin.css6
-rw-r--r--docs/com/css/theme/OPNFV.css6
-rw-r--r--docs/com/pres/Summit/Berlin-2016/conversation.html2
-rw-r--r--docs/com/pres/Summit/Berlin-2016/summit-Berlin.html24
-rw-r--r--docs/com/pres/Summit/Berlin-2016/testapi.html16
-rw-r--r--docs/com/pres/compliance/compliance.md97
-rw-r--r--docs/com/pres/compliance/index.html52
-rw-r--r--docs/com/pres/dockerslicing/dockerslicing.md2
-rw-r--r--docs/com/pres/euphrates_functest_evolution/euphrates.md2
-rw-r--r--docs/com/pres/functest2019/functest2019.md105
-rw-r--r--docs/com/pres/functest2019/index.html52
-rw-r--r--docs/com/pres/functest2020/functest2020.md61
-rw-r--r--docs/com/pres/functest2020/index.html52
-rw-r--r--docs/com/pres/gambia/gambia.md178
-rw-r--r--docs/com/pres/gambia/index.html52
-rw-r--r--docs/com/pres/gambia/raspberrypi.jpgbin0 -> 4385395 bytes
-rw-r--r--docs/com/pres/oran/ftth.pngbin0 -> 162001 bytes
-rw-r--r--docs/com/pres/oran/oran.md90
-rw-r--r--docs/com/pres/oran/rc1.pngbin0 -> 360960 bytes
m---------docs/com/pres/reveal.js0
-rw-r--r--docs/com/pres/rfp/index.html52
-rw-r--r--docs/com/pres/rfp/rfp.md97
-rw-r--r--docs/com/pres/stockholm/chainedci.pngbin0 -> 95192 bytes
-rw-r--r--docs/com/pres/stockholm/ftth.pngbin0 -> 162001 bytes
-rw-r--r--docs/com/pres/stockholm/index.html52
-rw-r--r--docs/com/pres/stockholm/stockholm.md164
-rw-r--r--docs/com/pres/vevent202004/index.html52
-rw-r--r--docs/com/pres/vevent202004/vevent202004.md99
-rw-r--r--docs/com/pres/vevent202010/index.html52
-rw-r--r--docs/com/pres/vevent202010/vevent202010.md62
-rw-r--r--docs/conf.py (renamed from docs/testing/developer/internship/testapi_evolution/conf.py)35
-rw-r--r--docs/images/clearwater-architecture-v2.pngbin0 -> 151201 bytes
-rw-r--r--docs/images/concepts_mapping_fraser.pngbin0 -> 129579 bytes
-rw-r--r--docs/index.rst15
-rw-r--r--docs/release/release-notes/apex.rst47
-rw-r--r--docs/release/release-notes/compass.rst57
-rw-r--r--docs/release/release-notes/conf.py184
-rw-r--r--docs/release/release-notes/daisy.rst47
-rw-r--r--docs/release/release-notes/fuel_amd64.rst47
-rw-r--r--docs/release/release-notes/fuel_arm64.rst21
-rw-r--r--docs/release/release-notes/functest-gating.rst27
-rw-r--r--docs/release/release-notes/functest-release.rst132
-rw-r--r--docs/release/release-notes/index.rst4
-rw-r--r--docs/release/release-notes/joid.rst24
-rw-r--r--docs/results/euphrates/5.0/apex.html398
-rw-r--r--docs/results/euphrates/5.0/compass.html248
-rw-r--r--docs/results/euphrates/5.0/daisy.html42
-rw-r--r--docs/results/euphrates/5.0/fuel@aarch64.html62
-rw-r--r--docs/results/euphrates/5.0/fuel@x86.html124
-rw-r--r--docs/results/euphrates/5.0/joid.html124
-rw-r--r--docs/results/js/default.css2
-rw-r--r--docs/results/js/trend.js4
-rw-r--r--docs/spelling_wordlist.txt151
-rw-r--r--docs/testing/developer/devguide/conf.py185
-rw-r--r--docs/testing/developer/devguide/index.rst107
-rw-r--r--docs/testing/developer/internship/security_group/conf.py185
-rw-r--r--docs/testing/developer/internship/security_group/index.rst62
-rw-r--r--docs/testing/developer/internship/testapi_evolution/index.rst230
-rw-r--r--docs/testing/developer/internship/unit_tests/conf.py185
-rw-r--r--docs/testing/developer/internship/unit_tests/index.rst123
-rw-r--r--docs/testing/developer/internship/vnf_catalog/conf.py185
-rw-r--r--docs/testing/developer/internship/vnf_catalog/index.rst160
-rw-r--r--docs/testing/user/configguide/ci.rst16
-rw-r--r--docs/testing/user/configguide/conf.py185
-rw-r--r--docs/testing/user/configguide/configguide.rst324
-rw-r--r--docs/testing/user/configguide/index.rst22
-rw-r--r--docs/testing/user/configguide/intro.rst7
-rw-r--r--docs/testing/user/configguide/prerequisites.rst14
-rw-r--r--docs/testing/user/userguide/conf.py185
-rw-r--r--docs/testing/user/userguide/index.rst38
-rw-r--r--docs/testing/user/userguide/intro.rst4
-rw-r--r--docs/testing/user/userguide/reporting.rst6
-rw-r--r--docs/testing/user/userguide/runfunctest.rst138
-rw-r--r--docs/testing/user/userguide/test_details.rst177
-rw-r--r--docs/testing/user/userguide/test_overview.rst111
-rw-r--r--docs/testing/user/userguide/test_results.rst213
-rw-r--r--docs/testing/user/userguide/troubleshooting.rst73
-rw-r--r--elements/functest/element-deps1
-rwxr-xr-xelements/functest/install.d/16-functest14
-rw-r--r--functest/api/base.py68
-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.py157
-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.py188
-rw-r--r--functest/ci/config_aarch64_patch.yaml151
-rw-r--r--functest/ci/config_functest.yaml105
-rw-r--r--functest/ci/config_patch.yaml516
-rw-r--r--functest/ci/convert_images.sh13
-rw-r--r--functest/ci/download_images.sh23
-rw-r--r--functest/ci/logging.debug.ini110
-rw-r--r--functest/ci/logging.ini24
-rw-r--r--functest/ci/rally_aarch64_patch.conf2
-rw-r--r--functest/ci/testcases.yaml1063
-rw-r--r--functest/cli/__init__.py0
-rw-r--r--functest/cli/cli_base.py129
-rw-r--r--functest/cli/commands/__init__.py0
-rw-r--r--functest/cli/commands/cli_env.py49
-rw-r--r--functest/cli/commands/cli_os.py63
-rw-r--r--functest/cli/commands/cli_testcase.py50
-rw-r--r--functest/cli/commands/cli_tier.py87
-rw-r--r--functest/cli/functest-complete.sh8
-rw-r--r--functest/core/cloudify.py219
-rw-r--r--functest/core/singlevm.py549
-rw-r--r--functest/core/tenantnetwork.py326
-rw-r--r--functest/core/vnf.py187
-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/patrole.py42
-rw-r--r--functest/opnfv_tests/openstack/rally/blacklist.txt28
-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.py902
-rw-r--r--functest/opnfv_tests/openstack/rally/rally_jobs.yaml3
-rw-r--r--functest/opnfv_tests/openstack/rally/scenario/full/opnfv-cinder.yaml71
-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.yaml18
-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-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.yaml9
-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.yaml10
-rw-r--r--functest/opnfv_tests/openstack/refstack/refstack.py80
-rw-r--r--functest/opnfv_tests/openstack/shaker/__init__.py (renamed from functest/api/database/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.py45
-rw-r--r--functest/opnfv_tests/openstack/snaps/connection_check.py44
-rw-r--r--functest/opnfv_tests/openstack/snaps/health_check.py49
-rw-r--r--functest/opnfv_tests/openstack/snaps/smoke.py48
-rw-r--r--functest/opnfv_tests/openstack/snaps/snaps_suite_builder.py446
-rw-r--r--functest/opnfv_tests/openstack/snaps/snaps_test_runner.py52
-rw-r--r--functest/opnfv_tests/openstack/snaps/snaps_utils.py61
-rw-r--r--functest/opnfv_tests/openstack/tempest/conf_utils.py263
-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/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.py969
-rw-r--r--functest/opnfv_tests/openstack/vmtp/__init__.py (renamed from functest/api/resources/__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.py201
-rw-r--r--functest/opnfv_tests/openstack/vping/vping_ssh.py243
-rw-r--r--functest/opnfv_tests/openstack/vping/vping_userdata.py158
-rw-r--r--functest/opnfv_tests/sdn/odl/odl.py60
-rw-r--r--functest/opnfv_tests/vnf/epc/juju_epc.py616
-rw-r--r--functest/opnfv_tests/vnf/ims/clearwater.py190
-rw-r--r--functest/opnfv_tests/vnf/ims/clearwater_ims_base.py164
-rw-r--r--functest/opnfv_tests/vnf/ims/cloudify_ims.py601
-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.py399
-rw-r--r--functest/opnfv_tests/vnf/ims/ixia/utils/IxRestUtils.py193
-rw-r--r--functest/opnfv_tests/vnf/ims/ixia/utils/__init__.py0
-rw-r--r--functest/opnfv_tests/vnf/router/cloudify_vrouter.py465
-rw-r--r--functest/opnfv_tests/vnf/router/cloudify_vrouter.yaml12
-rw-r--r--functest/opnfv_tests/vnf/router/test_controller/function_test_exec.py20
-rw-r--r--functest/opnfv_tests/vnf/router/utilvnf.py133
-rw-r--r--functest/opnfv_tests/vnf/router/vnf_controller/checker.py2
-rw-r--r--functest/opnfv_tests/vnf/router/vnf_controller/command_generator.py2
-rw-r--r--functest/opnfv_tests/vnf/router/vnf_controller/ssh_client.py8
-rw-r--r--functest/opnfv_tests/vnf/router/vnf_controller/vm_controller.py34
-rw-r--r--functest/opnfv_tests/vnf/router/vnf_controller/vnf_controller.py24
-rw-r--r--functest/opnfv_tests/vnf/router/vrouter_base.py40
-rw-r--r--functest/tests/unit/ci/__init__.py0
-rw-r--r--functest/tests/unit/ci/test_check_deployment.py286
-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.py69
-rw-r--r--functest/tests/unit/cli/commands/test_cli_os.py78
-rw-r--r--functest/tests/unit/cli/commands/test_cli_testcase.py77
-rw-r--r--functest/tests/unit/cli/commands/test_cli_tier.py104
-rw-r--r--functest/tests/unit/cli/test_cli_base.py102
-rw-r--r--functest/tests/unit/core/test_vnf.py196
-rw-r--r--functest/tests/unit/odl/test_odl.py283
-rw-r--r--functest/tests/unit/openstack/cinder/__init__.py (renamed from functest/api/resources/v1/__init__.py)0
-rw-r--r--functest/tests/unit/openstack/cinder/test_cinder.py270
-rw-r--r--functest/tests/unit/openstack/rally/test_rally.py442
-rw-r--r--functest/tests/unit/openstack/snaps/__init__.py0
-rw-r--r--functest/tests/unit/openstack/snaps/test_snaps.py288
-rw-r--r--functest/tests/unit/openstack/tempest/test_conf_utils.py258
-rw-r--r--functest/tests/unit/openstack/tempest/test_tempest.py307
-rw-r--r--functest/tests/unit/openstack/vmtp/__init__.py (renamed from functest/ci/__init__.py)0
-rw-r--r--functest/tests/unit/openstack/vmtp/test_vmtp.py90
-rw-r--r--functest/tests/unit/openstack/vping/test_vping.py175
-rw-r--r--functest/tests/unit/openstack/vping/test_vping_ssh.py147
-rw-r--r--functest/tests/unit/utils/test_functest_utils.py337
-rw-r--r--functest/tests/unit/vnf/epc/test_juju_epc.py1
-rw-r--r--functest/tests/unit/vnf/ims/test_clearwater.py (renamed from functest/tests/unit/vnf/ims/test_ims_base.py)8
-rw-r--r--functest/tests/unit/vnf/ims/test_cloudify_ims.py49
-rw-r--r--functest/tests/unit/vnf/router/test_cloudify_vrouter.py53
-rw-r--r--functest/tests/unit/vnf/router/test_vrouter_base.py10
-rw-r--r--functest/utils/config.py16
-rw-r--r--functest/utils/env.py21
-rw-r--r--functest/utils/functest_utils.py189
-rw-r--r--requirements.txt38
-rw-r--r--setup.cfg34
-rw-r--r--setup.py8
-rw-r--r--test-requirements.txt21
-rw-r--r--tox.ini142
-rw-r--r--upper-constraints.txt46
351 files changed, 16219 insertions, 31290 deletions
diff --git a/.circleci/config.yml b/.circleci/config.yml
new file mode 100644
index 000000000..f7817da9c
--- /dev/null
+++ b/.circleci/config.yml
@@ -0,0 +1,26 @@
+---
+version: 2
+jobs:
+ build:
+ docker:
+ - image: circleci/python:3.9
+ steps:
+ - checkout
+ - run:
+ name: Install dependendencies
+ command: sudo apt-get update && sudo apt-get install enchant-2
+ - run:
+ name: Run tox
+ command: sudo pip install tox tox-pip-version && tox
+ - store_artifacts:
+ path: api/build
+ destination: api
+ - store_artifacts:
+ path: docs/build
+ destination: docs
+ - store_artifacts:
+ path: cover
+ destination: cover
+ - store_artifacts:
+ path: coverage.xml
+ destination: coverage.xml
diff --git a/.gitignore b/.gitignore
index b5f5b3a2c..12d86f825 100644
--- a/.gitignore
+++ b/.gitignore
@@ -4,7 +4,6 @@
.project
.pydevproject
rally_conf.json
-/docs_build/
/docs/**/build/
_build
/docs_output/
@@ -19,3 +18,4 @@ functest.egg-info
.tox
*.out
*.pdf
+docs/_build/*
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
new file mode 100644
index 000000000..323386c88
--- /dev/null
+++ b/.pre-commit-config.yaml
@@ -0,0 +1,16 @@
+---
+repos:
+ - repo: https://github.com/pre-commit/pre-commit-hooks
+ rev: v4.4.0
+ hooks:
+ - id: trailing-whitespace
+ exclude: '.patch$'
+ # trailing blanks shall not preferably be fixed in patch files
+
+ - repo: https://github.com/Lucas-C/pre-commit-hooks
+ rev: v1.4.2
+ hooks:
+ - id: remove-tabs
+ stages: [commit]
+ exclude: '^(.git/|docs/make.bat|docs/Makefile|)'
+
diff --git a/.travis.yml b/.travis.yml
index fae6e73b6..6b6e0a672 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -2,111 +2,187 @@
sudo: required
services: docker
language: generic
+dist: focal
before_script:
- - sudo apt-get -y install qemu-user-static
+ - sudo docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
+ - sudo pip install tox tox-pip-version
+ - sudo apt-get update && sudo apt-get install -y enchant
- sudo -E docker login -u="${DOCKER_USERNAME}" -p="${DOCKER_PASSWORD}"
- (cd .. && git clone https://github.com/estesp/manifest-tool)
+ - (cd ../manifest-tool && git checkout v0.9.0)
- (cd ../manifest-tool && sudo -E make && sudo -E make install)
jobs:
include:
+ - stage: run unit tests
+ script: >
+ tox -e \
+ docs,pep8,pylint,yamllint,bashate,bandit,py38,cover
- stage: build functest-core images
- script: sudo -E bash build.sh
+ script: sudo -E sh build.sh
+ env:
+ - REPO="${DOCKER_USERNAME}"
+ - amd64_dirs="docker/core"
+ - arm64_dirs=""
+ - arm_dirs=""
+ - script: sudo -E sh build.sh
env:
- REPO="${DOCKER_USERNAME}"
- amd64_dirs=""
- arm64_dirs="docker/core"
- - script: sudo -E bash build.sh
+ - arm_dirs=""
+ - script: sudo -E sh build.sh
env:
- REPO="${DOCKER_USERNAME}"
- - amd64_dirs="docker/core"
+ - amd64_dirs=""
- arm64_dirs=""
+ - arm_dirs="docker/core"
- stage: publish functest-core manifests
script: >
sudo manifest-tool push from-args \
- --platforms linux/amd64,linux/arm64 \
+ --platforms linux/amd64,linux/arm,linux/arm64 \
--template ${DOCKER_USERNAME}/functest-core:ARCH-latest \
--target ${DOCKER_USERNAME}/functest-core:latest
- stage: build all functest images
- script: sudo -E bash build.sh
+ script: sudo -E sh build.sh
+ env:
+ - REPO="${DOCKER_USERNAME}"
+ - amd64_dirs="docker/healthcheck"
+ - arm64_dirs=""
+ - arm_dirs=""
+ - script: sudo -E sh build.sh
env:
- REPO="${DOCKER_USERNAME}"
- amd64_dirs=""
- arm64_dirs="docker/healthcheck"
- - script: sudo -E bash build.sh
+ - arm_dirs=""
+ - script: sudo -E sh build.sh
env:
- REPO="${DOCKER_USERNAME}"
- amd64_dirs=""
- - arm64_dirs="docker/smoke"
- - script: sudo -E bash build.sh
+ - arm64_dirs=""
+ - arm_dirs="docker/healthcheck"
+ - script: sudo -E sh build.sh
env:
- REPO="${DOCKER_USERNAME}"
- - amd64_dirs=""
- - arm64_dirs="docker/components"
- - script: sudo -E bash build.sh
+ - amd64_dirs="docker/smoke"
+ - arm64_dirs=""
+ - arm_dirs=""
+ - script: sudo -E sh build.sh
env:
- REPO="${DOCKER_USERNAME}"
- amd64_dirs=""
- - arm64_dirs="docker/parser"
- - script: sudo -E bash build.sh
+ - arm64_dirs="docker/smoke"
+ - arm_dirs=""
+ - script: sudo -E sh build.sh
env:
- REPO="${DOCKER_USERNAME}"
- - amd64_dirs="docker/healthcheck"
+ - amd64_dirs=""
- arm64_dirs=""
- - script: sudo -E bash build.sh
+ - arm_dirs="docker/smoke"
+ - script: sudo -E sh build.sh
env:
- REPO="${DOCKER_USERNAME}"
- - amd64_dirs="docker/smoke"
+ - amd64_dirs="docker/benchmarking"
- arm64_dirs=""
- - script: sudo -E bash build.sh
+ - arm_dirs=""
+ - script: sudo -E sh build.sh
env:
- REPO="${DOCKER_USERNAME}"
- - amd64_dirs="docker/features"
- - arm64_dirs=""
- - script: sudo -E bash build.sh
+ - amd64_dirs=""
+ - arm64_dirs="docker/benchmarking"
+ - arm_dirs=""
+ - script: sudo -E sh build.sh
env:
- REPO="${DOCKER_USERNAME}"
- - amd64_dirs="docker/components"
+ - amd64_dirs=""
- arm64_dirs=""
- - script: sudo -E bash build.sh
+ - arm_dirs="docker/benchmarking"
+ - script: sudo -E sh build.sh
env:
- REPO="${DOCKER_USERNAME}"
- amd64_dirs="docker/vnf"
- arm64_dirs=""
- - script: sudo -E bash build.sh
+ - arm_dirs=""
+ - script: sudo -E sh build.sh
+ env:
+ - REPO="${DOCKER_USERNAME}"
+ - amd64_dirs=""
+ - arm64_dirs="docker/vnf"
+ - arm_dirs=""
+ - script: sudo -E sh build.sh
env:
- REPO="${DOCKER_USERNAME}"
- - amd64_dirs="docker/parser"
+ - amd64_dirs=""
- arm64_dirs=""
+ - arm_dirs="docker/vnf"
- stage: publish all manifests
script: >
sudo manifest-tool push from-args \
- --platforms linux/amd64,linux/arm64 \
+ --platforms linux/amd64,linux/arm,linux/arm64 \
--template ${DOCKER_USERNAME}/functest-healthcheck:ARCH-latest \
--target ${DOCKER_USERNAME}/functest-healthcheck:latest
- script: >
sudo manifest-tool push from-args \
- --platforms linux/amd64,linux/arm64 \
+ --platforms linux/amd64,linux/arm,linux/arm64 \
--template ${DOCKER_USERNAME}/functest-smoke:ARCH-latest \
--target ${DOCKER_USERNAME}/functest-smoke:latest
- script: >
sudo manifest-tool push from-args \
- --platforms linux/amd64 \
- --template ${DOCKER_USERNAME}/functest-features:ARCH-latest \
- --target ${DOCKER_USERNAME}/functest-features:latest
- - script: >
- sudo manifest-tool push from-args \
- --platforms linux/amd64,linux/arm64 \
- --template ${DOCKER_USERNAME}/functest-components:ARCH-latest \
- --target ${DOCKER_USERNAME}/functest-components:latest
+ --platforms linux/amd64,linux/arm,linux/arm64 \
+ --template ${DOCKER_USERNAME}/functest-benchmarking:ARCH-latest \
+ --target ${DOCKER_USERNAME}/functest-benchmarking:latest
- script: >
sudo manifest-tool push from-args \
- --platforms linux/amd64 \
+ --platforms linux/amd64,linux/arm,linux/arm64 \
--template ${DOCKER_USERNAME}/functest-vnf:ARCH-latest \
--target ${DOCKER_USERNAME}/functest-vnf:latest
+ - stage: build all functest cntt images
+ script: sudo -E sh build.sh
+ env:
+ - REPO="${DOCKER_USERNAME}"
+ - amd64_dirs="docker/smoke-cntt"
+ - arm64_dirs=""
+ - arm_dirs=""
+ - script: sudo -E sh build.sh
+ env:
+ - REPO="${DOCKER_USERNAME}"
+ - amd64_dirs=""
+ - arm64_dirs="docker/smoke-cntt"
+ - arm_dirs=""
+ - script: sudo -E sh build.sh
+ env:
+ - REPO="${DOCKER_USERNAME}"
+ - amd64_dirs=""
+ - arm64_dirs=""
+ - arm_dirs="docker/smoke-cntt"
+ - script: sudo -E sh build.sh
+ env:
+ - REPO="${DOCKER_USERNAME}"
+ - amd64_dirs="docker/benchmarking-cntt"
+ - arm64_dirs=""
+ - arm_dirs=""
+ - script: sudo -E sh build.sh
+ env:
+ - REPO="${DOCKER_USERNAME}"
+ - amd64_dirs=""
+ - arm64_dirs="docker/benchmarking-cntt"
+ - arm_dirs=""
+ - script: sudo -E sh build.sh
+ env:
+ - REPO="${DOCKER_USERNAME}"
+ - amd64_dirs=""
+ - arm64_dirs=""
+ - arm_dirs="docker/benchmarking-cntt"
+ - stage: publish all cntt manifests
+ script: >
+ sudo manifest-tool push from-args \
+ --platforms linux/amd64,linux/arm,linux/arm64 \
+ --template ${DOCKER_USERNAME}/functest-smoke-cntt:ARCH-latest \
+ --target ${DOCKER_USERNAME}/functest-smoke-cntt:latest
- script: >
sudo manifest-tool push from-args \
- --platforms linux/amd64,linux/arm64 \
- --template ${DOCKER_USERNAME}/functest-parser:ARCH-latest \
- --target ${DOCKER_USERNAME}/functest-parser:latest
+ --platforms linux/amd64,linux/arm,linux/arm64 \
+ --template ${DOCKER_USERNAME}/functest-benchmarking-cntt:ARCH-latest \
+ --target ${DOCKER_USERNAME}/functest-benchmarking-cntt:latest
diff --git a/INFO b/INFO
index 0cbec6b4d..eca7c5141 100644
--- a/INFO
+++ b/INFO
@@ -1,9 +1,9 @@
Project: Base System Functionality Testing Project (functest)
Project Creation Date: January 20, 2015
Project Category: Integration & Testing
-Lifecycle State: Incubation
-Primary Contact: Cedric Ollivier (cedric.ollivier@orange.com)
-Project Lead: Cedric Ollivier (cedric.ollivier@orange.com)
+Lifecycle State: Mature
+Primary Contact: Cédric Ollivier (cedric.ollivier@orange.com)
+Project Lead: Cédric Ollivier (cedric.ollivier@orange.com)
Jira Project Name: Base System Functionality Testing Project
Jira Project Prefix: FUNCTEST
Mailing list tag: [functest]
@@ -11,30 +11,6 @@ IRC: Server:freenode.net Channel:#opnfv-functest
Repository: functest
Committers:
-Morgan Richomme <morgan.richomme@orange.com>
-Jose Lausuch <jalausuch@suse.com>
-Cedric Ollivier <cedric.ollivier@orange.com>
-Helen Yao <helanyao@gmail.com>
-Serena Feng <feng.xiaowei@zte.com.cn>
-Juha Kosonen <juha.kosonen@nokia.com>
-Valentin Boucher <valentin.boucher@kontron.com>
-Viktor Tikkanen <viktor.tikkanen@nokia.com>
-Mei Mei <meimei@huawei.com>
-Linda Wang <wangwulin@huawei.com>
-
-Additional contributors:
-Georgios Paraskevopoulos <georgepar.91@gmail.com>
-Romanos Skiadas <rom.skiad@gmail.com>
-Michael Polenchuk <mpolenchuk@mirantis.com>
-Cristina Pauna <cristina.pauna@enea.com>
-Steven Pisarski <s.pisarski@cablelabs.com>
+Cédric Ollivier <cedric.ollivier@orange.com>
Link to TSC approval of the project: http://meetbot.opnfv.org/meetings/opnfv-meeting/2015/opnfv-meeting.2015-01-20-14.57.html
-
-Link(s) to approval of additional committers:
-
-http://lists.opnfv.org/pipermail/opnfv-tech-discuss/2015-April/001971.html
-http://ircbot.wl.linuxfoundation.org/meetings/opnfv-testperf/2015/opnfv-testperf.2015-09-29-13.00.html
-http://ircbot.wl.linuxfoundation.org/meetings/opnfv-testperf/2016/opnfv-testperf.2016-03-01-08.00.html
-http://ircbot.wl.linuxfoundation.org/meetings/opnfv-functest/2016/opnfv-functest.2016-10-11-08.01.html
-
diff --git a/INFO.yaml b/INFO.yaml
new file mode 100644
index 000000000..cf3b176c2
--- /dev/null
+++ b/INFO.yaml
@@ -0,0 +1,43 @@
+---
+project: 'Base System Functionality Testing Project (functest)'
+project_creation_date: 'January 20, 2015'
+project_category: 'Integration & Testing'
+lifecycle_state: 'Mature'
+project_lead: &opnfv_functest_ptl
+ name: 'Cédric Ollivier'
+ email: 'cedric.ollivier@orange.com'
+ company: 'orange'
+ id: 'ollivier'
+ timezone: 'Europe/Paris'
+primary_contact: *opnfv_functest_ptl
+issue_tracking:
+ type: 'jira'
+ url: 'https://jira.opnfv.org/projects/FUNCTEST'
+ key: 'FUNCTEST'
+mailing_list:
+ type: 'mailman2'
+ url: 'opnfv-tech-discuss@lists.opnfv.org'
+ tag: '[functest]'
+realtime_discussion:
+ type: 'irc'
+ server: 'freenode.net'
+ channel: '#opnfv-functest'
+meetings:
+ - type: 'irc'
+ agenda: 'https://wiki.opnfv.org/display/functest/Functest+5.+Meeting'
+ url: 'http://ircbot.wl.linuxfoundation.org/meetings/opnfv-functest/'
+ server: 'freenode.net'
+ channel: '#opnfv-meeting'
+ repeats: 'weekly'
+ time: '08:00 UTC'
+repositories:
+ - 'functest'
+ - 'functest-kubernetes'
+ - 'functest-requirements'
+ - 'functest-xtesting'
+committers:
+ - <<: *opnfv_functest_ptl
+tsc:
+ # yamllint disable rule:line-length
+ approval: 'http//meetbot.opnfv.org/meetings/opnfv-meeting/2015/opnfv-meeting.2015-01-20-14.57.html'
+ # yamllint enable rule:line-length
diff --git a/PI.md b/PI.md
new file mode 100644
index 000000000..cc7c25bc8
--- /dev/null
+++ b/PI.md
@@ -0,0 +1,32 @@
+# Run Functest containers on Raspberry PI
+
+All Functest containers (Hunter and newer) are cross-compiled for arm and arm64
+via [travis-ci](https://travis-ci.org/collivier/functest/branches).
+They are built on top of Alpine armhf to support most of Raspberry PI models.
+
+All Docker manifests are published to run these containers via the same
+commands whatever the architecture.
+
+## Copy the image to the SD card
+
+> https://www.raspberrypi.org/documentation/installation/installing-images/linux.md
+>
+> This is very important, as you will lose all the data on the hard drive if you provide the wrong device name.
+> Make sure the device name is the name of the whole SD card as described above, not just a partition. For example: sdd, not sdds1 or sddp1; mmcblk0, not mmcblk0p1.
+
+
+## Install Docker
+
+```shell
+wget https://downloads.raspberrypi.org/raspbian/images/raspbian-2018-11-15/2018-11-13-raspbian-stretch.zip
+unzip 2018-11-13-raspbian-stretch.zip
+sudo dd bs=4M if=2018-11-13-raspbian-stretch.img of=/dev/mmcblk0 conv=fsync
+```
+
+## Install Docker
+
+```shell
+curl -sSL https://get.docker.com | sudo sh
+```
+
+## That's all folks
diff --git a/README.md b/README.md
new file mode 100644
index 000000000..c9f1f03d1
--- /dev/null
+++ b/README.md
@@ -0,0 +1,211 @@
+# Functest
+
+Network virtualization has dramatically modified our architectures which asks
+for more automation and powerful testing tools like Functest, a collection of
+state-of-the-art virtual infrastructure test suites, including automatic VNF
+testing (cf.
+[[1]](https://www.linuxfoundation.org/press-release/2019/05/opnfv-hunter-delivers-test-tools-ci-cd-framework-to-enable-common-nfvi-for-verifying-vnfs/)).
+
+In context of OPNFV, Functest verifies any kind of OpenStack and Kubernetes
+deployments including production environments. It conforms to upstream rules
+and integrates smoothly lots of the test cases available in the opensource
+market. It includes about 3000+ functional tests and 3 hours upstream API and
+dataplane benchmarks. It’s completed by Virtual Network Function deployments
+and testing (vIMS, vRouter and vEPC) to ensure that the platforms meet Network
+Functions Virtualization requirements. Raspberry PI is also supported to verify
+datacenters as the lowest cost (50 euros hardware and software included).
+
+| Functest releases | OpenStack releases |
+|-------------------|--------------------|
+| Jerma | Train |
+| Kali | Ussuri |
+| Leguer | Victoria |
+| Wallaby | Wallaby |
+| **Master** | **next Xena** |
+
+## Prepare your environment
+
+cat env
+```
+DEPLOY_SCENARIO=XXX # if not os-nosdn-nofeature-noha scenario
+NAMESERVER=XXX # if not 8.8.8.8
+EXTERNAL_NETWORK=XXX # if not first network with router:external=True
+DASHBOARD_URL=XXX # else tempest_horizon will be skipped
+NEW_USER_ROLE=XXX # if not member
+SDN_CONTROLLER_IP=XXX # if odl scenario
+VOLUME_DEVICE_NAME=XXX # if not vdb
+FLAVOR_EXTRA_SPECS=hw:mem_page_size:large # if fdio scenarios
+```
+
+cat openstack.creds
+```
+export OS_AUTH_URL=XXX
+export OS_USER_DOMAIN_NAME=XXX
+export OS_PROJECT_DOMAIN_NAME=XXX
+export OS_USERNAME=XXX
+export OS_PROJECT_NAME=XXX
+export OS_PASSWORD=XXX
+export OS_IDENTITY_API_VERSION=3
+export OS_REGION_NAME=XXX
+```
+
+mkdir -p images && wget -q -O- https://git.opnfv.org/functest/plain/functest/ci/download_images.sh | sh -s -- images && ls -1 images/*
+```
+images/cirros-0.6.1-aarch64-disk.img
+images/cirros-0.6.1-x86_64-disk.img
+images/cloudify-docker-manager-community-19.01.24.tar
+images/Fedora-Cloud-Base-30-1.2.x86_64.qcow2
+images/shaker-image-1.3.0+stretch.qcow2
+images/ubuntu-14.04-server-cloudimg-amd64-disk1.img
+images/ubuntu-14.04-server-cloudimg-arm64-uefi1.img
+images/ubuntu-16.04-server-cloudimg-amd64-disk1.img
+images/vyos-1.1.8-amd64.qcow2
+```
+
+## Run healthcheck suite
+
+```shell
+sudo docker run --env-file env \
+ -v $(pwd)/openstack.creds:/home/opnfv/functest/conf/env_file \
+ -v $(pwd)/images:/home/opnfv/functest/images \
+ opnfv/functest-healthcheck
+```
+
+```
++--------------------------+------------------+---------------------+------------------+----------------+
+| TEST CASE | PROJECT | TIER | DURATION | RESULT |
++--------------------------+------------------+---------------------+------------------+----------------+
+| connection_check | functest | healthcheck | 00:03 | PASS |
+| tenantnetwork1 | functest | healthcheck | 00:05 | PASS |
+| tenantnetwork2 | functest | healthcheck | 00:06 | PASS |
+| vmready1 | functest | healthcheck | 00:06 | PASS |
+| vmready2 | functest | healthcheck | 00:08 | PASS |
+| singlevm1 | functest | healthcheck | 00:32 | PASS |
+| singlevm2 | functest | healthcheck | 00:37 | PASS |
+| vping_ssh | functest | healthcheck | 00:46 | PASS |
+| vping_userdata | functest | healthcheck | 00:39 | PASS |
+| cinder_test | functest | healthcheck | 01:05 | PASS |
+| tempest_smoke | functest | healthcheck | 05:39 | PASS |
+| tempest_horizon | functest | healthcheck | 01:05 | PASS |
+| odl | functest | healthcheck | 00:00 | SKIP |
++--------------------------+------------------+---------------------+------------------+----------------+
+```
+
+## Run smoke suite
+
+```shell
+sudo docker run --env-file env \
+ -v $(pwd)/openstack.creds:/home/opnfv/functest/conf/env_file \
+ -v $(pwd)/images:/home/opnfv/functest/images \
+ opnfv/functest-smoke
+```
+
+```
++---------------------------+------------------+---------------+------------------+----------------+
+| TEST CASE | PROJECT | TIER | DURATION | RESULT |
++---------------------------+------------------+---------------+------------------+----------------+
+| tempest_neutron | functest | smoke | 15:30 | PASS |
+| tempest_cinder | functest | smoke | 02:01 | PASS |
+| tempest_keystone | functest | smoke | 01:17 | PASS |
+| tempest_heat | functest | smoke | 22:14 | PASS |
+| tempest_telemetry | functest | smoke | 00:00 | SKIP |
+| rally_sanity | functest | smoke | 17:24 | PASS |
+| refstack_compute | functest | smoke | 07:03 | PASS |
+| refstack_object | functest | smoke | 02:09 | PASS |
+| refstack_platform | functest | smoke | 07:31 | PASS |
+| tempest_full | functest | smoke | 41:52 | PASS |
+| tempest_scenario | functest | smoke | 08:42 | PASS |
+| tempest_slow | functest | smoke | 43:42 | PASS |
+| patrole_admin | functest | smoke | 21:06 | PASS |
+| patrole_member | functest | smoke | 21:23 | PASS |
+| patrole_reader | functest | smoke | 21:56 | PASS |
+| tempest_barbican | functest | smoke | 02:30 | PASS |
+| tempest_octavia | functest | smoke | 00:00 | SKIP |
+| tempest_cyborg | functest | smoke | 00:00 | SKIP |
++---------------------------+------------------+---------------+------------------+----------------+
+```
+
+## Run smoke CNTT suite
+
+```shell
+sudo docker run --env-file env \
+ -v $(pwd)/openstack.creds:/home/opnfv/functest/conf/env_file \
+ -v $(pwd)/images:/home/opnfv/functest/images \
+ opnfv/functest-smoke-cntt
+```
+
+```
++-------------------------------+------------------+---------------+------------------+----------------+
+| TEST CASE | PROJECT | TIER | DURATION | RESULT |
++-------------------------------+------------------+---------------+------------------+----------------+
+| tempest_neutron_cntt | functest | smoke | 11:35 | PASS |
+| tempest_cinder_cntt | functest | smoke | 01:58 | PASS |
+| tempest_keystone_cntt | functest | smoke | 01:13 | PASS |
+| tempest_heat_cntt | functest | smoke | 22:32 | PASS |
+| rally_sanity_cntt | functest | smoke | 17:16 | PASS |
+| tempest_full_cntt | functest | smoke | 41:13 | PASS |
+| tempest_scenario_cntt | functest | smoke | 08:57 | PASS |
+| tempest_slow_cntt | functest | smoke | 35:58 | PASS |
++-------------------------------+------------------+---------------+------------------+----------------+
+```
+
+## Run benchmarking suite
+
+```shell
+sudo docker run --env-file env \
+ -v $(pwd)/openstack.creds:/home/opnfv/functest/conf/env_file \
+ -v $(pwd)/images:/home/opnfv/functest/images \
+ opnfv/functest-benchmarking
+```
+
+```
++--------------------+------------------+----------------------+------------------+----------------+
+| TEST CASE | PROJECT | TIER | DURATION | RESULT |
++--------------------+------------------+----------------------+------------------+----------------+
+| rally_full | functest | benchmarking | 93:03 | PASS |
+| rally_jobs | functest | benchmarking | 27:05 | PASS |
+| vmtp | functest | benchmarking | 17:56 | PASS |
+| shaker | functest | benchmarking | 24:02 | PASS |
++--------------------+------------------+----------------------+------------------+----------------+
+```
+
+## Run benchmarking CNTT suite
+
+```shell
+sudo docker run --env-file env \
+ -v $(pwd)/openstack.creds:/home/opnfv/functest/conf/env_file \
+ -v $(pwd)/images:/home/opnfv/functest/images \
+ opnfv/functest-benchmarking-cntt
+```
+
+```
++-------------------------+------------------+----------------------+------------------+----------------+
+| TEST CASE | PROJECT | TIER | DURATION | RESULT |
++-------------------------+------------------+----------------------+------------------+----------------+
+| rally_full_cntt | functest | benchmarking | 89:52 | PASS |
+| rally_jobs_cntt | functest | benchmarking | 19:39 | PASS |
+| vmtp | functest | benchmarking | 16:59 | PASS |
+| shaker | functest | benchmarking | 23:43 | PASS |
++-------------------------+------------------+----------------------+------------------+----------------+
+```
+
+## Run vnf suite
+
+```shell
+sudo docker run --env-file env \
+ -v $(pwd)/openstack.creds:/home/opnfv/functest/conf/env_file \
+ -v $(pwd)/images:/home/opnfv/functest/images \
+ opnfv/functest-vnf
+```
+
+```
++----------------------+------------------+--------------+------------------+----------------+
+| TEST CASE | PROJECT | TIER | DURATION | RESULT |
++----------------------+------------------+--------------+------------------+----------------+
+| cloudify | functest | vnf | 05:08 | PASS |
+| cloudify_ims | functest | vnf | 24:46 | PASS |
+| heat_ims | functest | vnf | 33:12 | PASS |
+| vyos_vrouter | functest | vnf | 15:53 | PASS |
+| juju_epc | functest | vnf | 27:52 | PASS |
++----------------------+------------------+--------------+------------------+----------------+
+```
diff --git a/ansible/host_vars/127.0.0.1 b/ansible/host_vars/127.0.0.1
new file mode 100644
index 000000000..169b56b07
--- /dev/null
+++ b/ansible/host_vars/127.0.0.1
@@ -0,0 +1,5 @@
+docker_args:
+ env: {}
+ volumes:
+ - /home/opnfv/functest/openstack.creds:/home/opnfv/functest/conf/env_file
+ - /home/opnfv/functest/images:/home/opnfv/functest/images
diff --git a/ansible/site.cntt.yml b/ansible/site.cntt.yml
new file mode 100644
index 000000000..900f619f6
--- /dev/null
+++ b/ansible/site.cntt.yml
@@ -0,0 +1,48 @@
+---
+- hosts:
+ - 127.0.0.1
+ roles:
+ - role: collivier.xtesting
+ project: functest
+ suites:
+ - container: functest-healthcheck
+ tests:
+ - connection_check
+ - tenantnetwork1
+ - tenantnetwork2
+ - vmready1
+ - vmready2
+ - singlevm1
+ - singlevm2
+ - vping_ssh
+ - vping_userdata
+ - cinder_test
+ - odl
+ - tempest_smoke
+ - tempest_horizon
+ - container: functest-smoke-cntt
+ timeout: 2h
+ tests:
+ - tempest_neutron_cntt
+ - tempest_cinder_cntt
+ - tempest_keystone_cntt
+ - tempest_heat_cntt
+ - rally_sanity_cntt
+ - tempest_full_cntt
+ - tempest_scenario_cntt
+ - tempest_slow_cntt
+ - container: functest-benchmarking-cntt
+ timeout: 4h
+ tests:
+ - rally_full_cntt
+ - rally_jobs_cntt
+ - vmtp
+ - shaker
+ - container: functest-vnf
+ timeout: 2h
+ tests:
+ - cloudify
+ - cloudify_ims
+ - heat_ims
+ - vyos_vrouter
+ - juju_epc
diff --git a/ansible/site.gate.yml b/ansible/site.gate.yml
new file mode 100644
index 000000000..ed9ce7812
--- /dev/null
+++ b/ansible/site.gate.yml
@@ -0,0 +1,90 @@
+---
+- hosts:
+ - 127.0.0.1
+ roles:
+ - role: collivier.xtesting
+ project: functest
+ use_gerrit: true
+ gerrit_project: functest
+ git_url: https://gerrit.opnfv.org/gerrit/functest
+ docker_tags:
+ - latest:
+ branch: master
+ dependency: '3.16'
+ builds:
+ dependency:
+ repo: _
+ dport:
+ container: alpine
+ steps:
+ - name: build opnfv/functest-core
+ containers:
+ - name: functest-core
+ ref_arg: BRANCH
+ path: docker/core
+ - name: build containers
+ containers:
+ - name: functest-healthcheck
+ ref_arg: BRANCH
+ path: docker/healthcheck
+ - name: functest-smoke
+ ref_arg: BRANCH
+ path: docker/smoke
+ - name: functest-benchmarking
+ ref_arg: BRANCH
+ path: docker/benchmarking
+ - name: functest-vnf
+ ref_arg:
+ path: docker/vnf
+ suites:
+ - container: functest-healthcheck
+ tests:
+ - connection_check
+ - tenantnetwork1
+ - tenantnetwork2
+ - vmready1
+ - vmready2
+ - singlevm1
+ - singlevm2
+ - vping_ssh
+ - vping_userdata
+ - cinder_test
+ - odl
+ - tempest_smoke
+ - tempest_horizon
+ - container: functest-smoke
+ timeout: 2h
+ tests:
+ - tempest_neutron
+ - tempest_cinder
+ - tempest_keystone
+ - tempest_heat
+ - tempest_telemetry
+ - rally_sanity
+ - refstack_compute
+ - refstack_object
+ - refstack_platform
+ - tempest_full
+ - tempest_scenario
+ - tempest_slow
+ - patrole_admin
+ - patrole_member
+ - patrole_reader
+ - tempest_barbican
+ - tempest_octavia
+ - tempest_cyborg
+ - container: functest-benchmarking
+ timeout: 4h
+ tests:
+ - rally_full
+ - rally_jobs
+ - vmtp
+ - shaker
+ - container: functest-vnf
+ timeout: 2h
+ tests:
+ - cloudify
+ - cloudify_ims
+ - heat_ims
+ - vyos_vrouter
+ - juju_epc
diff --git a/ansible/site.yml b/ansible/site.yml
new file mode 100644
index 000000000..60a2b89e8
--- /dev/null
+++ b/ansible/site.yml
@@ -0,0 +1,58 @@
+---
+- hosts:
+ - 127.0.0.1
+ roles:
+ - role: collivier.xtesting
+ project: functest
+ suites:
+ - container: functest-healthcheck
+ tests:
+ - connection_check
+ - tenantnetwork1
+ - tenantnetwork2
+ - vmready1
+ - vmready2
+ - singlevm1
+ - singlevm2
+ - vping_ssh
+ - vping_userdata
+ - cinder_test
+ - odl
+ - tempest_smoke
+ - tempest_horizon
+ - container: functest-smoke
+ timeout: 2h
+ tests:
+ - tempest_neutron
+ - tempest_cinder
+ - tempest_keystone
+ - tempest_heat
+ - tempest_telemetry
+ - rally_sanity
+ - refstack_compute
+ - refstack_object
+ - refstack_platform
+ - tempest_full
+ - tempest_scenario
+ - tempest_slow
+ - patrole_admin
+ - patrole_member
+ - patrole_reader
+ - tempest_barbican
+ - tempest_octavia
+ - tempest_cyborg
+ - container: functest-benchmarking
+ timeout: 4h
+ tests:
+ - rally_full
+ - rally_jobs
+ - vmtp
+ - shaker
+ - container: functest-vnf
+ timeout: 2h
+ tests:
+ - cloudify
+ - cloudify_ims
+ - heat_ims
+ - vyos_vrouter
+ - juju_epc
diff --git a/api/apidoc/functest.core.cloudify.rst b/api/apidoc/functest.core.cloudify.rst
new file mode 100644
index 000000000..aa186afe7
--- /dev/null
+++ b/api/apidoc/functest.core.cloudify.rst
@@ -0,0 +1,7 @@
+functest.core.cloudify module
+=============================
+
+.. automodule:: functest.core.cloudify
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/api/apidoc/functest.core.rst b/api/apidoc/functest.core.rst
index c3aa54ecf..6d457c7f5 100644
--- a/api/apidoc/functest.core.rst
+++ b/api/apidoc/functest.core.rst
@@ -1,15 +1,19 @@
functest.core package
=====================
-.. automodule:: functest.core
- :members:
- :undoc-members:
- :show-inheritance:
-
Submodules
----------
.. toctree::
- functest.core.vnf
+ functest.core.cloudify
+ functest.core.singlevm
+ functest.core.tenantnetwork
+Module contents
+---------------
+
+.. automodule:: functest.core
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/api/apidoc/functest.core.singlevm.rst b/api/apidoc/functest.core.singlevm.rst
new file mode 100644
index 000000000..171a3fae5
--- /dev/null
+++ b/api/apidoc/functest.core.singlevm.rst
@@ -0,0 +1,7 @@
+functest.core.singlevm module
+=============================
+
+.. automodule:: functest.core.singlevm
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/api/apidoc/functest.core.tenantnetwork.rst b/api/apidoc/functest.core.tenantnetwork.rst
new file mode 100644
index 000000000..db1dbf8a3
--- /dev/null
+++ b/api/apidoc/functest.core.tenantnetwork.rst
@@ -0,0 +1,7 @@
+functest.core.tenantnetwork module
+==================================
+
+.. automodule:: functest.core.tenantnetwork
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/api/apidoc/functest.core.vnf.rst b/api/apidoc/functest.core.vnf.rst
deleted file mode 100644
index 9fd6b375c..000000000
--- a/api/apidoc/functest.core.vnf.rst
+++ /dev/null
@@ -1,7 +0,0 @@
-functest.core.vnf module
-========================
-
-.. automodule:: functest.core.vnf
- :members:
- :undoc-members:
- :show-inheritance:
diff --git a/api/apidoc/functest.opnfv_tests.openstack.api.connection_check.rst b/api/apidoc/functest.opnfv_tests.openstack.api.connection_check.rst
new file mode 100644
index 000000000..62e9e87a9
--- /dev/null
+++ b/api/apidoc/functest.opnfv_tests.openstack.api.connection_check.rst
@@ -0,0 +1,7 @@
+functest.opnfv\_tests.openstack.api.connection\_check module
+============================================================
+
+.. automodule:: functest.opnfv_tests.openstack.api.connection_check
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/api/apidoc/functest.opnfv_tests.openstack.api.rst b/api/apidoc/functest.opnfv_tests.openstack.api.rst
new file mode 100644
index 000000000..8f32cf8ee
--- /dev/null
+++ b/api/apidoc/functest.opnfv_tests.openstack.api.rst
@@ -0,0 +1,17 @@
+functest.opnfv\_tests.openstack.api package
+===========================================
+
+Submodules
+----------
+
+.. toctree::
+
+ functest.opnfv_tests.openstack.api.connection_check
+
+Module contents
+---------------
+
+.. automodule:: functest.opnfv_tests.openstack.api
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/api/apidoc/functest.opnfv_tests.openstack.cinder.cinder_test.rst b/api/apidoc/functest.opnfv_tests.openstack.cinder.cinder_test.rst
new file mode 100644
index 000000000..4f362cd22
--- /dev/null
+++ b/api/apidoc/functest.opnfv_tests.openstack.cinder.cinder_test.rst
@@ -0,0 +1,7 @@
+functest.opnfv\_tests.openstack.cinder.cinder\_test module
+==========================================================
+
+.. automodule:: functest.opnfv_tests.openstack.cinder.cinder_test
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/api/apidoc/functest.opnfv_tests.openstack.cinder.rst b/api/apidoc/functest.opnfv_tests.openstack.cinder.rst
new file mode 100644
index 000000000..58564dfc1
--- /dev/null
+++ b/api/apidoc/functest.opnfv_tests.openstack.cinder.rst
@@ -0,0 +1,17 @@
+functest.opnfv\_tests.openstack.cinder package
+==============================================
+
+Submodules
+----------
+
+.. toctree::
+
+ functest.opnfv_tests.openstack.cinder.cinder_test
+
+Module contents
+---------------
+
+.. automodule:: functest.opnfv_tests.openstack.cinder
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/api/apidoc/functest.opnfv_tests.openstack.patrole.patrole.rst b/api/apidoc/functest.opnfv_tests.openstack.patrole.patrole.rst
new file mode 100644
index 000000000..6477fe7a2
--- /dev/null
+++ b/api/apidoc/functest.opnfv_tests.openstack.patrole.patrole.rst
@@ -0,0 +1,7 @@
+functest.opnfv\_tests.openstack.patrole.patrole module
+======================================================
+
+.. automodule:: functest.opnfv_tests.openstack.patrole.patrole
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/api/apidoc/functest.opnfv_tests.openstack.patrole.rst b/api/apidoc/functest.opnfv_tests.openstack.patrole.rst
new file mode 100644
index 000000000..71138307b
--- /dev/null
+++ b/api/apidoc/functest.opnfv_tests.openstack.patrole.rst
@@ -0,0 +1,17 @@
+functest.opnfv\_tests.openstack.patrole package
+===============================================
+
+Submodules
+----------
+
+.. toctree::
+
+ functest.opnfv_tests.openstack.patrole.patrole
+
+Module contents
+---------------
+
+.. automodule:: functest.opnfv_tests.openstack.patrole
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/api/apidoc/functest.opnfv_tests.openstack.rally.rally.rst b/api/apidoc/functest.opnfv_tests.openstack.rally.rally.rst
new file mode 100644
index 000000000..480a5db46
--- /dev/null
+++ b/api/apidoc/functest.opnfv_tests.openstack.rally.rally.rst
@@ -0,0 +1,7 @@
+functest.opnfv\_tests.openstack.rally.rally module
+==================================================
+
+.. automodule:: functest.opnfv_tests.openstack.rally.rally
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/api/apidoc/functest.opnfv_tests.openstack.rally.rst b/api/apidoc/functest.opnfv_tests.openstack.rally.rst
new file mode 100644
index 000000000..b066607f5
--- /dev/null
+++ b/api/apidoc/functest.opnfv_tests.openstack.rally.rst
@@ -0,0 +1,17 @@
+functest.opnfv\_tests.openstack.rally package
+=============================================
+
+Submodules
+----------
+
+.. toctree::
+
+ functest.opnfv_tests.openstack.rally.rally
+
+Module contents
+---------------
+
+.. automodule:: functest.opnfv_tests.openstack.rally
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/api/apidoc/functest.opnfv_tests.openstack.refstack.refstack.rst b/api/apidoc/functest.opnfv_tests.openstack.refstack.refstack.rst
new file mode 100644
index 000000000..5e02e013c
--- /dev/null
+++ b/api/apidoc/functest.opnfv_tests.openstack.refstack.refstack.rst
@@ -0,0 +1,7 @@
+functest.opnfv\_tests.openstack.refstack.refstack module
+========================================================
+
+.. automodule:: functest.opnfv_tests.openstack.refstack.refstack
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/api/apidoc/functest.opnfv_tests.openstack.refstack.rst b/api/apidoc/functest.opnfv_tests.openstack.refstack.rst
new file mode 100644
index 000000000..fbc4844de
--- /dev/null
+++ b/api/apidoc/functest.opnfv_tests.openstack.refstack.rst
@@ -0,0 +1,17 @@
+functest.opnfv\_tests.openstack.refstack package
+================================================
+
+Submodules
+----------
+
+.. toctree::
+
+ functest.opnfv_tests.openstack.refstack.refstack
+
+Module contents
+---------------
+
+.. automodule:: functest.opnfv_tests.openstack.refstack
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/api/apidoc/functest.opnfv_tests.openstack.rst b/api/apidoc/functest.opnfv_tests.openstack.rst
new file mode 100644
index 000000000..2a59e8818
--- /dev/null
+++ b/api/apidoc/functest.opnfv_tests.openstack.rst
@@ -0,0 +1,25 @@
+functest.opnfv\_tests.openstack package
+=======================================
+
+Subpackages
+-----------
+
+.. toctree::
+
+ functest.opnfv_tests.openstack.api
+ functest.opnfv_tests.openstack.cinder
+ functest.opnfv_tests.openstack.patrole
+ functest.opnfv_tests.openstack.rally
+ functest.opnfv_tests.openstack.refstack
+ functest.opnfv_tests.openstack.shaker
+ functest.opnfv_tests.openstack.tempest
+ functest.opnfv_tests.openstack.vmtp
+ functest.opnfv_tests.openstack.vping
+
+Module contents
+---------------
+
+.. automodule:: functest.opnfv_tests.openstack
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/api/apidoc/functest.opnfv_tests.openstack.shaker.rst b/api/apidoc/functest.opnfv_tests.openstack.shaker.rst
new file mode 100644
index 000000000..ec347a952
--- /dev/null
+++ b/api/apidoc/functest.opnfv_tests.openstack.shaker.rst
@@ -0,0 +1,17 @@
+functest.opnfv\_tests.openstack.shaker package
+==============================================
+
+Submodules
+----------
+
+.. toctree::
+
+ functest.opnfv_tests.openstack.shaker.shaker
+
+Module contents
+---------------
+
+.. automodule:: functest.opnfv_tests.openstack.shaker
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/api/apidoc/functest.opnfv_tests.openstack.shaker.shaker.rst b/api/apidoc/functest.opnfv_tests.openstack.shaker.shaker.rst
new file mode 100644
index 000000000..7035b816b
--- /dev/null
+++ b/api/apidoc/functest.opnfv_tests.openstack.shaker.shaker.rst
@@ -0,0 +1,7 @@
+functest.opnfv\_tests.openstack.shaker.shaker module
+====================================================
+
+.. automodule:: functest.opnfv_tests.openstack.shaker.shaker
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/api/apidoc/functest.opnfv_tests.openstack.tempest.rst b/api/apidoc/functest.opnfv_tests.openstack.tempest.rst
new file mode 100644
index 000000000..e1a7a774a
--- /dev/null
+++ b/api/apidoc/functest.opnfv_tests.openstack.tempest.rst
@@ -0,0 +1,17 @@
+functest.opnfv\_tests.openstack.tempest package
+===============================================
+
+Submodules
+----------
+
+.. toctree::
+
+ functest.opnfv_tests.openstack.tempest.tempest
+
+Module contents
+---------------
+
+.. automodule:: functest.opnfv_tests.openstack.tempest
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/api/apidoc/functest.opnfv_tests.openstack.tempest.tempest.rst b/api/apidoc/functest.opnfv_tests.openstack.tempest.tempest.rst
new file mode 100644
index 000000000..ad60f3ee3
--- /dev/null
+++ b/api/apidoc/functest.opnfv_tests.openstack.tempest.tempest.rst
@@ -0,0 +1,7 @@
+functest.opnfv\_tests.openstack.tempest.tempest module
+======================================================
+
+.. automodule:: functest.opnfv_tests.openstack.tempest.tempest
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/api/apidoc/functest.opnfv_tests.openstack.vmtp.rst b/api/apidoc/functest.opnfv_tests.openstack.vmtp.rst
new file mode 100644
index 000000000..50f558f45
--- /dev/null
+++ b/api/apidoc/functest.opnfv_tests.openstack.vmtp.rst
@@ -0,0 +1,17 @@
+functest.opnfv\_tests.openstack.vmtp package
+============================================
+
+Submodules
+----------
+
+.. toctree::
+
+ functest.opnfv_tests.openstack.vmtp.vmtp
+
+Module contents
+---------------
+
+.. automodule:: functest.opnfv_tests.openstack.vmtp
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/api/apidoc/functest.opnfv_tests.openstack.vmtp.vmtp.rst b/api/apidoc/functest.opnfv_tests.openstack.vmtp.vmtp.rst
new file mode 100644
index 000000000..c6c53d86b
--- /dev/null
+++ b/api/apidoc/functest.opnfv_tests.openstack.vmtp.vmtp.rst
@@ -0,0 +1,7 @@
+functest.opnfv\_tests.openstack.vmtp.vmtp module
+================================================
+
+.. automodule:: functest.opnfv_tests.openstack.vmtp.vmtp
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/api/apidoc/functest.opnfv_tests.openstack.vping.rst b/api/apidoc/functest.opnfv_tests.openstack.vping.rst
new file mode 100644
index 000000000..3b8983697
--- /dev/null
+++ b/api/apidoc/functest.opnfv_tests.openstack.vping.rst
@@ -0,0 +1,18 @@
+functest.opnfv\_tests.openstack.vping package
+=============================================
+
+Submodules
+----------
+
+.. toctree::
+
+ functest.opnfv_tests.openstack.vping.vping_ssh
+ functest.opnfv_tests.openstack.vping.vping_userdata
+
+Module contents
+---------------
+
+.. automodule:: functest.opnfv_tests.openstack.vping
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/api/apidoc/functest.opnfv_tests.openstack.vping.vping_ssh.rst b/api/apidoc/functest.opnfv_tests.openstack.vping.vping_ssh.rst
new file mode 100644
index 000000000..192cbfb8f
--- /dev/null
+++ b/api/apidoc/functest.opnfv_tests.openstack.vping.vping_ssh.rst
@@ -0,0 +1,7 @@
+functest.opnfv\_tests.openstack.vping.vping\_ssh module
+=======================================================
+
+.. automodule:: functest.opnfv_tests.openstack.vping.vping_ssh
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/api/apidoc/functest.opnfv_tests.openstack.vping.vping_userdata.rst b/api/apidoc/functest.opnfv_tests.openstack.vping.vping_userdata.rst
new file mode 100644
index 000000000..66a2f35d8
--- /dev/null
+++ b/api/apidoc/functest.opnfv_tests.openstack.vping.vping_userdata.rst
@@ -0,0 +1,7 @@
+functest.opnfv\_tests.openstack.vping.vping\_userdata module
+============================================================
+
+.. automodule:: functest.opnfv_tests.openstack.vping.vping_userdata
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/api/apidoc/functest.opnfv_tests.rst b/api/apidoc/functest.opnfv_tests.rst
index 52c2d4598..7d50b4db3 100644
--- a/api/apidoc/functest.opnfv_tests.rst
+++ b/api/apidoc/functest.opnfv_tests.rst
@@ -1,14 +1,19 @@
-functest.opnfv_tests package
-============================
-
-.. automodule:: functest.opnfv_tests
- :members:
- :undoc-members:
- :show-inheritance:
+functest.opnfv\_tests package
+=============================
Subpackages
-----------
.. toctree::
+ functest.opnfv_tests.openstack
functest.opnfv_tests.sdn
+ functest.opnfv_tests.vnf
+
+Module contents
+---------------
+
+.. automodule:: functest.opnfv_tests
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/api/apidoc/functest.opnfv_tests.sdn.odl.odl.rst b/api/apidoc/functest.opnfv_tests.sdn.odl.odl.rst
index e6f8c7367..caca46c67 100644
--- a/api/apidoc/functest.opnfv_tests.sdn.odl.odl.rst
+++ b/api/apidoc/functest.opnfv_tests.sdn.odl.odl.rst
@@ -1,5 +1,5 @@
-functest.opnfv_tests.sdn.odl.odl module
-=======================================
+functest.opnfv\_tests.sdn.odl.odl module
+========================================
.. automodule:: functest.opnfv_tests.sdn.odl.odl
:members:
diff --git a/api/apidoc/functest.opnfv_tests.sdn.odl.rst b/api/apidoc/functest.opnfv_tests.sdn.odl.rst
index 60659a1e3..3c1e85fcf 100644
--- a/api/apidoc/functest.opnfv_tests.sdn.odl.rst
+++ b/api/apidoc/functest.opnfv_tests.sdn.odl.rst
@@ -1,10 +1,5 @@
-functest.opnfv_tests.sdn.odl package
-====================================
-
-.. automodule:: functest.opnfv_tests.sdn.odl
- :members:
- :undoc-members:
- :show-inheritance:
+functest.opnfv\_tests.sdn.odl package
+=====================================
Submodules
----------
@@ -13,3 +8,10 @@ Submodules
functest.opnfv_tests.sdn.odl.odl
+Module contents
+---------------
+
+.. automodule:: functest.opnfv_tests.sdn.odl
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/api/apidoc/functest.opnfv_tests.sdn.rst b/api/apidoc/functest.opnfv_tests.sdn.rst
index ca8ae77da..cdec4291e 100644
--- a/api/apidoc/functest.opnfv_tests.sdn.rst
+++ b/api/apidoc/functest.opnfv_tests.sdn.rst
@@ -1,10 +1,5 @@
-functest.opnfv_tests.sdn package
-================================
-
-.. automodule:: functest.opnfv_tests.sdn
- :members:
- :undoc-members:
- :show-inheritance:
+functest.opnfv\_tests.sdn package
+=================================
Subpackages
-----------
@@ -12,3 +7,11 @@ Subpackages
.. toctree::
functest.opnfv_tests.sdn.odl
+
+Module contents
+---------------
+
+.. automodule:: functest.opnfv_tests.sdn
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/api/apidoc/functest.opnfv_tests.vnf.epc.juju_epc.rst b/api/apidoc/functest.opnfv_tests.vnf.epc.juju_epc.rst
new file mode 100644
index 000000000..59f4d586c
--- /dev/null
+++ b/api/apidoc/functest.opnfv_tests.vnf.epc.juju_epc.rst
@@ -0,0 +1,7 @@
+functest.opnfv\_tests.vnf.epc.juju\_epc module
+==============================================
+
+.. automodule:: functest.opnfv_tests.vnf.epc.juju_epc
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/api/apidoc/functest.opnfv_tests.vnf.epc.rst b/api/apidoc/functest.opnfv_tests.vnf.epc.rst
new file mode 100644
index 000000000..13f9886ef
--- /dev/null
+++ b/api/apidoc/functest.opnfv_tests.vnf.epc.rst
@@ -0,0 +1,17 @@
+functest.opnfv\_tests.vnf.epc package
+=====================================
+
+Submodules
+----------
+
+.. toctree::
+
+ functest.opnfv_tests.vnf.epc.juju_epc
+
+Module contents
+---------------
+
+.. automodule:: functest.opnfv_tests.vnf.epc
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/api/apidoc/functest.opnfv_tests.vnf.ims.clearwater.rst b/api/apidoc/functest.opnfv_tests.vnf.ims.clearwater.rst
new file mode 100644
index 000000000..82ed81dbc
--- /dev/null
+++ b/api/apidoc/functest.opnfv_tests.vnf.ims.clearwater.rst
@@ -0,0 +1,7 @@
+functest.opnfv\_tests.vnf.ims.clearwater module
+===============================================
+
+.. automodule:: functest.opnfv_tests.vnf.ims.clearwater
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/api/apidoc/functest.opnfv_tests.vnf.ims.cloudify_ims.rst b/api/apidoc/functest.opnfv_tests.vnf.ims.cloudify_ims.rst
new file mode 100644
index 000000000..9c32d7d16
--- /dev/null
+++ b/api/apidoc/functest.opnfv_tests.vnf.ims.cloudify_ims.rst
@@ -0,0 +1,7 @@
+functest.opnfv\_tests.vnf.ims.cloudify\_ims module
+==================================================
+
+.. automodule:: functest.opnfv_tests.vnf.ims.cloudify_ims
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/api/apidoc/functest.opnfv_tests.vnf.ims.heat_ims.rst b/api/apidoc/functest.opnfv_tests.vnf.ims.heat_ims.rst
new file mode 100644
index 000000000..21cdc46db
--- /dev/null
+++ b/api/apidoc/functest.opnfv_tests.vnf.ims.heat_ims.rst
@@ -0,0 +1,7 @@
+functest.opnfv\_tests.vnf.ims.heat\_ims module
+==============================================
+
+.. automodule:: functest.opnfv_tests.vnf.ims.heat_ims
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/api/apidoc/functest.opnfv_tests.vnf.ims.rst b/api/apidoc/functest.opnfv_tests.vnf.ims.rst
new file mode 100644
index 000000000..cce1944af
--- /dev/null
+++ b/api/apidoc/functest.opnfv_tests.vnf.ims.rst
@@ -0,0 +1,19 @@
+functest.opnfv\_tests.vnf.ims package
+=====================================
+
+Submodules
+----------
+
+.. toctree::
+
+ functest.opnfv_tests.vnf.ims.clearwater
+ functest.opnfv_tests.vnf.ims.cloudify_ims
+ functest.opnfv_tests.vnf.ims.heat_ims
+
+Module contents
+---------------
+
+.. automodule:: functest.opnfv_tests.vnf.ims
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/api/apidoc/functest.opnfv_tests.vnf.router.cloudify_vrouter.rst b/api/apidoc/functest.opnfv_tests.vnf.router.cloudify_vrouter.rst
new file mode 100644
index 000000000..2e265716e
--- /dev/null
+++ b/api/apidoc/functest.opnfv_tests.vnf.router.cloudify_vrouter.rst
@@ -0,0 +1,7 @@
+functest.opnfv\_tests.vnf.router.cloudify\_vrouter module
+=========================================================
+
+.. automodule:: functest.opnfv_tests.vnf.router.cloudify_vrouter
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/api/apidoc/functest.opnfv_tests.vnf.router.rst b/api/apidoc/functest.opnfv_tests.vnf.router.rst
new file mode 100644
index 000000000..de5ae5743
--- /dev/null
+++ b/api/apidoc/functest.opnfv_tests.vnf.router.rst
@@ -0,0 +1,27 @@
+functest.opnfv\_tests.vnf.router package
+========================================
+
+Subpackages
+-----------
+
+.. toctree::
+
+ functest.opnfv_tests.vnf.router.test_controller
+ functest.opnfv_tests.vnf.router.vnf_controller
+
+Submodules
+----------
+
+.. toctree::
+
+ functest.opnfv_tests.vnf.router.cloudify_vrouter
+ functest.opnfv_tests.vnf.router.utilvnf
+ functest.opnfv_tests.vnf.router.vrouter_base
+
+Module contents
+---------------
+
+.. automodule:: functest.opnfv_tests.vnf.router
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/api/apidoc/functest.opnfv_tests.vnf.router.test_controller.function_test_exec.rst b/api/apidoc/functest.opnfv_tests.vnf.router.test_controller.function_test_exec.rst
new file mode 100644
index 000000000..612314e21
--- /dev/null
+++ b/api/apidoc/functest.opnfv_tests.vnf.router.test_controller.function_test_exec.rst
@@ -0,0 +1,7 @@
+functest.opnfv\_tests.vnf.router.test\_controller.function\_test\_exec module
+=============================================================================
+
+.. automodule:: functest.opnfv_tests.vnf.router.test_controller.function_test_exec
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/api/apidoc/functest.opnfv_tests.vnf.router.test_controller.rst b/api/apidoc/functest.opnfv_tests.vnf.router.test_controller.rst
new file mode 100644
index 000000000..a3194e1dc
--- /dev/null
+++ b/api/apidoc/functest.opnfv_tests.vnf.router.test_controller.rst
@@ -0,0 +1,17 @@
+functest.opnfv\_tests.vnf.router.test\_controller package
+=========================================================
+
+Submodules
+----------
+
+.. toctree::
+
+ functest.opnfv_tests.vnf.router.test_controller.function_test_exec
+
+Module contents
+---------------
+
+.. automodule:: functest.opnfv_tests.vnf.router.test_controller
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/api/apidoc/functest.opnfv_tests.vnf.router.utilvnf.rst b/api/apidoc/functest.opnfv_tests.vnf.router.utilvnf.rst
new file mode 100644
index 000000000..06571a085
--- /dev/null
+++ b/api/apidoc/functest.opnfv_tests.vnf.router.utilvnf.rst
@@ -0,0 +1,7 @@
+functest.opnfv\_tests.vnf.router.utilvnf module
+===============================================
+
+.. automodule:: functest.opnfv_tests.vnf.router.utilvnf
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/api/apidoc/functest.opnfv_tests.vnf.router.vnf_controller.checker.rst b/api/apidoc/functest.opnfv_tests.vnf.router.vnf_controller.checker.rst
new file mode 100644
index 000000000..6759dd7ec
--- /dev/null
+++ b/api/apidoc/functest.opnfv_tests.vnf.router.vnf_controller.checker.rst
@@ -0,0 +1,7 @@
+functest.opnfv\_tests.vnf.router.vnf\_controller.checker module
+===============================================================
+
+.. automodule:: functest.opnfv_tests.vnf.router.vnf_controller.checker
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/api/apidoc/functest.opnfv_tests.vnf.router.vnf_controller.command_generator.rst b/api/apidoc/functest.opnfv_tests.vnf.router.vnf_controller.command_generator.rst
new file mode 100644
index 000000000..869b34e65
--- /dev/null
+++ b/api/apidoc/functest.opnfv_tests.vnf.router.vnf_controller.command_generator.rst
@@ -0,0 +1,7 @@
+functest.opnfv\_tests.vnf.router.vnf\_controller.command\_generator module
+==========================================================================
+
+.. automodule:: functest.opnfv_tests.vnf.router.vnf_controller.command_generator
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/api/apidoc/functest.opnfv_tests.vnf.router.vnf_controller.rst b/api/apidoc/functest.opnfv_tests.vnf.router.vnf_controller.rst
new file mode 100644
index 000000000..3f0ef5ac8
--- /dev/null
+++ b/api/apidoc/functest.opnfv_tests.vnf.router.vnf_controller.rst
@@ -0,0 +1,21 @@
+functest.opnfv\_tests.vnf.router.vnf\_controller package
+========================================================
+
+Submodules
+----------
+
+.. toctree::
+
+ functest.opnfv_tests.vnf.router.vnf_controller.checker
+ functest.opnfv_tests.vnf.router.vnf_controller.command_generator
+ functest.opnfv_tests.vnf.router.vnf_controller.ssh_client
+ functest.opnfv_tests.vnf.router.vnf_controller.vm_controller
+ functest.opnfv_tests.vnf.router.vnf_controller.vnf_controller
+
+Module contents
+---------------
+
+.. automodule:: functest.opnfv_tests.vnf.router.vnf_controller
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/api/apidoc/functest.opnfv_tests.vnf.router.vnf_controller.ssh_client.rst b/api/apidoc/functest.opnfv_tests.vnf.router.vnf_controller.ssh_client.rst
new file mode 100644
index 000000000..2f330a208
--- /dev/null
+++ b/api/apidoc/functest.opnfv_tests.vnf.router.vnf_controller.ssh_client.rst
@@ -0,0 +1,7 @@
+functest.opnfv\_tests.vnf.router.vnf\_controller.ssh\_client module
+===================================================================
+
+.. automodule:: functest.opnfv_tests.vnf.router.vnf_controller.ssh_client
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/api/apidoc/functest.opnfv_tests.vnf.router.vnf_controller.vm_controller.rst b/api/apidoc/functest.opnfv_tests.vnf.router.vnf_controller.vm_controller.rst
new file mode 100644
index 000000000..d30b754a9
--- /dev/null
+++ b/api/apidoc/functest.opnfv_tests.vnf.router.vnf_controller.vm_controller.rst
@@ -0,0 +1,7 @@
+functest.opnfv\_tests.vnf.router.vnf\_controller.vm\_controller module
+======================================================================
+
+.. automodule:: functest.opnfv_tests.vnf.router.vnf_controller.vm_controller
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/api/apidoc/functest.opnfv_tests.vnf.router.vnf_controller.vnf_controller.rst b/api/apidoc/functest.opnfv_tests.vnf.router.vnf_controller.vnf_controller.rst
new file mode 100644
index 000000000..8d799373f
--- /dev/null
+++ b/api/apidoc/functest.opnfv_tests.vnf.router.vnf_controller.vnf_controller.rst
@@ -0,0 +1,7 @@
+functest.opnfv\_tests.vnf.router.vnf\_controller.vnf\_controller module
+=======================================================================
+
+.. automodule:: functest.opnfv_tests.vnf.router.vnf_controller.vnf_controller
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/api/apidoc/functest.opnfv_tests.vnf.router.vrouter_base.rst b/api/apidoc/functest.opnfv_tests.vnf.router.vrouter_base.rst
new file mode 100644
index 000000000..eb766389e
--- /dev/null
+++ b/api/apidoc/functest.opnfv_tests.vnf.router.vrouter_base.rst
@@ -0,0 +1,7 @@
+functest.opnfv\_tests.vnf.router.vrouter\_base module
+=====================================================
+
+.. automodule:: functest.opnfv_tests.vnf.router.vrouter_base
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/api/apidoc/functest.opnfv_tests.vnf.rst b/api/apidoc/functest.opnfv_tests.vnf.rst
new file mode 100644
index 000000000..07eb49003
--- /dev/null
+++ b/api/apidoc/functest.opnfv_tests.vnf.rst
@@ -0,0 +1,19 @@
+functest.opnfv\_tests.vnf package
+=================================
+
+Subpackages
+-----------
+
+.. toctree::
+
+ functest.opnfv_tests.vnf.epc
+ functest.opnfv_tests.vnf.ims
+ functest.opnfv_tests.vnf.router
+
+Module contents
+---------------
+
+.. automodule:: functest.opnfv_tests.vnf
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/api/apidoc/functest.rst b/api/apidoc/functest.rst
index 63860f8f3..e6eb5189c 100644
--- a/api/apidoc/functest.rst
+++ b/api/apidoc/functest.rst
@@ -1,11 +1,6 @@
functest package
================
-.. automodule:: functest
- :members:
- :undoc-members:
- :show-inheritance:
-
Subpackages
-----------
@@ -13,3 +8,12 @@ Subpackages
functest.core
functest.opnfv_tests
+ functest.utils
+
+Module contents
+---------------
+
+.. automodule:: functest
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/api/apidoc/functest.utils.config.rst b/api/apidoc/functest.utils.config.rst
new file mode 100644
index 000000000..5ea6e8982
--- /dev/null
+++ b/api/apidoc/functest.utils.config.rst
@@ -0,0 +1,7 @@
+functest.utils.config module
+============================
+
+.. automodule:: functest.utils.config
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/api/apidoc/functest.utils.constants.rst b/api/apidoc/functest.utils.constants.rst
new file mode 100644
index 000000000..b2c17a59f
--- /dev/null
+++ b/api/apidoc/functest.utils.constants.rst
@@ -0,0 +1,7 @@
+functest.utils.constants module
+===============================
+
+.. automodule:: functest.utils.constants
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/api/apidoc/functest.utils.env.rst b/api/apidoc/functest.utils.env.rst
new file mode 100644
index 000000000..cbcb3d6b0
--- /dev/null
+++ b/api/apidoc/functest.utils.env.rst
@@ -0,0 +1,7 @@
+functest.utils.env module
+=========================
+
+.. automodule:: functest.utils.env
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/api/apidoc/functest.utils.functest_utils.rst b/api/apidoc/functest.utils.functest_utils.rst
new file mode 100644
index 000000000..73e33f34d
--- /dev/null
+++ b/api/apidoc/functest.utils.functest_utils.rst
@@ -0,0 +1,7 @@
+functest.utils.functest\_utils module
+=====================================
+
+.. automodule:: functest.utils.functest_utils
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/api/apidoc/functest.utils.rst b/api/apidoc/functest.utils.rst
new file mode 100644
index 000000000..716a11937
--- /dev/null
+++ b/api/apidoc/functest.utils.rst
@@ -0,0 +1,20 @@
+functest.utils package
+======================
+
+Submodules
+----------
+
+.. toctree::
+
+ functest.utils.config
+ functest.utils.constants
+ functest.utils.env
+ functest.utils.functest_utils
+
+Module contents
+---------------
+
+.. automodule:: functest.utils
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/api/requirements.txt b/api/requirements.txt
deleted file mode 100644
index 592575e92..000000000
--- a/api/requirements.txt
+++ /dev/null
@@ -1,37 +0,0 @@
-pbr!=2.1.0,>=2.0.0 # Apache-2.0
-PyYAML>=3.10.0 # MIT
-GitPython>=1.0.1 # BSD License (3 clause)
-requests>=2.14.2 # Apache-2.0
-robotframework>=3.0
-scp
-dnspython>=1.14.0;python_version=='2.7' # http://www.dnspython.org/LICENSE
-dnspython3!=1.13.0,!=1.14.0,>=1.12.0;python_version>='3.0' # http://www.dnspython.org/LICENSE
-click
-openbaton-cli
-cloudify-rest-client
-Flask!=0.11,<1.0,>=0.10 # BSD
-Flask-RESTful>=0.3.5 # BSD
-IPy
-flasgger # MIT
-mock>=2.0 # BSD
-PrettyTable<0.8,>=0.7.1 # BSD
-six>=1.9.0 # MIT
-SQLAlchemy!=1.1.5,!=1.1.6,!=1.1.7,!=1.1.8,>=1.0.10 # MIT
-paramiko>=2.0 # LGPLv2.1+
-Jinja2!=2.9.0,!=2.9.1,!=2.9.2,!=2.9.3,!=2.9.4,>=2.8 # BSD License (3 clause)
-httplib2>=0.7.5 # MIT
-oslo.serialization!=2.19.1,>=1.10.0 # Apache-2.0
-oslo.utils>=3.20.0 # Apache-2.0
-xtesting
-git+https://gerrit.opnfv.org/gerrit/snaps#egg=snaps
-git+https://github.com/openstack/refstack-client@a59189eaacda24b787ecb65e6634257beba361ec#egg=refstack-client
-coverage!=4.4,>=4.0 # Apache-2.0
-mock>=2.0 # BSD
-nose # LGPL
-flake8<2.6.0,>=2.5.4 # MIT
-pylint==1.4.5 # GPLv2
-sphinx>=1.6.2 # BSD
-sphinx-opnfv-theme
-sphinx-rtd-theme
-yamllint
-doc8
diff --git a/build.sh b/build.sh
index 563d25248..033d31310 100644
--- a/build.sh
+++ b/build.sh
@@ -1,4 +1,4 @@
-#!/bin/bash
+#!/bin/sh
set -e
@@ -7,30 +7,73 @@ amd64_dirs=${amd64_dirs-"\
docker/core \
docker/healthcheck \
docker/smoke \
-docker/features \
-docker/components \
+docker/benchmarking \
docker/vnf \
-docker/parser"}
+docker/smoke-cntt \
+docker/benchmarking-cntt"}
+arm_dirs=${arm_dirs-${amd64_dirs}}
arm64_dirs=${arm64_dirs-${amd64_dirs}}
-build_opts=(--pull=true --no-cache --force-rm=true)
+build_opts="--pull=true --no-cache --force-rm=true"
-find . -name Dockerfile -exec sed -i -e "s|opnfv/functest-core|${repo}/functest-core:amd64-latest|g" {} +
+find . -name Dockerfile -exec sed -i \
+ -e "s|opnfv/functest-core|${repo}/functest-core:amd64-latest|g" {} +
+find . -name Dockerfile -exec sed -i \
+ -e "s|opnfv/functest-smoke|${repo}/functest-smoke:amd64-latest|g" {} +
+find . -name Dockerfile -exec sed -i \
+ -e "s|opnfv/functest-benchmarking|\
+${repo}/functest-benchmarking:amd64-latest|g" {} +
for dir in ${amd64_dirs}; do
- (cd "${dir}" && docker build "${build_opts[@]}" -t "${repo}/functest-${dir##**/}:amd64-latest" .)
- docker push "${repo}/functest-${dir##**/}:amd64-latest"
- [ "${dir}" != "docker/core" ] && (docker rmi "${repo}/functest-${dir##**/}:amd64-latest" || true)
+ (cd "${dir}" &&
+ docker build $build_opts \
+ -t "${repo}/functest-${dir##**/}:amd64-latest" .)
+ docker push "${repo}/functest-${dir##**/}:amd64-latest"
+ [ "${dir}" != "docker/core" ] &&
+ (docker rmi "${repo}/functest-${dir##**/}:amd64-latest" || true)
done
-[ ! -z "${amd64_dirs}" ] && (docker rmi "${repo}/functest-core:amd64-latest" alpine:3.7 || true)
+[ -n "${amd64_dirs}" ] &&
+ (docker rmi "${repo}/functest-core:amd64-latest" alpine:3.16 || true)
find . -name Dockerfile -exec git checkout {} +
-find . -name Dockerfile -exec sed -i -e "s|alpine:3.7|multiarch/alpine:arm64-v3.7|g" {} +
-find . -name Dockerfile -exec sed -i -e "s|opnfv/functest-core|${repo}/functest-core:arm64-latest|g" {} +
+find . -name Dockerfile -exec sed -i \
+ -e "s|alpine:3.16|arm64v8/alpine:3.16|g" {} +
+find . -name Dockerfile -exec sed -i \
+ -e "s|opnfv/functest-core|${repo}/functest-core:arm64-latest|g" {} +
+find . -name Dockerfile -exec sed -i \
+ -e "s|opnfv/functest-smoke|${repo}/functest-smoke:arm64-latest|g" {} +
+find . -name Dockerfile -exec sed -i \
+ -e "s|opnfv/functest-benchmarking|\
+${repo}/functest-benchmarking:arm64-latest|g" {} +
for dir in ${arm64_dirs}; do
- (cd "${dir}" && docker build "${build_opts[@]}" -t "${repo}/functest-${dir##**/}:arm64-latest" .)
+ (cd "${dir}" && docker build $build_opts \
+ -t "${repo}/functest-${dir##**/}:arm64-latest" .)
docker push "${repo}/functest-${dir##**/}:arm64-latest"
- [ "${dir}" != "docker/core" ] && (docker rmi "${repo}/functest-${dir##**/}:arm64-latest" || true)
+ [ "${dir}" != "docker/core" ] &&
+ (docker rmi "${repo}/functest-${dir##**/}:arm64-latest" || true)
done
-[ ! -z "${arm64_dirs}" ] && (docker rmi "${repo}/functest-core:arm64-latest" multiarch/alpine:arm64-v3.7 || true)
+[ -n "${arm64_dirs}" ] &&
+ (docker rmi "${repo}/functest-core:arm64-latest" \
+ arm64v8/alpine:3.16 || true)
+find . -name Dockerfile -exec git checkout {} +
+
+find . -name Dockerfile -exec sed -i \
+ -e "s|alpine:3.16|arm32v6/alpine:3.16|g" {} +
+find . -name Dockerfile -exec sed -i \
+ -e "s|opnfv/functest-core|${repo}/functest-core:arm-latest|g" {} +
+find . -name Dockerfile -exec sed -i \
+ -e "s|opnfv/functest-smoke|${repo}/functest-smoke:arm-latest|g" {} +
+find . -name Dockerfile -exec sed -i \
+ -e "s|opnfv/functest-benchmarking|\
+${repo}/functest-benchmarking:arm-latest|g" {} +
+for dir in ${arm_dirs}; do
+ (cd "${dir}" && docker build $build_opts \
+ -t "${repo}/functest-${dir##**/}:arm-latest" .)
+ docker push "${repo}/functest-${dir##**/}:arm-latest"
+ [ "${dir}" != "docker/core" ] &&
+ (docker rmi "${repo}/functest-${dir##**/}:arm-latest" || true)
+done
+[ -n "${arm_dirs}" ] &&
+ (docker rmi "${repo}/functest-core:arm-latest" \
+ arm32v6/alpine:3.16 || true)
find . -name Dockerfile -exec git checkout {} +
exit $?
diff --git a/commons/traffic-profile-guidelines.rst b/commons/traffic-profile-guidelines.rst
index 0b965b156..9619af6eb 100644
--- a/commons/traffic-profile-guidelines.rst
+++ b/commons/traffic-profile-guidelines.rst
@@ -11,11 +11,11 @@ Introduction
------------
In order to have consistent testing profiles, it has been suggested to define and store traffic profiles.
-These profiles shall be based on operator representative scenario.
+These profiles shall be based on operator representative scenario.
-These reference profiles may be used by any test projects, unitary, functional or performance tests.
-It is possible to adapt them to specific testcases.
-It is recommended to use them in order to avoid getting as many profiles as tests.
+These reference profiles may be used by any test projects, unitary, functional or performance tests.
+It is possible to adapt them to specific testcases.
+It is recommended to use them in order to avoid getting as many profiles as tests.
It should be helpful to compare the results of test scenario.
.. _howto:
diff --git a/docker/benchmarking-cntt/Dockerfile b/docker/benchmarking-cntt/Dockerfile
new file mode 100644
index 000000000..46acaa036
--- /dev/null
+++ b/docker/benchmarking-cntt/Dockerfile
@@ -0,0 +1,5 @@
+FROM opnfv/functest-benchmarking
+
+COPY testcases.yaml /etc/xtesting/testcases.yaml
+COPY blacklist.yaml /src/functest/functest/opnfv_tests/openstack/rally/blacklist.yaml
+CMD ["run_tests", "-t", "all"]
diff --git a/docker/benchmarking-cntt/blacklist.yaml b/docker/benchmarking-cntt/blacklist.yaml
new file mode 100644
index 000000000..7ef906df6
--- /dev/null
+++ b/docker/benchmarking-cntt/blacklist.yaml
@@ -0,0 +1,48 @@
+---
+scenario:
+ -
+ scenarios:
+ - '^os-'
+ tests:
+ - 'NeutronNetworks.associate_and_dissociate_floating_ips'
+ - 'NeutronNetworks.create_and_bind_ports'
+ - 'NeutronNetworks.create_and_delete_floating_ips'
+ - 'NeutronNetworks.create_and_list_floating_ips'
+ - 'NeutronSecurityGroup.create_and_delete_security_group_rule'
+ - 'NeutronSecurityGroup.create_and_delete_security_groups'
+ - 'NeutronSecurityGroup.create_and_list_security_group_rules'
+ - 'NeutronSecurityGroup.create_and_list_security_groups'
+ - 'NeutronSecurityGroup.create_and_show_security_group'
+ - 'NeutronSecurityGroup.create_and_show_security_group_rule'
+ - 'NeutronSecurityGroup.create_and_update_security_groups'
+ - 'NovaServers.boot_and_delete_server'
+
+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_associate_and_dissociate_floating_ip
+ - NeutronNetworks.create_and_delete_floating_ips
+ - NeutronNetworks.create_and_list_floating_ips
+ - NeutronNetworks.associate_and_dissociate_floating_ips
diff --git a/docker/benchmarking-cntt/testcases.yaml b/docker/benchmarking-cntt/testcases.yaml
new file mode 100644
index 000000000..30eb3e631
--- /dev/null
+++ b/docker/benchmarking-cntt/testcases.yaml
@@ -0,0 +1,67 @@
+---
+tiers:
+ -
+ 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'
+ -
+ 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
+ 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.
+ run:
+ name: shaker
diff --git a/docker/benchmarking/Dockerfile b/docker/benchmarking/Dockerfile
new file mode 100644
index 000000000..d0957f6b8
--- /dev/null
+++ b/docker/benchmarking/Dockerfile
@@ -0,0 +1,30 @@
+FROM opnfv/functest-core
+
+ARG VMTP_TAG=34a82c9f3598ec7f5d8de0a6d5139b92931db4cc
+ARG NEUTRON_TAG=master
+
+RUN apk --no-cache add --update libxml2 libxslt && \
+ apk --no-cache add --virtual .build-deps --update \
+ python3-dev build-base linux-headers libffi-dev \
+ openssl-dev libjpeg-turbo-dev libxml2-dev libxslt-dev && \
+ case $(uname -m) in aarch*|arm*) CFLAGS="-O0" \
+ pip3 install --use-deprecated=legacy-resolver --no-cache-dir -c/src/requirements/upper-constraints.txt \
+ -c/src/functest/upper-constraints.txt lxml ;; esac && \
+ git init /src/vmtp && \
+ (cd /src/vmtp && \
+ git fetch --tags https://review.opendev.org/x/vmtp.git $VMTP_TAG && \
+ git checkout FETCH_HEAD) && \
+ update-requirements -s --source /src/requirements /src/vmtp/ && \
+ pip3 install --use-deprecated=legacy-resolver --no-cache-dir --src /src -c/src/requirements/upper-constraints.txt \
+ -c/src/functest/upper-constraints.txt \
+ /src/vmtp && \
+ mkdir -p /home/opnfv/functest/data/rally/neutron/rally-jobs && \
+ git init /src/neutron && \
+ (cd /src/neutron && \
+ git fetch --tags https://opendev.org/openstack/neutron.git $NEUTRON_TAG && \
+ git checkout FETCH_HEAD) && \
+ cp /src/neutron/rally-jobs/task-neutron.yaml /home/opnfv/functest/data/rally/neutron/rally-jobs/ && \
+ rm -r /src/vmtp /src/neutron && \
+ apk del .build-deps
+COPY testcases.yaml /etc/xtesting/testcases.yaml
+CMD ["run_tests", "-t", "all"]
diff --git a/docker/features/hooks/post_checkout b/docker/benchmarking/hooks/post_checkout
index 8d0e98124..c347524ea 100644
--- a/docker/features/hooks/post_checkout
+++ b/docker/benchmarking/hooks/post_checkout
@@ -1,4 +1,4 @@
-#!/bin/bash
+#!/bin/sh
from="${DOCKER_REPO%/*}/functest-core:${DOCKER_TAG}"
sed -i "s|^FROM.*$|FROM ${from}|" Dockerfile
diff --git a/docker/benchmarking/testcases.yaml b/docker/benchmarking/testcases.yaml
new file mode 100644
index 000000000..c84d3a00f
--- /dev/null
+++ b/docker/benchmarking/testcases.yaml
@@ -0,0 +1,67 @@
+---
+tiers:
+ -
+ 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: 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:
+ - NO_TENANT_NETWORK: '^(?![tT]rue$)'
+ run:
+ name: shaker
diff --git a/docker/components/Dockerfile b/docker/components/Dockerfile
deleted file mode 100644
index 356c5d594..000000000
--- a/docker/components/Dockerfile
+++ /dev/null
@@ -1,33 +0,0 @@
-FROM opnfv/functest-core
-
-ARG BRANCH=master
-ARG OPENSTACK_TAG=stable/queens
-ARG RALLY_TAG=0.11.2
-ARG OS_FAULTS_TAG=0.1.17
-
-RUN apk --no-cache add --virtual .build-deps --update \
- python-dev build-base linux-headers libffi-dev \
- openssl-dev libjpeg-turbo-dev && \
- wget -q -O- https://git.openstack.org/cgit/openstack/requirements/plain/upper-constraints.txt?h=$OPENSTACK_TAG | \
- sed -E s/^tempest==+\(.*\)$/-e\ git+https:\\/\\/github.com\\/openstack\\/tempest@\\1#egg=tempest/ \
- > upper-constraints.txt && \
- pip install --no-cache-dir --src /src -cupper-constraints.txt \
- -chttps://git.opnfv.org/functest/plain/upper-constraints.txt?h=$BRANCH \
- -e git+https://github.com/openstack/requirements@$OPENSTACK_TAG#egg=openstack_requirements && \
- git clone --depth 1 https://github.com/openstack/os-faults.git -b $OS_FAULTS_TAG /src/os-faults && \
- update-requirements -s --source /src/openstack-requirements /src/os-faults/ && \
- git clone --depth 1 https://github.com/openstack/rally.git -b $RALLY_TAG /src/rally && \
- update-requirements -s --source /src/openstack-requirements /src/rally/ && \
- pip install --no-cache-dir --src /src -cupper-constraints.txt \
- -chttps://git.opnfv.org/functest/plain/upper-constraints.txt?h=$BRANCH \
- tempest rally-openstack /src/os-faults && \
- pip install --no-cache-dir --src /src -cupper-constraints.txt \
- -chttps://git.opnfv.org/functest/plain/upper-constraints.txt?h=$BRANCH \
- /src/rally && \
- rm -r upper-constraints.txt /src/os-faults /src/rally && \
- mkdir -p /etc/rally && \
- printf "[database]\nconnection = 'sqlite:////var/lib/rally/database/rally.sqlite'" > /etc/rally/rally.conf && \
- mkdir -p /var/lib/rally/database && rally db create && \
- apk del .build-deps
-COPY testcases.yaml /usr/lib/python2.7/site-packages/xtesting/ci/testcases.yaml
-CMD ["run_tests", "-t", "all"]
diff --git a/docker/components/hooks/post_checkout b/docker/components/hooks/post_checkout
deleted file mode 100644
index 8d0e98124..000000000
--- a/docker/components/hooks/post_checkout
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/bash
-
-from="${DOCKER_REPO%/*}/functest-core:${DOCKER_TAG}"
-sed -i "s|^FROM.*$|FROM ${from}|" Dockerfile
-
-exit $?
diff --git a/docker/components/testcases.yaml b/docker/components/testcases.yaml
deleted file mode 100644
index ce55d85a8..000000000
--- a/docker/components/testcases.yaml
+++ /dev/null
@@ -1,39 +0,0 @@
----
-tiers:
- -
- name: components
- order: 3
- ci_loop: 'weekly'
- description: >-
- Extensive testing of OpenStack API.
- testcases:
- -
- case_name: tempest_full_parallel
- project_name: functest
- criteria: 80
- blocking: false
- description: >-
- The list of test cases is generated by
- Tempest automatically and depends on the parameters of
- the OpenStack deplopyment.
- dependencies:
- installer: ''
- scenario: ''
- run:
- module: 'functest.opnfv_tests.openstack.tempest.tempest'
- class: 'TempestFullParallel'
-
- -
- case_name: rally_full
- 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.
- dependencies:
- installer: ''
- scenario: ''
- run:
- module: 'functest.opnfv_tests.openstack.rally.rally'
- class: 'RallyFull'
diff --git a/docker/core/Dockerfile b/docker/core/Dockerfile
index cb44105af..2715cce39 100644
--- a/docker/core/Dockerfile
+++ b/docker/core/Dockerfile
@@ -1,24 +1,49 @@
-FROM alpine:3.7
+FROM alpine:3.16
ARG BRANCH=master
-ARG OPENSTACK_TAG=stable/queens
+ARG OPENSTACK_TAG=master
-RUN apk --no-cache add --update \
- python libffi libssl1.0 libjpeg-turbo py-pip bash \
- grep sed wget ca-certificates git openssh-client && \
+COPY Switch-to-threading.Thread-for-Rally-tasks.patch /tmp/Switch-to-threading.Thread-for-Rally-tasks.patch
+RUN apk -U upgrade && \
+ apk --no-cache add --update \
+ python3 py3-wheel libffi openssl libjpeg-turbo py3-pip bash \
+ grep sed wget ca-certificates git openssh-client qemu-img iputils coreutils mailcap libstdc++ \
+ libxml2 libxslt && \
apk --no-cache add --virtual .build-deps --update \
- python-dev build-base linux-headers libffi-dev \
- openssl-dev libjpeg-turbo-dev && \
- wget -q -O- https://git.openstack.org/cgit/openstack/requirements/plain/upper-constraints.txt?h=$OPENSTACK_TAG \
- > upper-constraints.txt && \
- git clone https://gerrit.opnfv.org/gerrit/functest /src/functest && \
- (cd /src/functest && git fetch origin $BRANCH && git checkout FETCH_HEAD) && \
- pip install --no-cache-dir --src /src -cupper-constraints.txt \
- -chttps://git.opnfv.org/functest/plain/upper-constraints.txt?h=$BRANCH \
- /src/functest && \
- rm -r upper-constraints.txt /src/functest && \
- cp /usr/lib/python2.7/site-packages/functest/ci/logging.ini /usr/lib/python2.7/site-packages/xtesting/ci/ && \
- bash -c "mkdir -p /var/lib/xtesting /home/opnfv" && \
+ python3-dev build-base linux-headers libffi-dev \
+ openssl-dev libjpeg-turbo-dev rust cargo \
+ libxml2-dev libxslt-dev && \
+ git init /src/requirements && \
+ (cd /src/requirements && \
+ git fetch --tags https://review.opendev.org/openstack/requirements $OPENSTACK_TAG && \
+ git checkout FETCH_HEAD) && \
+ git init /src/functest && \
+ (cd /src/functest && \
+ git fetch --tags https://gerrit.opnfv.org/gerrit/functest $BRANCH && \
+ git checkout FETCH_HEAD) && \
+ sed -i -E /^tempest==+.*$/d /src/requirements/upper-constraints.txt && \
+ sed -i -E /^packaging==+.*$/d /src/requirements/upper-constraints.txt && \
+ case $(uname -m) in aarch*|arm*) sed -i -E /^PyNaCl=/d /src/requirements/upper-constraints.txt && apk add --no-cache py3-pynacl ;; esac && \
+ sed -i -E /#egg=functest/d /src/functest/upper-constraints.txt && \
+ pip3 install --use-deprecated=legacy-resolver --no-cache-dir --src /src -c/src/functest/upper-constraints.txt -c/src/requirements/upper-constraints.txt \
+ -e /src/requirements && \
+ update-requirements -s --source /src/requirements /src/functest && \
+ pip3 install --use-deprecated=legacy-resolver --no-cache-dir --src /src -c/src/functest/upper-constraints.txt -c/src/requirements/upper-constraints.txt \
+ -e /src/functest && \
+ (cd /src/rally && patch -p1 < /tmp/Switch-to-threading.Thread-for-Rally-tasks.patch) && \
+ sed -i -E /#egg=rally/d /src/functest/upper-constraints.txt && \
+ sed -i -E /#egg=tempest/d /src/functest/upper-constraints.txt && \
+ rm -r /src/requirements/.git /src/functest/.git \
+ /tmp/Switch-to-threading.Thread-for-Rally-tasks.patch && \
+ mkdir -p /etc/xtesting && \
+ cp /src/functest/functest/ci/logging.ini /etc/xtesting/ && \
+ cp /src/functest/functest/ci/logging.debug.ini /etc/xtesting/ && \
+ sh -c "mkdir -p /var/lib/xtesting /home/opnfv" && \
ln -s /var/lib/xtesting /home/opnfv/functest && \
- bash -c "mkdir -p /home/opnfv/functest{/conf,/data,/images,/results} /home/opnfv/repos/vnfs" && \
+ sh -c "mkdir -p /home/opnfv/functest/conf /home/opnfv/functest/conf/data /home/opnfv/functest/conf/images /home/opnfv/functest/conf/results && \
+ mkdir -p /home/opnfv/repos/vnfs" && \
+ mkdir -p /etc/rally && \
+ printf "[database]\nconnection = 'sqlite:////var/lib/rally/database/rally.sqlite'\n" > /etc/rally/rally.conf && \
+ printf "\n[openstack]\nneutron_bind_l2_agent_types = Open vSwitch agent,Linux bridge agent,OVN Controller Gateway agent\n" >> /etc/rally/rally.conf && \
+ mkdir -p /var/lib/rally/database && rally db create && \
apk del .build-deps
diff --git a/docker/core/Switch-to-threading.Thread-for-Rally-tasks.patch b/docker/core/Switch-to-threading.Thread-for-Rally-tasks.patch
new file mode 100644
index 000000000..a6d012730
--- /dev/null
+++ b/docker/core/Switch-to-threading.Thread-for-Rally-tasks.patch
@@ -0,0 +1,49 @@
+From 0d0ca00e56024a9919c150dbed62050d4c70b0c8 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?C=C3=A9dric=20Ollivier?= <cedric.ollivier@orange.com>
+Date: Wed, 3 Jun 2020 15:23:59 +0200
+Subject: [PATCH] Switch to threading.Thread() for Rally tasks
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+multiprocessing.Process() often fails due to thread crashes [1].
+It looks similar to gsutil release notes [2].
+
+[1] https://build.opnfv.org/ci/job/functest-opnfv-functest-benchmarking-cntt-latest-rally_full_cntt-run/35/console
+[2] https://github.com/GoogleCloudPlatform/gsutil/issues/548
+[3] https://github.com/GoogleCloudPlatform/gsutil/blob/master/CHANGES.md
+
+Change-Id: I582933832e23d188c7fa5999e713dd5d7e82d2da
+Signed-off-by: Cédric Ollivier <cedric.ollivier@orange.com>
+---
+ rally/task/runner.py | 7 ++++---
+ 1 file changed, 4 insertions(+), 3 deletions(-)
+
+diff --git a/rally/task/runner.py b/rally/task/runner.py
+index 3397e1193..5edebb406 100644
+--- a/rally/task/runner.py
++++ b/rally/task/runner.py
+@@ -17,6 +17,7 @@ import abc
+ import collections
+ import copy
+ import multiprocessing
++import threading
+ import time
+
+ from rally.common import logging
+@@ -186,9 +187,9 @@ class ScenarioRunner(plugin.Plugin, validation.ValidatablePluginMixin,
+ for i in range(processes_to_start):
+ kwrgs = {"processes_to_start": processes_to_start,
+ "processes_counter": i}
+- process = multiprocessing.Process(target=worker_process,
+- args=next(worker_args_gen),
+- kwargs={"info": kwrgs})
++ process = threading.Thread(target=worker_process,
++ args=next(worker_args_gen),
++ kwargs={"info": kwrgs})
+ process.start()
+ process_pool.append(process)
+
+--
+2.26.2
+
diff --git a/docker/features/Dockerfile b/docker/features/Dockerfile
deleted file mode 100644
index e91155a38..000000000
--- a/docker/features/Dockerfile
+++ /dev/null
@@ -1,41 +0,0 @@
-FROM opnfv/functest-core
-
-ARG BRANCH=master
-ARG OPENSTACK_TAG=stable/queens
-ARG FDS_TAG=master
-ARG RALLY_TAG=0.11.2
-ARG OS_FAULTS_TAG=0.1.17
-
-COPY thirdparty-requirements.txt thirdparty-requirements.txt
-RUN apk --no-cache add --update python3 sshpass && \
- apk --no-cache add --virtual .build-deps --update \
- python-dev python3-dev build-base linux-headers libffi-dev \
- openssl-dev libjpeg-turbo-dev && \
- wget -q -O- https://git.openstack.org/cgit/openstack/requirements/plain/upper-constraints.txt?h=$OPENSTACK_TAG | \
- sed -E s/^tempest==+\(.*\)$/-e\ git+https:\\/\\/github.com\\/openstack\\/tempest@\\1#egg=tempest/ \
- > upper-constraints.txt && \
- pip install --no-cache-dir --src /src -cupper-constraints.txt \
- -chttps://git.opnfv.org/functest/plain/upper-constraints.txt?h=$BRANCH \
- -e git+https://github.com/openstack/requirements@$OPENSTACK_TAG#egg=openstack_requirements && \
- git clone --depth 1 https://github.com/openstack/os-faults.git -b $OS_FAULTS_TAG /src/os-faults && \
- update-requirements -s --source /src/openstack-requirements /src/os-faults/ && \
- git clone --depth 1 https://github.com/openstack/rally.git -b $RALLY_TAG /src/rally && \
- update-requirements -s --source /src/openstack-requirements /src/rally/ && \
- pip install --no-cache-dir --src /src -cupper-constraints.txt \
- -chttps://git.opnfv.org/functest/plain/upper-constraints.txt?h=$BRANCH \
- tempest rally-openstack /src/os-faults && \
- pip install --no-cache-dir --src /src -cupper-constraints.txt \
- -chttps://git.opnfv.org/functest/plain/upper-constraints.txt?h=$BRANCH \
- /src/rally -rthirdparty-requirements.txt && \
- git clone --depth 1 -b $FDS_TAG https://gerrit.opnfv.org/gerrit/fds /src/fds && \
- python3 -m pip install --no-cache-dir --src /src -cupper-constraints.txt \
- -chttps://git.opnfv.org/functest/plain/upper-constraints.txt?h=$BRANCH \
- doctor-tests && \
- rm -r upper-constraints.txt thirdparty-requirements.txt /src/fds/.git \
- /src/os-faults /src/rally && \
- mkdir -p /etc/rally && \
- printf "[database]\nconnection = 'sqlite:////var/lib/rally/database/rally.sqlite'" > /etc/rally/rally.conf && \
- mkdir -p /var/lib/rally/database && rally db create && \
- apk del .build-deps
-COPY testcases.yaml /usr/lib/python2.7/site-packages/xtesting/ci/testcases.yaml
-CMD ["run_tests", "-t", "all"]
diff --git a/docker/features/testcases.yaml b/docker/features/testcases.yaml
deleted file mode 100644
index 855742013..000000000
--- a/docker/features/testcases.yaml
+++ /dev/null
@@ -1,89 +0,0 @@
----
-tiers:
- -
- 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
- criteria: 100
- blocking: false
- description: >-
- Test suite from Doctor project.
- dependencies:
- installer: '(apex)|(fuel)|(daisy)'
- scenario: '^((?!fdio|nofeature).)*$'
- run:
- module: 'xtesting.core.feature'
- class: 'BashFeature'
- args:
- cmd: 'doctor-test'
-
- -
- case_name: bgpvpn
- project_name: sdnvpn
- criteria: 100
- blocking: false
- description: >-
- Test suite from SDNVPN project.
- dependencies:
- installer: ''
- scenario: 'bgpvpn'
- run:
- module: 'sdnvpn.test.functest.run_sdnvpn_tests'
- class: 'SdnvpnFunctest'
-
- -
- case_name: functest-odl-sfc
- project_name: sfc
- 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'
- run:
- module: 'sfc.tests.functest.run_sfc_tests'
- class: 'SfcFunctest'
-
- -
- case_name: barometercollectd
- project_name: barometer
- 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: ''
- scenario: 'bar'
- run:
- module: 'baro_tests.barometer'
- class: 'BarometerCollectd'
-
- -
- case_name: fds
- project_name: fastdatastacks
- 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: ''
- scenario: 'odl.*-fdio'
- run:
- module: 'functest.opnfv_tests.sdn.odl.odl'
- class: 'ODLTests'
- args:
- suites:
- - /src/fds/testing/robot
diff --git a/docker/features/thirdparty-requirements.txt b/docker/features/thirdparty-requirements.txt
deleted file mode 100644
index 73c11b447..000000000
--- a/docker/features/thirdparty-requirements.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-robotframework-httplibrary
-robotframework-requests
-robotframework-sshlibrary;python_version=='2.7'
-baro_tests
-sdnvpn
-sfc
-doctor-tests;python_version>='3.0'
diff --git a/docker/healthcheck/Dockerfile b/docker/healthcheck/Dockerfile
index 433f8737d..404ff2d58 100644
--- a/docker/healthcheck/Dockerfile
+++ b/docker/healthcheck/Dockerfile
@@ -1,4 +1,15 @@
FROM opnfv/functest-core
-COPY testcases.yaml /usr/lib/python2.7/site-packages/xtesting/ci/testcases.yaml
+ARG ODL_TAG=89b88a0a23561f0bda62338b394ec41655679b2d
+
+COPY thirdparty-requirements.txt thirdparty-requirements.txt
+RUN apk --no-cache add --virtual .build-deps --update \
+ python3-dev build-base linux-headers libffi-dev openssl-dev && \
+ git init /src/odl_test && \
+ (cd /src/odl_test && \
+ git fetch --tags https://git.opendaylight.org/gerrit/integration/test $ODL_TAG && \
+ git checkout FETCH_HEAD) && \
+ rm -r /src/odl_test/.git thirdparty-requirements.txt && \
+ apk del .build-deps
+COPY testcases.yaml /etc/xtesting/testcases.yaml
CMD ["run_tests", "-t", "all"]
diff --git a/docker/healthcheck/testcases.yaml b/docker/healthcheck/testcases.yaml
index 33bc8d1b7..7b6b2a108 100644
--- a/docker/healthcheck/testcases.yaml
+++ b/docker/healthcheck/testcases.yaml
@@ -2,8 +2,6 @@
tiers:
-
name: healthcheck
- order: 0
- ci_loop: '(merge)|(verify)|(daily)|(weekly)'
description: >-
First tier to be executed to verify the basic
operations in the VIM.
@@ -16,48 +14,169 @@ 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.
+ simple queries.
+ run:
+ name: connection_check
+
+ -
+ case_name: tenantnetwork1
+ project_name: functest
+ criteria: 100
+ blocking: true
+ description: >-
+ It creates and configures all tenant network ressources
+ required by advanced testcases (subnet, network and
+ router).
dependencies:
- installer: ''
- scenario: ''
+ - NO_TENANT_NETWORK: '^(?![tT]rue$)'
run:
- module:
- 'functest.opnfv_tests.openstack.snaps.connection_check'
- class: 'ConnectionCheck'
+ name: tenantnetwork1
-
- case_name: api_check
+ case_name: tenantnetwork2
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 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:
+ 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:
- module: 'functest.opnfv_tests.openstack.snaps.api_check'
- class: 'ApiCheck'
+ name: singlevm1
-
- case_name: snaps_health_check
+ case_name: singlevm2
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 and vms required by advanced
+ testcases.
+ run:
+ name: singlevm2
+
+ -
+ case_name: vping_ssh
+ project_name: functest
+ criteria: 100
+ blocking: true
+ description: >-
+ 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.
+ run:
+ name: vping_ssh
+
+ -
+ case_name: vping_userdata
+ project_name: functest
+ criteria: 100
+ blocking: true
+ 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:
+ - DEPLOY_SCENARIO: 'odl'
+ run:
+ name: odl
+ args:
+ suites:
+ - /src/odl_test/csit/suites/integration/basic
+ - /src/odl_test/csit/suites/openstack/neutron
+
+ -
+ case_name: tempest_smoke
+ project_name: functest
+ criteria: 100
+ blocking: false
+ description: >-
+ This test case runs the smoke subset of the OpenStack
+ 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: ''
- scenario: '^((?!lxd).)*$'
+ - DASHBOARD_URL: '^(?!\s*$).+'
run:
- module: 'functest.opnfv_tests.openstack.snaps.health_check'
- class: 'HealthCheck'
+ name: tempest_common
+ args:
+ mode: '^tempest.scenario.test_dashboard_basic_ops.'
diff --git a/docker/smoke/thirdparty-requirements.txt b/docker/healthcheck/thirdparty-requirements.txt
index 6d7ee1226..f8e37e3cb 100644
--- a/docker/smoke/thirdparty-requirements.txt
+++ b/docker/healthcheck/thirdparty-requirements.txt
@@ -1,3 +1,3 @@
robotframework-httplibrary
robotframework-requests
-robotframework-sshlibrary;python_version=='2.7'
+robotframework-sshlibrary
diff --git a/docker/parser/Dockerfile b/docker/parser/Dockerfile
deleted file mode 100644
index fe21bb54c..000000000
--- a/docker/parser/Dockerfile
+++ /dev/null
@@ -1,19 +0,0 @@
-FROM opnfv/functest-core
-
-ARG BRANCH=master
-ARG OPENSTACK_TAG=stable/queens
-
-COPY thirdparty-requirements.txt thirdparty-requirements.txt
-RUN apk --no-cache add --virtual .build-deps --update \
- python-dev build-base linux-headers libffi-dev \
- openssl-dev libjpeg-turbo-dev && \
- wget -q -O- https://git.openstack.org/cgit/openstack/requirements/plain/upper-constraints.txt?h=$OPENSTACK_TAG | \
- sed -E s/^tempest==+\(.*\)$/-e\ git+https:\\/\\/github.com\\/openstack\\/tempest@\\1#egg=tempest/ \
- > upper-constraints.txt && \
- pip install --no-cache-dir --src /src -cupper-constraints.txt \
- -chttps://git.opnfv.org/functest/plain/upper-constraints.txt?h=$BRANCH \
- -rthirdparty-requirements.txt && \
- rm upper-constraints.txt thirdparty-requirements.txt && \
- apk del .build-deps
-COPY testcases.yaml /usr/lib/python2.7/site-packages/xtesting/ci/testcases.yaml
-CMD ["run_tests", "-t", "all"]
diff --git a/docker/parser/hooks/post_checkout b/docker/parser/hooks/post_checkout
deleted file mode 100644
index 8d0e98124..000000000
--- a/docker/parser/hooks/post_checkout
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/bash
-
-from="${DOCKER_REPO%/*}/functest-core:${DOCKER_TAG}"
-sed -i "s|^FROM.*$|FROM ${from}|" Dockerfile
-
-exit $?
diff --git a/docker/parser/testcases.yaml b/docker/parser/testcases.yaml
deleted file mode 100644
index 2999aa565..000000000
--- a/docker/parser/testcases.yaml
+++ /dev/null
@@ -1,25 +0,0 @@
----
-tiers:
- -
- name: features
- order: 2
- ci_loop: '(daily)|(weekly)'
- description: >-
- Test suites from feature projects
- integrated in functest
- testcases:
- -
- case_name: parser-basics
- project_name: parser
- criteria: 100
- blocking: false
- description: >-
- Test suite from Parser project.
- dependencies:
- installer: ''
- scenario: '^((?!bgpvpn|nofeature).)*$'
- run:
- module: 'xtesting.core.feature'
- class: 'BashFeature'
- args:
- cmd: '/src/nfv-parser/tests/functest_run.sh'
diff --git a/docker/parser/thirdparty-requirements.txt b/docker/parser/thirdparty-requirements.txt
deleted file mode 100644
index 9981404d6..000000000
--- a/docker/parser/thirdparty-requirements.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-nfv-heattranslator
-nfv-toscaparser
-nfv-parser
diff --git a/docker/smoke-cntt/Dockerfile b/docker/smoke-cntt/Dockerfile
new file mode 100644
index 000000000..a8e8a6f75
--- /dev/null
+++ b/docker/smoke-cntt/Dockerfile
@@ -0,0 +1,5 @@
+FROM opnfv/functest-smoke
+
+COPY testcases.yaml /etc/xtesting/testcases.yaml
+COPY tempest_conf.yaml /src/functest/functest/opnfv_tests/openstack/tempest/custom_tests/tempest_conf.yaml
+CMD ["run_tests", "-t", "all"]
diff --git a/docker/smoke-cntt/tempest_conf.yaml b/docker/smoke-cntt/tempest_conf.yaml
new file mode 100644
index 000000000..d9f878992
--- /dev/null
+++ b/docker/smoke-cntt/tempest_conf.yaml
@@ -0,0 +1,104 @@
+---
+compute:
+ min_microversion: 2.44
+ max_microversion: 2.88
+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: false
+ 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: 1.36
+validation:
+ image_ssh_user: cirros
+ ssh_timeout: 196
+ ip_version_for_ssh: 4
+ run_validation: true
+volume:
+ max_microversion: 3.64
+ 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/docker/smoke-cntt/testcases.yaml b/docker/smoke-cntt/testcases.yaml
new file mode 100644
index 000000000..1d2aec38b
--- /dev/null
+++ b/docker/smoke-cntt/testcases.yaml
@@ -0,0 +1,321 @@
+---
+tiers:
+ -
+ name: smoke_cntt
+ description: >-
+ Set of basic Functional tests to validate the OPNFV scenarios.
+ testcases:
+ -
+ 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_forwarding_negative)\
+ (?!.*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: 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 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_common
+ 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:
+ 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'
diff --git a/docker/smoke/Dockerfile b/docker/smoke/Dockerfile
index 9bb98be4a..da42ef9b4 100644
--- a/docker/smoke/Dockerfile
+++ b/docker/smoke/Dockerfile
@@ -1,56 +1,94 @@
FROM opnfv/functest-core
-ARG BRANCH=master
-ARG OPENSTACK_TAG=stable/queens
-ARG ODL_TAG=85448c9d97b89989488e675b29b38ac42d8674e4
-ARG RALLY_TAG=0.11.2
-ARG OS_FAULTS_TAG=0.1.17
-ARG REFSTACK_TARGET=2017.09
-ARG PATROLE_TAG=0.3.0
+ARG PATROLE_TAG=master
+ARG NEUTRON_TEMPEST_TAG=master
+ARG CINDER_TEMPEST_TAG=master
+ARG KEYSTONE_TEMPEST_TAG=master
+ARG NEUTRON_TAG=master
+ARG GLANCE_TAG=master
+ARG NOVA_TAG=master
+ARG KEYSTONE_TAG=master
+ARG CINDER_TAG=master
+ARG BARBICAN_TAG=master
+ARG OCTAVIA_TAG=master
+ARG HEAT_TEMPEST_TAG=master
+ARG TELEMETRY_TEMPEST_TAG=master
+ARG CYBORG_TEMPEST_TAG=master
-COPY thirdparty-requirements.txt thirdparty-requirements.txt
-RUN apk --no-cache add --virtual .build-deps --update \
- python-dev build-base linux-headers libffi-dev \
- openssl-dev libjpeg-turbo-dev && \
- wget -q -O- https://git.openstack.org/cgit/openstack/requirements/plain/upper-constraints.txt?h=$OPENSTACK_TAG | \
- sed -E s/^tempest==+\(.*\)$/-e\ git+https:\\/\\/github.com\\/openstack\\/tempest@\\1#egg=tempest/ \
- > upper-constraints.txt && \
- pip install --no-cache-dir --src /src -cupper-constraints.txt \
- -chttps://git.opnfv.org/functest/plain/upper-constraints.txt?h=$BRANCH \
- -e git+https://github.com/openstack/requirements@$OPENSTACK_TAG#egg=openstack_requirements && \
- git clone https://github.com/openstack/os-faults.git /src/os-faults && \
- (cd /src/os-faults && git checkout $OS_FAULTS_TAG) && \
- update-requirements -s --source /src/openstack-requirements /src/os-faults/ && \
- git clone https://github.com/openstack/rally.git /src/rally && \
- (cd /src/rally && git checkout $RALLY_TAG) && \
- update-requirements -s --source /src/openstack-requirements /src/rally/ && \
- git clone https://github.com/openstack/patrole.git /src/patrole && \
- (cd /src/patrole && git checkout $PATROLE_TAG) && \
- update-requirements -s --source /src/openstack-requirements /src/patrole/ && \
- git clone --depth 1 https://github.com/openstack/neutron-tempest-plugin.git /src/neutron-tempest-plugin && \
- update-requirements -s --source /src/openstack-requirements /src/neutron-tempest-plugin && \
- git clone --depth 1 https://github.com/openstack/rally-openstack.git /src/rally-openstack && \
- update-requirements -s --source /src/openstack-requirements /src/rally-openstack && \
- pip install --no-cache-dir --src /src -cupper-constraints.txt \
- -chttps://git.opnfv.org/functest/plain/upper-constraints.txt?h=$BRANCH \
- tempest /src/rally-openstack /src/os-faults && \
- pip install --no-cache-dir --src /src -cupper-constraints.txt \
- -chttps://git.opnfv.org/functest/plain/upper-constraints.txt?h=$BRANCH \
- /src/rally /src/patrole /src/neutron-tempest-plugin -rthirdparty-requirements.txt && \
- git clone https://git.opendaylight.org/gerrit/p/integration/test.git /src/odl_test && \
- (cd /src/odl_test && git checkout $ODL_TAG) && \
- virtualenv --system-site-packages /src/tempest/.venv && \
- rm -r upper-constraints.txt thirdparty-requirements.txt /src/odl_test/.git \
- /src/os-faults /src/rally /src/rally-openstack /src/neutron-tempest-plugin && \
- mkdir -p /etc/rally && \
- printf "[database]\nconnection = 'sqlite:////var/lib/rally/database/rally.sqlite'" > /etc/rally/rally.conf && \
- mkdir -p /var/lib/rally/database && rally db create && \
+RUN apk --no-cache add --update libxml2 libxslt && \
+ apk --no-cache add --virtual .build-deps --update \
+ python3-dev build-base linux-headers libffi-dev \
+ openssl-dev libjpeg-turbo-dev libxml2-dev libxslt-dev && \
+ case $(uname -m) in aarch*|arm*) CFLAGS="-O0" \
+ pip3 install --use-deprecated=legacy-resolver --no-cache-dir -c/src/requirements/upper-constraints.txt \
+ -c/src/functest/upper-constraints.txt lxml && \
+ sed -i -E /^numpy=/d /src/requirements/upper-constraints.txt && apk add py3-numpy ;; esac && \
+ git init /src/patrole && \
+ (cd /src/patrole && \
+ git fetch --tags https://opendev.org/openstack/patrole.git $PATROLE_TAG && \
+ git checkout FETCH_HEAD) && \
+ update-requirements -s --source /src/requirements /src/patrole/ && \
+ git init /src/neutron-tempest-plugin && \
+ (cd /src/neutron-tempest-plugin && \
+ git fetch --tags https://opendev.org/openstack/neutron-tempest-plugin.git $NEUTRON_TEMPEST_TAG && \
+ git checkout FETCH_HEAD) && \
+ update-requirements -s --source /src/requirements /src/neutron-tempest-plugin && \
+ git init /src/cinder-tempest-plugin && \
+ (cd /src/cinder-tempest-plugin && \
+ git fetch --tags https://opendev.org/openstack/cinder-tempest-plugin.git $CINDER_TEMPEST_TAG && \
+ git checkout FETCH_HEAD) && \
+ update-requirements -s --source /src/requirements /src/cinder-tempest-plugin && \
+ git init /src/keystone-tempest-plugin && \
+ (cd /src/keystone-tempest-plugin && \
+ git fetch --tags https://opendev.org/openstack/keystone-tempest-plugin.git $KEYSTONE_TEMPEST_TAG && \
+ git checkout FETCH_HEAD) && \
+ update-requirements -s --source /src/requirements /src/keystone-tempest-plugin && \
+ git init /src/barbican-tempest-plugin && \
+ (cd /src/barbican-tempest-plugin && \
+ git fetch --tags https://opendev.org/openstack/barbican-tempest-plugin.git $BARBICAN_TAG && \
+ git checkout FETCH_HEAD) && \
+ update-requirements -s --source /src/requirements /src/barbican-tempest-plugin/ && \
+ git init /src/octavia-tempest-plugin && \
+ (cd /src/octavia-tempest-plugin && \
+ git fetch --tags https://opendev.org/openstack/octavia-tempest-plugin.git $OCTAVIA_TAG && \
+ git checkout FETCH_HEAD) && \
+ update-requirements -s --source /src/requirements /src/octavia-tempest-plugin && \
+ git init /src/heat-tempest-plugin && \
+ (cd /src/heat-tempest-plugin && \
+ git fetch --tags https://opendev.org/openstack/heat-tempest-plugin.git $HEAT_TEMPEST_TAG && \
+ git checkout FETCH_HEAD) && \
+ update-requirements -s --source /src/requirements /src/heat-tempest-plugin && \
+ git init /src/telemetry-tempest-plugin && \
+ (cd /src/telemetry-tempest-plugin && \
+ git fetch --tags https://opendev.org/openstack/telemetry-tempest-plugin.git $TELEMETRY_TEMPEST_TAG && \
+ git checkout FETCH_HEAD) && \
+ update-requirements -s --source /src/requirements /src/telemetry-tempest-plugin && \
+ git init /src/cyborg-tempest-plugin && \
+ (cd /src/cyborg-tempest-plugin && \
+ git fetch --tags https://opendev.org/openstack/cyborg-tempest-plugin.git $CYBORG_TEMPEST_TAG && \
+ git checkout FETCH_HEAD) && \
+ update-requirements -s --source /src/requirements /src/cyborg-tempest-plugin && \
+ pip3 install --use-deprecated=legacy-resolver --no-cache-dir --src /src -c/src/requirements/upper-constraints.txt \
+ -c/src/functest/upper-constraints.txt \
+ /src/patrole /src/barbican-tempest-plugin /src/neutron-tempest-plugin \
+ /src/cinder-tempest-plugin /src/keystone-tempest-plugin \
+ /src/octavia-tempest-plugin /src/heat-tempest-plugin /src/telemetry-tempest-plugin \
+ /src/cyborg-tempest-plugin && \
mkdir -p /home/opnfv/functest/data/refstack && \
- wget "https://refstack.openstack.org/api/v1/guidelines/${REFSTACK_TARGET}/tests?target=compute&type=required&alias=true&flag=false" \
- -O /home/opnfv/functest/data/refstack/defcore.txt && \
- mkdir -p /etc/neutron /etc/glance && \
- wget -q -O /etc/neutron/policy.json https://raw.githubusercontent.com/openstack/neutron/$OPENSTACK_TAG/etc/policy.json && \
- wget -q -O /etc/glance/policy.json https://raw.githubusercontent.com/openstack/glance/$OPENSTACK_TAG/etc/policy.json && \
+ pip3 install --use-deprecated=legacy-resolver --no-cache-dir --src /src -c/src/requirements/upper-constraints.txt \
+ -c/src/functest/upper-constraints.txt \
+ git+https://opendev.org/openstack/neutron.git@$NEUTRON_TAG#egg=neutron \
+ git+https://opendev.org/openstack/glance.git@$GLANCE_TAG#egg=glance \
+ git+https://opendev.org/openstack/nova.git@$NOVA_TAG#egg=nova \
+ git+https://opendev.org/openstack/keystone.git@$KEYSTONE_TAG#egg=keystone \
+ git+https://opendev.org/openstack/cinder.git@$CINDER_TAG#egg=cinder && \
+ rm -r /src/patrole /src/barbican-tempest-plugin /src/neutron-tempest-plugin \
+ /src/cinder-tempest-plugin /src/keystone-tempest-plugin \
+ /src/octavia-tempest-plugin /src/heat-tempest-plugin \
+ /src/telemetry-tempest-plugin /src/cyborg-tempest-plugin && \
apk del .build-deps
-COPY testcases.yaml /usr/lib/python2.7/site-packages/xtesting/ci/testcases.yaml
+COPY compute.txt /home/opnfv/functest/data/refstack/compute.txt
+COPY object.txt /home/opnfv/functest/data/refstack/object.txt
+COPY platform.txt /home/opnfv/functest/data/refstack/platform.txt
+COPY testcases.yaml /etc/xtesting/testcases.yaml
CMD ["run_tests", "-t", "all"]
diff --git a/functest/opnfv_tests/openstack/tempest/custom_tests/defcore_req.txt b/docker/smoke/compute.txt
index fbbee2ffc..7a642a703 100644
--- a/functest/opnfv_tests/openstack/tempest/custom_tests/defcore_req.txt
+++ b/docker/smoke/compute.txt
@@ -1,9 +1,19 @@
-# 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.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.keypairs.test_keypairs_v22.KeyPairsV22TestJSON.test_keypairsv22_create_list_show_with_type[id-89d59d43-f735-441a-abcf-0601727f47b6]
+tempest.api.compute.security_groups.test_security_groups.SecurityGroupsTestJSON.test_list_security_groups_by_server[id-79517d60-535a-438f-af3d-e6feab1cbea7]
+tempest.api.compute.security_groups.test_security_groups.SecurityGroupsTestJSON.test_security_group_create_get_delete[id-ecc0da4a-2117-48af-91af-993cca39a615]
+tempest.api.compute.security_groups.test_security_groups.SecurityGroupsTestJSON.test_security_groups_create_list_delete[id-eb2b087d-633d-4d0d-a7bd-9e6ba35b32de]
+tempest.api.compute.security_groups.test_security_groups.SecurityGroupsTestJSON.test_server_security_groups[id-fe4abc0d-83f5-4c50-ad11-57a1127297a2]
+tempest.api.compute.security_groups.test_security_groups.SecurityGroupsTestJSON.test_update_security_groups[id-7d4e1d3c-3209-4d6d-b020-986304ebad1f]
+tempest.api.compute.security_groups.test_security_groups_negative.SecurityGroupsNegativeTestJSON.test_delete_nonexistent_security_group[id-6727c00b-214c-4f9e-9a52-017ac3e98411]
+tempest.api.compute.security_groups.test_security_groups_negative.SecurityGroupsNegativeTestJSON.test_delete_security_group_without_passing_id[id-1438f330-8fa4-4aeb-8a94-37c250106d7f]
+tempest.api.compute.security_groups.test_security_groups_negative.SecurityGroupsNegativeTestJSON.test_delete_the_default_security_group[id-36a1629f-c6da-4a26-b8b8-55e7e5d5cd58]
+tempest.api.compute.security_groups.test_security_groups_negative.SecurityGroupsNegativeTestJSON.test_security_group_get_nonexistent_group[id-673eaec1-9b3e-48ed-bdf1-2786c1b9661c]
+tempest.api.compute.security_groups.test_security_groups_negative.SecurityGroupsNegativeTestJSON.test_update_non_existent_security_group[id-27edee9c-873d-4da6-a68a-3c256efebe8f]
+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]
@@ -28,10 +38,10 @@ tempest.api.compute.servers.test_list_server_filters.ListServerFiltersTestJSON.t
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_ip_regex[id-a905e287-c35e-42f2-b132-d02b09f3654a]
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]
@@ -41,16 +51,15 @@ tempest.api.compute.servers.test_list_servers_negative.ListServersNegativeTestJS
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_multiple_create.MultipleCreateTestJSON.test_multiple_create[id-61e03386-89c3-449c-9bb1-a06f423fd9d1]
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_server_tags.ServerTagsTestJSON.test_check_tag_existence[id-81279a66-61c3-4759-b830-a2dbe64cbe08]
+tempest.api.compute.servers.test_server_tags.ServerTagsTestJSON.test_create_delete_tag[id-8d95abe2-c658-4c42-9a44-c0258500306b]
+tempest.api.compute.servers.test_server_tags.ServerTagsTestJSON.test_delete_all_tags[id-a63b2a74-e918-4b7c-bcab-10c855f3a57e]
+tempest.api.compute.servers.test_server_tags.ServerTagsTestJSON.test_update_all_tags[id-a2c1af8c-127d-417d-974b-8115f7e3d831]
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]
@@ -86,8 +95,20 @@ tempest.api.identity.v3.TestApiDiscovery.test_api_version_statuses[id-8879a470-a
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_api_discovery.TestApiDiscovery.test_list_api_versions[id-721f480f-35b6-46c7-846e-047e6acea0dc]
+tempest.api.identity.v3.test_application_credentials.ApplicationCredentialsV3Test.test_create_application_credential[id-8080c75c-eddc-4786-941a-c2da7039ae61]
+tempest.api.identity.v3.test_application_credentials.ApplicationCredentialsV3Test.test_create_application_credential_expires[id-852daf0c-42b5-4239-8466-d193d0543ed3]
+tempest.api.identity.v3.test_application_credentials.ApplicationCredentialsV3Test.test_list_application_credentials[id-ff0cd457-6224-46e7-b79e-0ada4964a8a6]
+tempest.api.identity.v3.test_application_credentials.ApplicationCredentialsV3Test.test_query_application_credentials[id-9bb5e5cc-5250-493a-8869-8b665f6aa5f6]
+tempest.api.identity.v3.test_catalog.IdentityCatalogTest.test_catalog_standardization[id-56b57ced-22b8-4127-9b8a-565dfb0207e2]
+tempest.api.identity.v3.test_domains.DefaultDomainTestJSON.test_default_domain_exists[id-17a5de24-e6a0-4e4a-a9ee-d85b6e5612b5]
tempest.api.identity.v3.test_tokens.TokensV3Test.test_create_token[id-6f8e4436-fc96-4282-8122-e41df57197a9]
+tempest.api.identity.v3.test_tokens.TokensV3Test.test_token_auth_creation_existence_deletion[id-0f9f5a5f-d5cd-4a86-8a5b-c5ded151f212]
+tempest.api.identity.v3.test_tokens.TokensV3Test.test_validate_token[id-a9512ac3-3909-48a4-b395-11f438e16260]
+tempest.api.identity.v3.test_users.IdentityV3UsersTest.test_password_history_check_self_service_api[id-941784ee-5342-4571-959b-b80dd2cea516]
+tempest.api.identity.v3.test_users.IdentityV3UsersTest.test_user_account_lockout[id-a7ad8bbf-2cff-4520-8c1d-96332e151658]
tempest.api.image.v2.test_images.BasicOperationsImagesTest.test_delete_image[id-f848bb94-1c6e-45a4-8726-39e3a5b23535]
+tempest.api.image.v2.test_images.BasicOperationsImagesTest.test_register_upload_get_image_file[id-139b765e-7f3d-4b3d-8b37-3ca3876ee318]
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]
@@ -115,9 +136,29 @@ tempest.api.image.v2.test_images_negative.ImagesNegativeTest.test_delete_non_exi
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_negative.ImagesNegativeTest.test_register_with_invalid_container_format[id-292bd310-369b-41c7-a7a3-10276ef76753]
+tempest.api.image.v2.test_images_negative.ImagesNegativeTest.test_register_with_invalid_disk_format[id-70c6040c-5a97-4111-9e13-e73665264ce1]
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_dhcp_ipv6.NetworksTestDHCPv6.test_dhcp_stateful[id-4ab211a0-276f-4552-9070-51e27f58fecf]
+tempest.api.network.test_dhcp_ipv6.NetworksTestDHCPv6.test_dhcp_stateful_fixedips[id-51a5e97f-f02e-4e4e-9a17-a69811d300e3]
+tempest.api.network.test_dhcp_ipv6.NetworksTestDHCPv6.test_dhcp_stateful_fixedips_duplicate[id-57b8302b-cba9-4fbb-8835-9168df029051]
+tempest.api.network.test_dhcp_ipv6.NetworksTestDHCPv6.test_dhcp_stateful_fixedips_outrange[id-98244d88-d990-4570-91d4-6b25d70d08af]
+tempest.api.network.test_dhcp_ipv6.NetworksTestDHCPv6.test_dhcp_stateful_router[id-e98f65db-68f4-4330-9fea-abd8c5192d4d]
+tempest.api.network.test_dhcp_ipv6.NetworksTestDHCPv6.test_dhcpv6_64_subnets[id-4256c61d-c538-41ea-9147-3c450c36669e]
+tempest.api.network.test_dhcp_ipv6.NetworksTestDHCPv6.test_dhcpv6_invalid_options[id-81f18ef6-95b5-4584-9966-10d480b7496a]
+tempest.api.network.test_dhcp_ipv6.NetworksTestDHCPv6.test_dhcpv6_stateless_eui64[id-e5517e62-6f16-430d-a672-f80875493d4c]
+tempest.api.network.test_dhcp_ipv6.NetworksTestDHCPv6.test_dhcpv6_stateless_no_ra[id-ae2f4a5d-03ff-4c42-a3b0-ce2fcb7ea832]
+tempest.api.network.test_dhcp_ipv6.NetworksTestDHCPv6.test_dhcpv6_stateless_no_ra_no_dhcp[id-21635b6f-165a-4d42-bf49-7d195e47342f]
+tempest.api.network.test_dhcp_ipv6.NetworksTestDHCPv6.test_dhcpv6_two_subnets[id-4544adf7-bb5f-4bdc-b769-b3e77026cef2]
+tempest.api.network.test_floating_ips.FloatingIPTestJSON.test_create_floating_ip_specifying_a_fixed_ip_address[id-36de4bd0-f09c-43e3-a8e1-1decc1ffd3a5]
+tempest.api.network.test_floating_ips.FloatingIPTestJSON.test_create_update_floatingip_with_port_multiple_ip_address[id-45c4c683-ea97-41ef-9c51-5e9802f2f3d7]
+tempest.api.network.test_floating_ips.FloatingIPTestJSON.test_floating_ip_delete_port[id-e1f6bffd-442f-4668-b30e-df13f2705e77]
+tempest.api.network.test_floating_ips.FloatingIPTestJSON.test_floating_ip_update_different_router[id-1bb2f731-fe5a-4b8c-8409-799ade1bed4d]
+tempest.api.network.test_floating_ips_negative.FloatingIPNegativeTestJSON.test_associate_floatingip_port_ext_net_unreachable[id-6b3b8797-6d43-4191-985c-c48b773eb429]
+tempest.api.network.test_floating_ips_negative.FloatingIPNegativeTestJSON.test_create_floatingip_in_private_network[id-50b9aeb4-9f0b-48ee-aa31-fa955a48ff54]
+tempest.api.network.test_floating_ips_negative.FloatingIPNegativeTestJSON.test_create_floatingip_with_port_ext_net_unreachable[id-22996ea8-4a81-4b27-b6e1-fa5df92fa5e8]
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]
@@ -127,6 +168,7 @@ tempest.api.network.test_networks.NetworksTest.test_create_delete_subnet_with_ho
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_external_network_visibility[id-af774677-42a9-4e4b-bb58-16fe6a5bc1ec]
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]
@@ -145,6 +187,7 @@ tempest.api.network.test_networks.NetworksTestJSON.test_create_delete_subnet_wit
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_external_network_visibility[id-af774677-42a9-4e4b-bb58-16fe6a5bc1ec]
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]
@@ -159,10 +202,24 @@ tempest.api.network.test_ports.PortsTestJSON.test_create_port_in_allowed_allocat
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_port_list_filter_by_router_id[id-5ad01ed0-0e6e-4c5d-8194-232801b15c72]
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_routers.RoutersTest.test_add_multiple_router_interfaces[id-802c73c9-c937-4cef-824b-2191e24a6aab]
+tempest.api.network.test_routers.RoutersTest.test_add_remove_router_interface_with_port_id[id-2b7d2f37-6748-4d78-92e5-1d590234f0d5]
+tempest.api.network.test_routers.RoutersTest.test_add_remove_router_interface_with_subnet_id[id-b42e6e39-2e37-49cc-a6f4-8467e940900a]
+tempest.api.network.test_routers.RoutersTest.test_create_show_list_update_delete_router[id-f64403e2-8483-4b34-8ccd-b09a87bcc68c]
+tempest.api.network.test_routers.RoutersTest.test_router_interface_port_update_with_fixed_ip[id-96522edf-b4b5-45d9-8443-fa11c26e6eff]
+tempest.api.network.test_routers.RoutersTest.test_update_delete_extra_route[id-c86ac3a8-50bd-4b00-a6b8-62af84a0765c]
+tempest.api.network.test_routers.RoutersTest.test_update_extra_route[id-c86ac3a8-50bd-4b00-a6b8-62af84a0765c]
+tempest.api.network.test_routers.RoutersTest.test_update_router_admin_state[id-a8902683-c788-4246-95c7-ad9c6d63a4d9]
+tempest.api.network.test_routers_negative.RoutersNegativeTest.test_add_router_interfaces_on_overlapping_subnets_returns_400[id-957751a3-3c68-4fa2-93b6-eb52ea10db6e]
+tempest.api.network.test_routers_negative.RoutersNegativeTest.test_delete_non_existent_router_returns_404[id-c7edc5ad-d09d-41e6-a344-5c0c31e2e3e4]
+tempest.api.network.test_routers_negative.RoutersNegativeTest.test_router_add_gateway_invalid_network_returns_404[id-37a94fc0-a834-45b9-bd23-9a81d2fd1e22]
+tempest.api.network.test_routers_negative.RoutersNegativeTest.test_router_add_gateway_net_not_external_returns_400[id-11836a18-0b15-4327-a50b-f0d9dc66bddd]
+tempest.api.network.test_routers_negative.RoutersNegativeTest.test_router_remove_interface_in_use_returns_409[id-04df80f9-224d-47f5-837a-bf23e33d1c20]
+tempest.api.network.test_routers_negative.RoutersNegativeTest.test_show_non_existent_router_returns_404[id-c2a70d72-8826-43a7-8208-0209e6360c47]
+tempest.api.network.test_routers_negative.RoutersNegativeTest.test_update_non_existent_router_returns_404[id-b23d1569-8b0c-4169-8d4b-6abd34fad5c7]
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]
@@ -182,22 +239,52 @@ tempest.api.network.test_security_groups_negative.NegativeSecGroupTest.test_crea
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.network.test_versions.NetworksApiDiscovery.test_api_version_resources[id-cac8a836-c2e0-4304-b556-cd299c7281d1]
+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_versions.VersionsTest.test_list_versions[id-77838fc4-b49b-4c64-9533-166762517369]
+tempest.api.volume.test_volume_metadata.VolumesMetadataTest.test_create_get_delete_volume_metadata[id-6f5b125b-f664-44bf-910f-751591fe5769]
+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.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.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_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]
@@ -210,7 +297,26 @@ tempest.api.volume.test_volumes_list.VolumesV2ListTestJSON.test_volumes_list_by_
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.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_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]
@@ -221,27 +327,40 @@ tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_create_volum
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.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_snapshot_list_param_limit[id-db4d8e0a-7a2e-41cc-a712-961f6844e896]
+tempest.api.volume.test_volumes_snapshots_list.VolumesSnapshotListTestJSON.test_snapshot_list_param_limit_equals_infinite[id-a1427f61-420e-48a5-b6e3-0b394fa95400]
+tempest.api.volume.test_volumes_snapshots_list.VolumesSnapshotListTestJSON.test_snapshot_list_param_limit_equals_zero[id-e3b44b7f-ae87-45b5-8a8c-66110eb24d0a]
+tempest.api.volume.test_volumes_snapshots_list.VolumesSnapshotListTestJSON.test_snapshot_list_param_marker[id-05489dde-44bc-4961-a1f5-3ce7ee7824f7]
+tempest.api.volume.test_volumes_snapshots_list.VolumesSnapshotListTestJSON.test_snapshot_list_param_offset[id-ca96d551-17c6-4e11-b0e8-52d3bb8a63c7]
+tempest.api.volume.test_volumes_snapshots_list.VolumesSnapshotListTestJSON.test_snapshot_list_param_sort_created_at_asc[id-4052c3a0-2415-440a-a8cc-305a875331b0]
+tempest.api.volume.test_volumes_snapshots_list.VolumesSnapshotListTestJSON.test_snapshot_list_param_sort_created_at_desc[id-dcbbe24a-f3c0-4ec8-9274-55d48db8d1cf]
+tempest.api.volume.test_volumes_snapshots_list.VolumesSnapshotListTestJSON.test_snapshot_list_param_sort_id_asc[id-c5513ada-64c1-4d28-83b9-af3307ec1388]
+tempest.api.volume.test_volumes_snapshots_list.VolumesSnapshotListTestJSON.test_snapshot_list_param_sort_id_desc[id-8a7fe058-0b41-402a-8afd-2dbc5a4a718b]
+tempest.api.volume.test_volumes_snapshots_list.VolumesSnapshotListTestJSON.test_snapshot_list_param_sort_name_asc[id-d58b5fed-0c37-42d3-8c5d-39014ac13c00]
+tempest.api.volume.test_volumes_snapshots_list.VolumesSnapshotListTestJSON.test_snapshot_list_param_sort_name_desc[id-96ba6f4d-1f18-47e1-b4bc-76edc6c21250]
+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]
diff --git a/docker/smoke/hooks/post_checkout b/docker/smoke/hooks/post_checkout
index 8d0e98124..b23f6f449 100644
--- a/docker/smoke/hooks/post_checkout
+++ b/docker/smoke/hooks/post_checkout
@@ -1,6 +1,6 @@
-#!/bin/bash
+#!/bin/sh
-from="${DOCKER_REPO%/*}/functest-core:${DOCKER_TAG}"
+from="${DOCKER_REPO%/*}/functest-tempest:${DOCKER_TAG}"
sed -i "s|^FROM.*$|FROM ${from}|" Dockerfile
exit $?
diff --git a/docker/smoke/object.txt b/docker/smoke/object.txt
new file mode 100644
index 000000000..720532e2a
--- /dev/null
+++ b/docker/smoke/object.txt
@@ -0,0 +1,66 @@
+tempest.api.identity.v3.test_tokens.TokensV3Test.test_create_token[id-6f8e4436-fc96-4282-8122-e41df57197a9]
+tempest.api.identity.v3.test_tokens.TokensV3Test.test_token_auth_creation_existence_deletion[id-0f9f5a5f-d5cd-4a86-8a5b-c5ded151f212]
+tempest.api.object_storage.test_account_bulk.BulkTest.test_bulk_delete[id-c075e682-0d2a-43b2-808d-4116200d736d]
+tempest.api.object_storage.test_account_bulk.BulkTest.test_extract_archive[id-a407de51-1983-47cc-9f14-47c2b059413c]
+tempest.api.object_storage.test_account_quotas.AccountQuotasTest.test_upload_valid_object[id-a22ef352-a342-4587-8f47-3bbdb5b039c4]
+tempest.api.object_storage.test_account_quotas_negative.AccountQuotasNegativeTest.test_user_modify_quota[id-d1dc5076-555e-4e6d-9697-28f1fe976324]
+tempest.api.object_storage.test_account_services.AccountTest.test_list_containers[id-3499406a-ae53-4f8c-b43a-133d4dc6fe3f]
+tempest.api.object_storage.test_account_services.AccountTest.test_list_containers_with_end_marker[id-5ca164e4-7bde-43fa-bafb-913b53b9e786]
+tempest.api.object_storage.test_account_services.AccountTest.test_list_containers_with_format_json[id-1c7efa35-e8a2-4b0b-b5ff-862c7fd83704]
+tempest.api.object_storage.test_account_services.AccountTest.test_list_containers_with_limit[id-5cfa4ab2-4373-48dd-a41f-a532b12b08b2]
+tempest.api.object_storage.test_account_services.AccountTest.test_list_containers_with_limit_and_end_marker[id-888a3f0e-7214-4806-8e50-5e0c9a69bb5e]
+tempest.api.object_storage.test_account_services.AccountTest.test_list_containers_with_limit_and_marker[id-f7064ae8-dbcc-48da-b594-82feef6ea5af]
+tempest.api.object_storage.test_account_services.AccountTest.test_list_containers_with_limit_and_marker_and_end_marker[id-8cf98d9c-e3a0-4e44-971b-c87656fdddbd]
+tempest.api.object_storage.test_account_services.AccountTest.test_list_containers_with_marker[id-638f876d-6a43-482a-bbb3-0840bca101c6]
+tempest.api.object_storage.test_account_services.AccountTest.test_list_containers_with_marker_and_end_marker[id-ac8502c2-d4e4-4f68-85a6-40befea2ef5e]
+tempest.api.object_storage.test_account_services.AccountTest.test_list_extensions[id-6eb04a6a-4860-4e31-ba91-ea3347d76b58]
+tempest.api.object_storage.test_account_services.AccountTest.test_list_extensions[id-6eb04a6a-4860-4e31-ba91-ea3347d76b58]
+tempest.api.object_storage.test_account_services.AccountTest.test_list_no_account_metadata[id-b904c2e3-24c2-4dba-ad7d-04e90a761be5]
+tempest.api.object_storage.test_account_services.AccountTest.test_list_no_containers[id-884ec421-fbad-4fcc-916b-0580f2699565]
+tempest.api.object_storage.test_account_services.AccountTest.test_update_account_metadata_with_create_metadata_key[id-64fd53f3-adbd-4639-af54-436e4982dbfb]
+tempest.api.object_storage.test_account_services.AccountTest.test_update_account_metadata_with_delete_metadata[id-9f60348d-c46f-4465-ae06-d51dbd470953]
+tempest.api.object_storage.test_account_services.AccountTest.test_update_account_metadata_with_delete_metadata_key[id-d4d884d3-4696-4b85-bc98-4f57c4dd2bf1]
+tempest.api.object_storage.test_container_acl.ObjectTestACLs.test_read_object_with_rights[id-a3270f3f-7640-4944-8448-c7ea783ea5b6]
+tempest.api.object_storage.test_container_acl.ObjectTestACLs.test_write_object_with_rights[id-aa58bfa5-40d9-4bc3-82b4-d07f4a9e392a]
+tempest.api.object_storage.test_container_quotas.ContainerQuotasTest.test_upload_large_object[id-22eeeb2b-3668-4160-baef-44790f65a5a0]
+tempest.api.object_storage.test_container_quotas.ContainerQuotasTest.test_upload_too_many_objects[id-3a387039-697a-44fc-a9c0-935de31f426b]
+tempest.api.object_storage.test_container_quotas.ContainerQuotasTest.test_upload_valid_object[id-9a0fb034-86af-4df0-86fa-f8bd7db21ae0]
+tempest.api.object_storage.test_container_services.ContainerTest.test_create_container[id-92139d73-7819-4db1-85f8-3f2f22a8d91f]
+tempest.api.object_storage.test_container_services.ContainerTest.test_create_container_overwrite[id-49f866ed-d6af-4395-93e7-4187eb56d322]
+tempest.api.object_storage.test_container_services.ContainerTest.test_delete_container[id-95d3a249-b702-4082-a2c4-14bb860cf06a]
+tempest.api.object_storage.test_container_services.ContainerTest.test_list_container_contents[id-312ff6bd-5290-497f-bda1-7c5fec6697ab]
+tempest.api.object_storage.test_container_services.ContainerTest.test_list_container_contents_with_delimiter[id-fe323a32-57b9-4704-a996-2e68f83b09bc]
+tempest.api.object_storage.test_container_services.ContainerTest.test_list_container_contents_with_end_marker[id-55b4fa5c-e12e-4ca9-8fcf-a79afe118522]
+tempest.api.object_storage.test_container_services.ContainerTest.test_list_container_contents_with_format_json[id-196f5034-6ab0-4032-9da9-a937bbb9fba9]
+tempest.api.object_storage.test_container_services.ContainerTest.test_list_container_contents_with_limit[id-297ec38b-2b61-4ff4-bcd1-7fa055e97b61]
+tempest.api.object_storage.test_container_services.ContainerTest.test_list_container_contents_with_marker[id-c31ddc63-2a58-4f6b-b25c-94d2937e6867]
+tempest.api.object_storage.test_container_services.ContainerTest.test_list_container_contents_with_no_object[id-4646ac2d-9bfb-4c7d-a3c5-0f527402b3df]
+tempest.api.object_storage.test_container_services.ContainerTest.test_list_container_contents_with_path[id-58ca6cc9-6af0-408d-aaec-2a6a7b2f0df9]
+tempest.api.object_storage.test_container_services.ContainerTest.test_list_container_contents_with_prefix[id-77e742c7-caf2-4ec9-8aa4-f7d509a3344c]
+tempest.api.object_storage.test_container_services.ContainerTest.test_list_container_metadata[id-96e68f0e-19ec-4aa2-86f3-adc6a45e14dd]
+tempest.api.object_storage.test_container_services.ContainerTest.test_list_no_container_metadata[id-a2faf936-6b13-4f8d-92a2-c2278355821e]
+tempest.api.object_storage.test_container_services.ContainerTest.test_update_container_metadata_with_create_and_delete_metadata[id-cf19bc0b-7e16-4a5a-aaed-cb0c2fe8deef]
+tempest.api.object_storage.test_container_services.ContainerTest.test_update_container_metadata_with_create_metadata[id-2ae5f295-4bf1-4e04-bfad-21e54b62cec5]
+tempest.api.object_storage.test_container_services.ContainerTest.test_update_container_metadata_with_create_metadata_key[id-31f40a5f-6a52-4314-8794-cd89baed3040]
+tempest.api.object_storage.test_container_services.ContainerTest.test_update_container_metadata_with_delete_metadata[id-3a5ce7d4-6e4b-47d0-9d87-7cd42c325094]
+tempest.api.object_storage.test_container_services.ContainerTest.test_update_container_metadata_with_delete_metadata_key[id-a2e36378-6f1f-43f4-840a-ffd9cfd61914]
+tempest.api.object_storage.test_object_expiry.ObjectExpiryTest.test_get_object_after_expiry_time[id-fb024a42-37f3-4ba5-9684-4f40a7910b41]
+tempest.api.object_storage.test_object_services.ObjectTest.test_copy_object_2d_way[id-06f90388-2d0e-40aa-934c-e9a8833e958a]
+tempest.api.object_storage.test_object_services.ObjectTest.test_copy_object_across_containers[id-aa467252-44f3-472a-b5ae-5b57c3c9c147]
+tempest.api.object_storage.test_object_services.ObjectTest.test_copy_object_in_same_container[id-1a9ab572-1b66-4981-8c21-416e2a5e6011]
+tempest.api.object_storage.test_object_services.ObjectTest.test_copy_object_to_itself[id-2248abba-415d-410b-9c30-22dff9cd6e67]
+tempest.api.object_storage.test_object_services.ObjectTest.test_create_object[id-5b4ce26f-3545-46c9-a2ba-5754358a4c62]
+tempest.api.object_storage.test_object_services.ObjectTest.test_delete_object[id-17738d45-03bd-4d45-9e0b-7b2f58f98687]
+tempest.api.object_storage.test_object_services.ObjectTest.test_get_object[id-02610ba7-86b7-4272-9ed8-aa8d417cb3cd]
+tempest.api.object_storage.test_object_services.ObjectTest.test_get_object_if_different[id-50d01f12-526f-4360-9ac2-75dd508d7b68]
+tempest.api.object_storage.test_object_services.ObjectTest.test_get_object_with_x_object_manifest[id-e3e6a64a-9f50-4955-b987-6ce6767c97fb]
+tempest.api.object_storage.test_object_services.ObjectTest.test_list_object_metadata_with_x_object_manifest[id-23a3674c-d6de-46c3-86af-ff92bfc8a3da]
+tempest.api.object_storage.test_object_services.ObjectTest.test_object_upload_in_segments[id-e3e6a64a-9f50-4955-b987-6ce6767c97fb]
+tempest.api.object_storage.test_object_services.ObjectTest.test_object_upload_in_segments[id-e3e6a64a-9f50-4955-b987-6ce6767c97fb]
+tempest.api.object_storage.test_object_slo.ObjectSloTest.test_delete_large_object[id-87b6dfa1-abe9-404d-8bf0-6c3751e6aa77]
+tempest.api.object_storage.test_object_slo.ObjectSloTest.test_list_large_object_metadata[id-e69ad766-e1aa-44a2-bdd2-bf62c09c1456]
+tempest.api.object_storage.test_object_slo.ObjectSloTest.test_retrieve_large_object[id-49bc49bc-dd1b-4c0f-904e-d9f10b830ee8]
+tempest.api.object_storage.test_object_slo.ObjectSloTest.test_upload_manifest[id-2c3f24a6-36e8-4711-9aa2-800ee1fc7b5b]
+tempest.api.object_storage.test_object_temp_url.ObjectTempUrlTest.test_get_object_using_temp_url[id-f91c96d4-1230-4bba-8eb9-84476d18d991]
+tempest.api.object_storage.test_object_temp_url.ObjectTempUrlTest.test_put_object_using_temp_url[id-9b08dade-3571-4152-8a4f-a4f2a873a735]
+tempest.api.object_storage.test_object_version.ContainerTest.test_versioned_container[id-a151e158-dcbf-4a1f-a1e7-46cd65895a6f]
diff --git a/docker/smoke/platform.txt b/docker/smoke/platform.txt
new file mode 100644
index 000000000..4eca58790
--- /dev/null
+++ b/docker/smoke/platform.txt
@@ -0,0 +1,432 @@
+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.keypairs.test_keypairs_v22.KeyPairsV22TestJSON.test_keypairsv22_create_list_show_with_type[id-89d59d43-f735-441a-abcf-0601727f47b6]
+tempest.api.compute.security_groups.test_security_groups.SecurityGroupsTestJSON.test_list_security_groups_by_server[id-79517d60-535a-438f-af3d-e6feab1cbea7]
+tempest.api.compute.security_groups.test_security_groups.SecurityGroupsTestJSON.test_security_group_create_get_delete[id-ecc0da4a-2117-48af-91af-993cca39a615]
+tempest.api.compute.security_groups.test_security_groups.SecurityGroupsTestJSON.test_security_groups_create_list_delete[id-eb2b087d-633d-4d0d-a7bd-9e6ba35b32de]
+tempest.api.compute.security_groups.test_security_groups.SecurityGroupsTestJSON.test_server_security_groups[id-fe4abc0d-83f5-4c50-ad11-57a1127297a2]
+tempest.api.compute.security_groups.test_security_groups.SecurityGroupsTestJSON.test_update_security_groups[id-7d4e1d3c-3209-4d6d-b020-986304ebad1f]
+tempest.api.compute.security_groups.test_security_groups_negative.SecurityGroupsNegativeTestJSON.test_delete_nonexistent_security_group[id-6727c00b-214c-4f9e-9a52-017ac3e98411]
+tempest.api.compute.security_groups.test_security_groups_negative.SecurityGroupsNegativeTestJSON.test_delete_security_group_without_passing_id[id-1438f330-8fa4-4aeb-8a94-37c250106d7f]
+tempest.api.compute.security_groups.test_security_groups_negative.SecurityGroupsNegativeTestJSON.test_delete_the_default_security_group[id-36a1629f-c6da-4a26-b8b8-55e7e5d5cd58]
+tempest.api.compute.security_groups.test_security_groups_negative.SecurityGroupsNegativeTestJSON.test_security_group_get_nonexistent_group[id-673eaec1-9b3e-48ed-bdf1-2786c1b9661c]
+tempest.api.compute.security_groups.test_security_groups_negative.SecurityGroupsNegativeTestJSON.test_update_non_existent_security_group[id-27edee9c-873d-4da6-a68a-3c256efebe8f]
+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_ip_regex[id-a905e287-c35e-42f2-b132-d02b09f3654a]
+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_multiple_create.MultipleCreateTestJSON.test_multiple_create[id-61e03386-89c3-449c-9bb1-a06f423fd9d1]
+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_tags.ServerTagsTestJSON.test_check_tag_existence[id-81279a66-61c3-4759-b830-a2dbe64cbe08]
+tempest.api.compute.servers.test_server_tags.ServerTagsTestJSON.test_create_delete_tag[id-8d95abe2-c658-4c42-9a44-c0258500306b]
+tempest.api.compute.servers.test_server_tags.ServerTagsTestJSON.test_delete_all_tags[id-a63b2a74-e918-4b7c-bcab-10c855f3a57e]
+tempest.api.compute.servers.test_server_tags.ServerTagsTestJSON.test_update_all_tags[id-a2c1af8c-127d-417d-974b-8115f7e3d831]
+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_api_discovery.TestApiDiscovery.test_list_api_versions[id-721f480f-35b6-46c7-846e-047e6acea0dc]
+tempest.api.identity.v3.test_application_credentials.ApplicationCredentialsV3Test.test_create_application_credential[id-8080c75c-eddc-4786-941a-c2da7039ae61]
+tempest.api.identity.v3.test_application_credentials.ApplicationCredentialsV3Test.test_create_application_credential_expires[id-852daf0c-42b5-4239-8466-d193d0543ed3]
+tempest.api.identity.v3.test_application_credentials.ApplicationCredentialsV3Test.test_list_application_credentials[id-ff0cd457-6224-46e7-b79e-0ada4964a8a6]
+tempest.api.identity.v3.test_application_credentials.ApplicationCredentialsV3Test.test_query_application_credentials[id-9bb5e5cc-5250-493a-8869-8b665f6aa5f6]
+tempest.api.identity.v3.test_catalog.IdentityCatalogTest.test_catalog_standardization[id-56b57ced-22b8-4127-9b8a-565dfb0207e2]
+tempest.api.identity.v3.test_domains.DefaultDomainTestJSON.test_default_domain_exists[id-17a5de24-e6a0-4e4a-a9ee-d85b6e5612b5]
+tempest.api.identity.v3.test_tokens.TokensV3Test.test_create_token[id-6f8e4436-fc96-4282-8122-e41df57197a9]
+tempest.api.identity.v3.test_tokens.TokensV3Test.test_token_auth_creation_existence_deletion[id-0f9f5a5f-d5cd-4a86-8a5b-c5ded151f212]
+tempest.api.identity.v3.test_tokens.TokensV3Test.test_validate_token[id-a9512ac3-3909-48a4-b395-11f438e16260]
+tempest.api.identity.v3.test_users.IdentityV3UsersTest.test_password_history_check_self_service_api[id-941784ee-5342-4571-959b-b80dd2cea516]
+tempest.api.identity.v3.test_users.IdentityV3UsersTest.test_user_account_lockout[id-a7ad8bbf-2cff-4520-8c1d-96332e151658]
+tempest.api.image.v2.test_images.BasicOperationsImagesTest.test_delete_image[id-f848bb94-1c6e-45a4-8726-39e3a5b23535]
+tempest.api.image.v2.test_images.BasicOperationsImagesTest.test_register_upload_get_image_file[id-139b765e-7f3d-4b3d-8b37-3ca3876ee318]
+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_negative.ImagesNegativeTest.test_register_with_invalid_container_format[id-292bd310-369b-41c7-a7a3-10276ef76753]
+tempest.api.image.v2.test_images_negative.ImagesNegativeTest.test_register_with_invalid_disk_format[id-70c6040c-5a97-4111-9e13-e73665264ce1]
+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_dhcp_ipv6.NetworksTestDHCPv6.test_dhcp_stateful[id-4ab211a0-276f-4552-9070-51e27f58fecf]
+tempest.api.network.test_dhcp_ipv6.NetworksTestDHCPv6.test_dhcp_stateful_fixedips[id-51a5e97f-f02e-4e4e-9a17-a69811d300e3]
+tempest.api.network.test_dhcp_ipv6.NetworksTestDHCPv6.test_dhcp_stateful_fixedips_duplicate[id-57b8302b-cba9-4fbb-8835-9168df029051]
+tempest.api.network.test_dhcp_ipv6.NetworksTestDHCPv6.test_dhcp_stateful_fixedips_outrange[id-98244d88-d990-4570-91d4-6b25d70d08af]
+tempest.api.network.test_dhcp_ipv6.NetworksTestDHCPv6.test_dhcp_stateful_router[id-e98f65db-68f4-4330-9fea-abd8c5192d4d]
+tempest.api.network.test_dhcp_ipv6.NetworksTestDHCPv6.test_dhcpv6_64_subnets[id-4256c61d-c538-41ea-9147-3c450c36669e]
+tempest.api.network.test_dhcp_ipv6.NetworksTestDHCPv6.test_dhcpv6_invalid_options[id-81f18ef6-95b5-4584-9966-10d480b7496a]
+tempest.api.network.test_dhcp_ipv6.NetworksTestDHCPv6.test_dhcpv6_stateless_eui64[id-e5517e62-6f16-430d-a672-f80875493d4c]
+tempest.api.network.test_dhcp_ipv6.NetworksTestDHCPv6.test_dhcpv6_stateless_no_ra[id-ae2f4a5d-03ff-4c42-a3b0-ce2fcb7ea832]
+tempest.api.network.test_dhcp_ipv6.NetworksTestDHCPv6.test_dhcpv6_stateless_no_ra_no_dhcp[id-21635b6f-165a-4d42-bf49-7d195e47342f]
+tempest.api.network.test_dhcp_ipv6.NetworksTestDHCPv6.test_dhcpv6_two_subnets[id-4544adf7-bb5f-4bdc-b769-b3e77026cef2]
+tempest.api.network.test_floating_ips.FloatingIPTestJSON.test_create_floating_ip_specifying_a_fixed_ip_address[id-36de4bd0-f09c-43e3-a8e1-1decc1ffd3a5]
+tempest.api.network.test_floating_ips.FloatingIPTestJSON.test_create_update_floatingip_with_port_multiple_ip_address[id-45c4c683-ea97-41ef-9c51-5e9802f2f3d7]
+tempest.api.network.test_floating_ips.FloatingIPTestJSON.test_floating_ip_delete_port[id-e1f6bffd-442f-4668-b30e-df13f2705e77]
+tempest.api.network.test_floating_ips.FloatingIPTestJSON.test_floating_ip_update_different_router[id-1bb2f731-fe5a-4b8c-8409-799ade1bed4d]
+tempest.api.network.test_floating_ips_negative.FloatingIPNegativeTestJSON.test_associate_floatingip_port_ext_net_unreachable[id-6b3b8797-6d43-4191-985c-c48b773eb429]
+tempest.api.network.test_floating_ips_negative.FloatingIPNegativeTestJSON.test_create_floatingip_in_private_network[id-50b9aeb4-9f0b-48ee-aa31-fa955a48ff54]
+tempest.api.network.test_floating_ips_negative.FloatingIPNegativeTestJSON.test_create_floatingip_with_port_ext_net_unreachable[id-22996ea8-4a81-4b27-b6e1-fa5df92fa5e8]
+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_external_network_visibility[id-af774677-42a9-4e4b-bb58-16fe6a5bc1ec]
+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_external_network_visibility[id-af774677-42a9-4e4b-bb58-16fe6a5bc1ec]
+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_port_list_filter_by_router_id[id-5ad01ed0-0e6e-4c5d-8194-232801b15c72]
+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_routers.RoutersTest.test_add_multiple_router_interfaces[id-802c73c9-c937-4cef-824b-2191e24a6aab]
+tempest.api.network.test_routers.RoutersTest.test_add_remove_router_interface_with_port_id[id-2b7d2f37-6748-4d78-92e5-1d590234f0d5]
+tempest.api.network.test_routers.RoutersTest.test_add_remove_router_interface_with_subnet_id[id-b42e6e39-2e37-49cc-a6f4-8467e940900a]
+tempest.api.network.test_routers.RoutersTest.test_create_show_list_update_delete_router[id-f64403e2-8483-4b34-8ccd-b09a87bcc68c]
+tempest.api.network.test_routers.RoutersTest.test_router_interface_port_update_with_fixed_ip[id-96522edf-b4b5-45d9-8443-fa11c26e6eff]
+tempest.api.network.test_routers.RoutersTest.test_update_delete_extra_route[id-c86ac3a8-50bd-4b00-a6b8-62af84a0765c]
+tempest.api.network.test_routers.RoutersTest.test_update_extra_route[id-c86ac3a8-50bd-4b00-a6b8-62af84a0765c]
+tempest.api.network.test_routers.RoutersTest.test_update_router_admin_state[id-a8902683-c788-4246-95c7-ad9c6d63a4d9]
+tempest.api.network.test_routers_negative.RoutersNegativeTest.test_add_router_interfaces_on_overlapping_subnets_returns_400[id-957751a3-3c68-4fa2-93b6-eb52ea10db6e]
+tempest.api.network.test_routers_negative.RoutersNegativeTest.test_delete_non_existent_router_returns_404[id-c7edc5ad-d09d-41e6-a344-5c0c31e2e3e4]
+tempest.api.network.test_routers_negative.RoutersNegativeTest.test_router_add_gateway_invalid_network_returns_404[id-37a94fc0-a834-45b9-bd23-9a81d2fd1e22]
+tempest.api.network.test_routers_negative.RoutersNegativeTest.test_router_add_gateway_net_not_external_returns_400[id-11836a18-0b15-4327-a50b-f0d9dc66bddd]
+tempest.api.network.test_routers_negative.RoutersNegativeTest.test_router_remove_interface_in_use_returns_409[id-04df80f9-224d-47f5-837a-bf23e33d1c20]
+tempest.api.network.test_routers_negative.RoutersNegativeTest.test_show_non_existent_router_returns_404[id-c2a70d72-8826-43a7-8208-0209e6360c47]
+tempest.api.network.test_routers_negative.RoutersNegativeTest.test_update_non_existent_router_returns_404[id-b23d1569-8b0c-4169-8d4b-6abd34fad5c7]
+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.network.test_versions.NetworksApiDiscovery.test_api_version_resources[id-cac8a836-c2e0-4304-b556-cd299c7281d1]
+tempest.api.object_storage.test_account_bulk.BulkTest.test_bulk_delete[id-c075e682-0d2a-43b2-808d-4116200d736d]
+tempest.api.object_storage.test_account_bulk.BulkTest.test_extract_archive[id-a407de51-1983-47cc-9f14-47c2b059413c]
+tempest.api.object_storage.test_account_quotas.AccountQuotasTest.test_upload_valid_object[id-a22ef352-a342-4587-8f47-3bbdb5b039c4]
+tempest.api.object_storage.test_account_quotas_negative.AccountQuotasNegativeTest.test_user_modify_quota[id-d1dc5076-555e-4e6d-9697-28f1fe976324]
+tempest.api.object_storage.test_account_services.AccountTest.test_list_containers[id-3499406a-ae53-4f8c-b43a-133d4dc6fe3f]
+tempest.api.object_storage.test_account_services.AccountTest.test_list_containers_with_end_marker[id-5ca164e4-7bde-43fa-bafb-913b53b9e786]
+tempest.api.object_storage.test_account_services.AccountTest.test_list_containers_with_format_json[id-1c7efa35-e8a2-4b0b-b5ff-862c7fd83704]
+tempest.api.object_storage.test_account_services.AccountTest.test_list_containers_with_limit[id-5cfa4ab2-4373-48dd-a41f-a532b12b08b2]
+tempest.api.object_storage.test_account_services.AccountTest.test_list_containers_with_limit_and_end_marker[id-888a3f0e-7214-4806-8e50-5e0c9a69bb5e]
+tempest.api.object_storage.test_account_services.AccountTest.test_list_containers_with_limit_and_marker[id-f7064ae8-dbcc-48da-b594-82feef6ea5af]
+tempest.api.object_storage.test_account_services.AccountTest.test_list_containers_with_limit_and_marker_and_end_marker[id-8cf98d9c-e3a0-4e44-971b-c87656fdddbd]
+tempest.api.object_storage.test_account_services.AccountTest.test_list_containers_with_marker[id-638f876d-6a43-482a-bbb3-0840bca101c6]
+tempest.api.object_storage.test_account_services.AccountTest.test_list_containers_with_marker_and_end_marker[id-ac8502c2-d4e4-4f68-85a6-40befea2ef5e]
+tempest.api.object_storage.test_account_services.AccountTest.test_list_extensions[id-6eb04a6a-4860-4e31-ba91-ea3347d76b58]
+tempest.api.object_storage.test_account_services.AccountTest.test_list_extensions[id-6eb04a6a-4860-4e31-ba91-ea3347d76b58]
+tempest.api.object_storage.test_account_services.AccountTest.test_list_no_account_metadata[id-b904c2e3-24c2-4dba-ad7d-04e90a761be5]
+tempest.api.object_storage.test_account_services.AccountTest.test_list_no_containers[id-884ec421-fbad-4fcc-916b-0580f2699565]
+tempest.api.object_storage.test_account_services.AccountTest.test_update_account_metadata_with_create_metadata_key[id-64fd53f3-adbd-4639-af54-436e4982dbfb]
+tempest.api.object_storage.test_account_services.AccountTest.test_update_account_metadata_with_delete_metadata[id-9f60348d-c46f-4465-ae06-d51dbd470953]
+tempest.api.object_storage.test_account_services.AccountTest.test_update_account_metadata_with_delete_metadata_key[id-d4d884d3-4696-4b85-bc98-4f57c4dd2bf1]
+tempest.api.object_storage.test_container_acl.ObjectTestACLs.test_read_object_with_rights[id-a3270f3f-7640-4944-8448-c7ea783ea5b6]
+tempest.api.object_storage.test_container_acl.ObjectTestACLs.test_write_object_with_rights[id-aa58bfa5-40d9-4bc3-82b4-d07f4a9e392a]
+tempest.api.object_storage.test_container_quotas.ContainerQuotasTest.test_upload_large_object[id-22eeeb2b-3668-4160-baef-44790f65a5a0]
+tempest.api.object_storage.test_container_quotas.ContainerQuotasTest.test_upload_too_many_objects[id-3a387039-697a-44fc-a9c0-935de31f426b]
+tempest.api.object_storage.test_container_quotas.ContainerQuotasTest.test_upload_valid_object[id-9a0fb034-86af-4df0-86fa-f8bd7db21ae0]
+tempest.api.object_storage.test_container_services.ContainerTest.test_create_container[id-92139d73-7819-4db1-85f8-3f2f22a8d91f]
+tempest.api.object_storage.test_container_services.ContainerTest.test_create_container_overwrite[id-49f866ed-d6af-4395-93e7-4187eb56d322]
+tempest.api.object_storage.test_container_services.ContainerTest.test_delete_container[id-95d3a249-b702-4082-a2c4-14bb860cf06a]
+tempest.api.object_storage.test_container_services.ContainerTest.test_list_container_contents[id-312ff6bd-5290-497f-bda1-7c5fec6697ab]
+tempest.api.object_storage.test_container_services.ContainerTest.test_list_container_contents_with_delimiter[id-fe323a32-57b9-4704-a996-2e68f83b09bc]
+tempest.api.object_storage.test_container_services.ContainerTest.test_list_container_contents_with_end_marker[id-55b4fa5c-e12e-4ca9-8fcf-a79afe118522]
+tempest.api.object_storage.test_container_services.ContainerTest.test_list_container_contents_with_format_json[id-196f5034-6ab0-4032-9da9-a937bbb9fba9]
+tempest.api.object_storage.test_container_services.ContainerTest.test_list_container_contents_with_limit[id-297ec38b-2b61-4ff4-bcd1-7fa055e97b61]
+tempest.api.object_storage.test_container_services.ContainerTest.test_list_container_contents_with_marker[id-c31ddc63-2a58-4f6b-b25c-94d2937e6867]
+tempest.api.object_storage.test_container_services.ContainerTest.test_list_container_contents_with_no_object[id-4646ac2d-9bfb-4c7d-a3c5-0f527402b3df]
+tempest.api.object_storage.test_container_services.ContainerTest.test_list_container_contents_with_path[id-58ca6cc9-6af0-408d-aaec-2a6a7b2f0df9]
+tempest.api.object_storage.test_container_services.ContainerTest.test_list_container_contents_with_prefix[id-77e742c7-caf2-4ec9-8aa4-f7d509a3344c]
+tempest.api.object_storage.test_container_services.ContainerTest.test_list_container_metadata[id-96e68f0e-19ec-4aa2-86f3-adc6a45e14dd]
+tempest.api.object_storage.test_container_services.ContainerTest.test_list_no_container_metadata[id-a2faf936-6b13-4f8d-92a2-c2278355821e]
+tempest.api.object_storage.test_container_services.ContainerTest.test_update_container_metadata_with_create_and_delete_metadata[id-cf19bc0b-7e16-4a5a-aaed-cb0c2fe8deef]
+tempest.api.object_storage.test_container_services.ContainerTest.test_update_container_metadata_with_create_metadata[id-2ae5f295-4bf1-4e04-bfad-21e54b62cec5]
+tempest.api.object_storage.test_container_services.ContainerTest.test_update_container_metadata_with_create_metadata_key[id-31f40a5f-6a52-4314-8794-cd89baed3040]
+tempest.api.object_storage.test_container_services.ContainerTest.test_update_container_metadata_with_delete_metadata[id-3a5ce7d4-6e4b-47d0-9d87-7cd42c325094]
+tempest.api.object_storage.test_container_services.ContainerTest.test_update_container_metadata_with_delete_metadata_key[id-a2e36378-6f1f-43f4-840a-ffd9cfd61914]
+tempest.api.object_storage.test_object_expiry.ObjectExpiryTest.test_get_object_after_expiry_time[id-fb024a42-37f3-4ba5-9684-4f40a7910b41]
+tempest.api.object_storage.test_object_services.ObjectTest.test_copy_object_2d_way[id-06f90388-2d0e-40aa-934c-e9a8833e958a]
+tempest.api.object_storage.test_object_services.ObjectTest.test_copy_object_across_containers[id-aa467252-44f3-472a-b5ae-5b57c3c9c147]
+tempest.api.object_storage.test_object_services.ObjectTest.test_copy_object_in_same_container[id-1a9ab572-1b66-4981-8c21-416e2a5e6011]
+tempest.api.object_storage.test_object_services.ObjectTest.test_copy_object_to_itself[id-2248abba-415d-410b-9c30-22dff9cd6e67]
+tempest.api.object_storage.test_object_services.ObjectTest.test_create_object[id-5b4ce26f-3545-46c9-a2ba-5754358a4c62]
+tempest.api.object_storage.test_object_services.ObjectTest.test_delete_object[id-17738d45-03bd-4d45-9e0b-7b2f58f98687]
+tempest.api.object_storage.test_object_services.ObjectTest.test_get_object[id-02610ba7-86b7-4272-9ed8-aa8d417cb3cd]
+tempest.api.object_storage.test_object_services.ObjectTest.test_get_object_if_different[id-50d01f12-526f-4360-9ac2-75dd508d7b68]
+tempest.api.object_storage.test_object_services.ObjectTest.test_get_object_with_x_object_manifest[id-e3e6a64a-9f50-4955-b987-6ce6767c97fb]
+tempest.api.object_storage.test_object_services.ObjectTest.test_list_object_metadata_with_x_object_manifest[id-23a3674c-d6de-46c3-86af-ff92bfc8a3da]
+tempest.api.object_storage.test_object_services.ObjectTest.test_object_upload_in_segments[id-e3e6a64a-9f50-4955-b987-6ce6767c97fb]
+tempest.api.object_storage.test_object_services.ObjectTest.test_object_upload_in_segments[id-e3e6a64a-9f50-4955-b987-6ce6767c97fb]
+tempest.api.object_storage.test_object_slo.ObjectSloTest.test_delete_large_object[id-87b6dfa1-abe9-404d-8bf0-6c3751e6aa77]
+tempest.api.object_storage.test_object_slo.ObjectSloTest.test_list_large_object_metadata[id-e69ad766-e1aa-44a2-bdd2-bf62c09c1456]
+tempest.api.object_storage.test_object_slo.ObjectSloTest.test_retrieve_large_object[id-49bc49bc-dd1b-4c0f-904e-d9f10b830ee8]
+tempest.api.object_storage.test_object_slo.ObjectSloTest.test_upload_manifest[id-2c3f24a6-36e8-4711-9aa2-800ee1fc7b5b]
+tempest.api.object_storage.test_object_temp_url.ObjectTempUrlTest.test_get_object_using_temp_url[id-f91c96d4-1230-4bba-8eb9-84476d18d991]
+tempest.api.object_storage.test_object_temp_url.ObjectTempUrlTest.test_put_object_using_temp_url[id-9b08dade-3571-4152-8a4f-a4f2a873a735]
+tempest.api.object_storage.test_object_version.ContainerTest.test_versioned_container[id-a151e158-dcbf-4a1f-a1e7-46cd65895a6f]
+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_versions.VersionsTest.test_list_versions[id-77838fc4-b49b-4c64-9533-166762517369]
+tempest.api.volume.test_volume_metadata.VolumesMetadataTest.test_create_get_delete_volume_metadata[id-6f5b125b-f664-44bf-910f-751591fe5769]
+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_update_volume_metadata_item[id-862261c5-8df4-475a-8c21-946e50e36a20]
+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_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_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_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_snapshot_list_param_limit[id-db4d8e0a-7a2e-41cc-a712-961f6844e896]
+tempest.api.volume.test_volumes_snapshots_list.VolumesSnapshotListTestJSON.test_snapshot_list_param_limit_equals_infinite[id-a1427f61-420e-48a5-b6e3-0b394fa95400]
+tempest.api.volume.test_volumes_snapshots_list.VolumesSnapshotListTestJSON.test_snapshot_list_param_limit_equals_zero[id-e3b44b7f-ae87-45b5-8a8c-66110eb24d0a]
+tempest.api.volume.test_volumes_snapshots_list.VolumesSnapshotListTestJSON.test_snapshot_list_param_marker[id-05489dde-44bc-4961-a1f5-3ce7ee7824f7]
+tempest.api.volume.test_volumes_snapshots_list.VolumesSnapshotListTestJSON.test_snapshot_list_param_offset[id-ca96d551-17c6-4e11-b0e8-52d3bb8a63c7]
+tempest.api.volume.test_volumes_snapshots_list.VolumesSnapshotListTestJSON.test_snapshot_list_param_sort_created_at_asc[id-4052c3a0-2415-440a-a8cc-305a875331b0]
+tempest.api.volume.test_volumes_snapshots_list.VolumesSnapshotListTestJSON.test_snapshot_list_param_sort_created_at_desc[id-dcbbe24a-f3c0-4ec8-9274-55d48db8d1cf]
+tempest.api.volume.test_volumes_snapshots_list.VolumesSnapshotListTestJSON.test_snapshot_list_param_sort_id_asc[id-c5513ada-64c1-4d28-83b9-af3307ec1388]
+tempest.api.volume.test_volumes_snapshots_list.VolumesSnapshotListTestJSON.test_snapshot_list_param_sort_id_desc[id-8a7fe058-0b41-402a-8afd-2dbc5a4a718b]
+tempest.api.volume.test_volumes_snapshots_list.VolumesSnapshotListTestJSON.test_snapshot_list_param_sort_name_asc[id-d58b5fed-0c37-42d3-8c5d-39014ac13c00]
+tempest.api.volume.test_volumes_snapshots_list.VolumesSnapshotListTestJSON.test_snapshot_list_param_sort_name_desc[id-96ba6f4d-1f18-47e1-b4bc-76edc6c21250]
+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/docker/smoke/testcases.yaml b/docker/smoke/testcases.yaml
index e2a6237c3..77bee5704 100644
--- a/docker/smoke/testcases.yaml
+++ b/docker/smoke/testcases.yaml
@@ -2,59 +2,93 @@
tiers:
-
name: smoke
- order: 1
- ci_loop: '(daily)|(weekly)'
description: >-
Set of basic Functional tests to validate the OPNFV scenarios.
testcases:
-
- case_name: vping_ssh
+ case_name: tempest_neutron
project_name: functest
criteria: 100
- blocking: true
+ blocking: false
description: >-
- 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: '^((?!lxd).)*$'
+ 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:
- module: 'functest.opnfv_tests.openstack.vping.vping_ssh'
- class: 'VPingSSH'
+ name: tempest_common
+ args:
+ mode: '^neutron_tempest_plugin\.api'
+ option:
+ - '--concurrency=4'
-
- case_name: vping_userdata
+ case_name: tempest_cinder
project_name: functest
criteria: 100
- blocking: true
+ blocking: false
description: >-
- This test case verifies: 1) Boot a VM with given userdata.
- 2) Connectivity between 2 instances over a private network.
- dependencies:
- installer: ''
- scenario: '^((?!lxd).)*$'
+ This test case runs the Tempest suite proposed by the
+ Cinder project.
run:
- module:
- 'functest.opnfv_tests.openstack.vping.vping_userdata'
- class: 'VPingUserdata'
+ 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_smoke_serial
+ case_name: tempest_keystone
project_name: functest
criteria: 100
blocking: false
description: >-
- This test case runs the smoke subset of the OpenStack
- Tempest suite. The list of test cases is generated by
- Tempest automatically and depends on the parameters of
- the OpenStack deplopyment.
- dependencies:
- installer: ''
- scenario: ''
+ 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:
- module: 'functest.opnfv_tests.openstack.tempest.tempest'
- class: 'TempestSmokeSerial'
+ 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
@@ -64,105 +98,303 @@ tiers:
description: >-
This test case runs a sub group of tests of the OpenStack
Rally suite in smoke mode.
+ run:
+ name: rally_sanity
+ args:
+ optional:
+ - 'gnocchi'
+ - 'barbican'
+
+ -
+ case_name: refstack_compute
+ project_name: functest
+ criteria: 100
+ blocking: false
+ description: >-
+ This test case runs a sub group of tests of the OpenStack
+ Compute testcases.
dependencies:
- installer: ''
- scenario: ''
+ - NO_TENANT_NETWORK: '^(?![tT]rue$)'
run:
- module: 'functest.opnfv_tests.openstack.rally.rally'
- class: 'RallySanity'
+ name: refstack
+ args:
+ target: compute
+ option:
+ - '--concurrency=4'
-
- case_name: refstack_defcore
+ case_name: refstack_object
project_name: functest
- enabled: false
criteria: 100
blocking: false
description: >-
This test case runs a sub group of tests of the OpenStack
- Defcore testcases.
+ Object testcases.
+ run:
+ name: refstack
+ args:
+ target: object
+ option:
+ - '--concurrency=4'
+
+ -
+ case_name: refstack_platform
+ project_name: functest
+ criteria: 100
+ blocking: false
+ description: >-
+ This test case runs a sub group of tests of the OpenStack
+ Platform testcases.
dependencies:
- installer: ''
- scenario: ''
+ - NO_TENANT_NETWORK: '^(?![tT]rue$)'
run:
- module:
- 'functest.opnfv_tests.openstack.refstack.refstack'
- class: 'Refstack'
+ name: refstack
+ args:
+ target: platform
+ option:
+ - '--concurrency=4'
-
- case_name: patrole
+ case_name: tempest_full
+ 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#L83
+ run:
+ name: tempest_common
+ args:
+ mode: '(?!.*\[.*\bslow\b.*\])(^tempest\.api)'
+ option:
+ - '--concurrency=4'
+
+ -
+ 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:
+ name: tempest_common
+ args:
+ mode: '(?!.*\[.*\bslow\b.*\])(^tempest\.scenario)'
+ option:
+ - '--concurrency=1'
+
+ -
+ case_name: tempest_slow
+ 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:
+ name: tempest_common
+ args:
+ mode: '(?=.*\[.*\bslow\b.*\])(^tempest\.)'
+ option:
+ - '--concurrency=1'
+
+ -
+ case_name: patrole_admin
project_name: functest
criteria: 100
blocking: false
description: >-
Test suite from Patrole project.
- dependencies:
- installer: ''
- scenario: ''
run:
- module: 'functest.opnfv_tests.openstack.patrole.patrole'
- class: 'Patrole'
+ name: patrole
args:
- role: 'admin'
- services:
- - 'image'
- - 'network'
- exclude:
- - 'test_networks_multiprovider_rbac'
+ 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: odl
+ case_name: patrole_member
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'
+ Test suite from Patrole project.
run:
- module: 'functest.opnfv_tests.sdn.odl.odl'
- class: 'ODLTests'
+ name: patrole
args:
- suites:
- - /src/odl_test/csit/suites/integration/basic
- - /src/odl_test/csit/suites/openstack/neutron
+ 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: snaps_smoke
+ case_name: patrole_reader
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.
+ Test suite from Patrole project.
+ run:
+ 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'
- dependencies:
- installer: ''
- scenario: '^((?!lxd).)*$'
+ -
+ case_name: tempest_barbican
+ project_name: functest
+ criteria: 100
+ blocking: false
+ description: >-
+ It leverages on the tempest plugin containing tests used to
+ verify the functionality of a barbican installation.
run:
- module: 'functest.opnfv_tests.openstack.snaps.smoke'
- class: 'SnapsSmoke'
+ name: barbican
+ args:
+ mode:
+ '^barbican_tempest_plugin.((?!test_signed_image_upload_boot_failure).)*$'
+ services:
+ - barbican
+ option:
+ - '--concurrency=4'
-
- case_name: neutron_trunk
+ case_name: tempest_octavia
project_name: functest
criteria: 100
blocking: false
description: >-
- This test case runs the neutron trunk subtest of the
- OpenStack Tempest suite. The list of test cases is
- generated by Tempest having as input the relevant
- testcase list file.
- dependencies:
- installer: '(fuel)|(apex)|(compass)'
- scenario: ''
+ 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:
- module: 'functest.opnfv_tests.openstack.tempest.tempest'
- class: 'TempestNeutronTrunk'
+ name: tempest_common
+ args:
+ mode: '^cyborg_tempest_plugin'
+ services:
+ - cyborg
+ option:
+ - '--concurrency=4'
diff --git a/docker/vnf/Dockerfile b/docker/vnf/Dockerfile
index afaec2320..99f848fcd 100644
--- a/docker/vnf/Dockerfile
+++ b/docker/vnf/Dockerfile
@@ -1,34 +1,58 @@
FROM opnfv/functest-core
-ARG BRANCH=master
-ARG OPENSTACK_TAG=stable/queens
-ARG VIMS_TAG=stable
-ARG JUJU_TAG=tags/juju-2.2.5
-
-ENV GOPATH /src/epc-requirements/go
-ENV GOBIN /src/epc-requirements/go/bin
-ENV PATH $GOBIN:$PATH
+ARG VIMS_TEST_TAG=release-130
+ARG QUAFF_TAG=59213d6d8ee29433552bb75f505cdc96b0b18909
+ARG CLOUDIFY_VIMS_TAG=gambia
+ARG HEAT_VIMS_TAG=release-130
+ARG VROUTER_TAG=fraser
+ARG VROUTER_BP_TAG=9b76d46a388d32d4985797620e67c2ed3315b3e4
+ARG ABOT_CHARM=opnfv-fraser
+COPY clearwater-heat-singlenet-deps.patch /tmp/clearwater-heat-singlenet-deps.patch
RUN apk --no-cache add --update \
- ruby ruby-bundler ruby-irb ruby-rdoc dnsmasq \
- procps libxslt libxml2 zlib libffi python3 go musl-dev && \
+ ruby ruby-bundler ruby-irb ruby-rdoc \
+ procps libxslt libxml2 zlib libffi musl-dev && \
apk --no-cache add --virtual .build-deps --update \
- ruby-dev g++ make libxslt-dev libxml2-dev zlib-dev libffi-dev && \
- wget -q -O- https://git.openstack.org/cgit/openstack/requirements/plain/upper-constraints.txt?h=$OPENSTACK_TAG | \
- sed -E s/^tempest==+\(.*\)$/-e\ git+https:\\/\\/github.com\\/openstack\\/tempest@\\1#egg=tempest/ | \
- > upper-constraints.txt && \
- git clone --depth 1 -b $VIMS_TAG https://github.com/boucherv-orange/clearwater-live-test /src/vims-test && \
- git clone https://github.com/RebacaInc/abot_charm.git /src/epc-requirements/abot_charm && \
- python3 -m pip install --no-cache-dir --src /src -cupper-constraints.txt \
- -chttps://git.opnfv.org/functest/plain/upper-constraints.txt?h=$BRANCH \
- juju-wait && \
- go get github.com/rogpeppe/godeps && \
- go get -d -v github.com/juju/juju/... || true && \
- (cd $GOPATH/src/github.com/juju/juju && git checkout $JUJU_TAG && godeps -u dependencies.tsv) && \
- go install -v github.com/juju/juju/... && \
- rm -rf $GOPATH/go/src/ $GOPATH/pkg && \
- (cd /src/vims-test && bundle config build.nokogiri --use-system-libraries && bundle install --system) && \
- rm -r upper-constraints.txt /src/vims-test/.git /src/epc-requirements/abot_charm/.git && \
+ ruby-dev g++ make libxslt-dev libxml2-dev zlib-dev libffi-dev patch && \
+ git init /src/vims-test && \
+ (cd /src/vims-test && \
+ git fetch --tags https://github.com/Metaswitch/clearwater-live-test $VIMS_TEST_TAG && \
+ git checkout FETCH_HEAD) && \
+ sed -i s/unf_ext\ \(.*\)/unf_ext\ \(0.0.7.4\)/g /src/vims-test/Gemfile.lock && \
+ git init /src/vims-test/quaff && \
+ (cd /src/vims-test/quaff && \
+ git fetch --tags https://github.com/Metaswitch/quaff $QUAFF_TAG && \
+ git checkout FETCH_HEAD) && \
+ git init /src/vims-test/build-infra && \
+ (cd /src/vims-test/build-infra && \
+ git fetch --tags https://github.com/Metaswitch/clearwater-build-infra $VIMS_TEST_TAG && \
+ git checkout FETCH_HEAD) && \
+ git init /src/cloudify_vims && \
+ (cd /src/cloudify_vims && \
+ git fetch --tags https://github.com/Orange-OpenSource/opnfv-cloudify-clearwater.git $CLOUDIFY_VIMS_TAG && \
+ git checkout FETCH_HEAD) && \
+ git init /src/heat_vims && \
+ (cd /src/heat_vims && \
+ git fetch --tags https://github.com/Metaswitch/clearwater-heat.git $HEAT_VIMS_TAG && \
+ git checkout FETCH_HEAD && \
+ patch -p1 < /tmp/clearwater-heat-singlenet-deps.patch) && \
+ git init /src/opnfv-vnf-vyos-blueprint && \
+ (cd /src/opnfv-vnf-vyos-blueprint && \
+ git fetch --tags https://github.com/oolorg/opnfv-vnf-vyos-blueprint.git $VROUTER_BP_TAG && \
+ git checkout FETCH_HEAD) && \
+ mkdir -p /home/opnfv/functest/data/router && \
+ git init /home/opnfv/functest/data/router/opnfv-vnf-data && \
+ (cd /home/opnfv/functest/data/router/opnfv-vnf-data && \
+ git fetch --tags https://github.com/oolorg/opnfv-vnf-data.git $VROUTER_TAG && \
+ git checkout FETCH_HEAD) && \
+ git init /src/epc-requirements/abot_charm && \
+ (cd /src/epc-requirements/abot_charm && \
+ git fetch --tags https://github.com/collivier/abot_charm.git $ABOT_CHARM && \
+ git checkout FETCH_HEAD) && \
+ (cd /src/vims-test && bundle config build.nokogiri --use-system-libraries && bundle install --system && bundle update rest-client) && \
+ rm -r /src/vims-test/.git /src/cloudify_vims/.git /src/heat_vims/.git /src/vims-test/quaff/.git \
+ /src/vims-test/build-infra/.git /src/opnfv-vnf-vyos-blueprint/.git \
+ /tmp/clearwater-heat-singlenet-deps.patch && \
apk del .build-deps
-COPY testcases.yaml /usr/lib/python2.7/site-packages/xtesting/ci/testcases.yaml
+COPY testcases.yaml /etc/xtesting/testcases.yaml
CMD ["run_tests", "-t", "all"]
diff --git a/docker/vnf/clearwater-heat-singlenet-deps.patch b/docker/vnf/clearwater-heat-singlenet-deps.patch
new file mode 100644
index 000000000..0e075f9f8
--- /dev/null
+++ b/docker/vnf/clearwater-heat-singlenet-deps.patch
@@ -0,0 +1,1849 @@
+diff --git a/bono.yaml b/bono.yaml
+index f0189cd..cc03838 100644
+--- a/bono.yaml
++++ b/bono.yaml
+@@ -23,26 +23,6 @@ parameters:
+ constraints:
+ - custom_constraint: neutron.network
+ description: Must be a valid network ID
+- public_sig_net_id:
+- type: string
+- description: ID of public signaling network
+- constraints:
+- - custom_constraint: neutron.network
+- description: Must be a valid network ID
+- private_sig_net_id:
+- type: string
+- description: ID of private signaling network
+- constraints:
+- - custom_constraint: neutron.network
+- description: Must be a valid network ID
+- private_sig_net_cidr:
+- type: string
+- description: Private signaling network address (CIDR notation)
+- default: 192.168.1.0/24
+- private_sig_net_gateway:
+- type: string
+- description: Private signaling network gateway address
+- default: 192.168.1.254
+ flavor:
+ type: string
+ description: Flavor to use
+@@ -64,9 +44,6 @@ parameters:
+ base_mgmt_security_group:
+ type: string
+ description: ID of base security group for all Clearwater nodes (managment)
+- bono_sig_security_group:
+- type: string
+- description: ID of security group for Bono nodes (signaling)
+ repo_url:
+ type: string
+ description: URL for Clearwater repository
+@@ -78,9 +55,6 @@ parameters:
+ dns_mgmt_ip:
+ type: string
+ description: IP address for DNS server on management network
+- dns_sig_ip:
+- type: string
+- description: IP address for DNS server on signaling network
+ dnssec_key:
+ type: string
+ description: DNSSEC private key (Base64-encoded)
+@@ -111,19 +85,15 @@ resources:
+ floating_network_id: { get_param: public_mgmt_net_id }
+ port_id: { get_resource: mgmt_port }
+
+- sig_port:
+- type: OS::Neutron::Port
++ wait_condition:
++ type: OS::Heat::WaitCondition
+ properties:
+- # Specify the network ID by string to work around OpenStack issues - see https://github.com/Metaswitch/clearwater-heat/issues/18.
+- network_id: { str_replace: { params: { x: { get_param: private_sig_net_id } }, template: x } }
+- security_groups:
+- - { get_param: bono_sig_security_group }
++ handle: {get_resource: wait_handle}
++ count: 1
++ timeout: 1200
+
+- sig_floating_ip:
+- type: OS::Neutron::FloatingIP
+- properties:
+- floating_network_id: { get_param: public_sig_net_id }
+- port_id: { get_resource: sig_port }
++ wait_handle:
++ type: OS::Heat::WaitConditionHandle
+
+ server:
+ type: OS::Nova::Server
+@@ -134,7 +104,6 @@ resources:
+ key_name: { get_param: key_name }
+ networks:
+ - port: { get_resource: mgmt_port }
+- - port: { get_resource: sig_port }
+ user_data_format: RAW
+ user_data:
+ str_replace:
+@@ -143,15 +112,11 @@ resources:
+ __zone__: { get_param: zone }
+ __public_mgmt_ip__: { get_attr: [ mgmt_floating_ip, floating_ip_address ] }
+ __private_mgmt_ip__: { get_attr: [ mgmt_port, fixed_ips, 0, ip_address ] }
+- __public_sig_ip__: { get_attr: [ sig_floating_ip, floating_ip_address ] }
+- __private_sig_ip__: { get_attr: [ sig_port, fixed_ips, 0, ip_address ] }
+- __private_sig_cidr__: { get_param: private_sig_net_cidr }
+- __private_sig_gateway__: { get_param: private_sig_net_gateway }
+ __dns_mgmt_ip__: { get_param: dns_mgmt_ip }
+- __dns_sig_ip__: { get_param: dns_sig_ip }
+ __dnssec_key__: { get_param: dnssec_key }
+ __etcd_ip__ : { get_param: etcd_ip }
+ __index__ : { get_param: index }
++ wc_notify: { get_attr: [wait_handle, curl_cli] }
+ template: |
+ #!/bin/bash
+
+@@ -159,36 +124,8 @@ resources:
+ exec > >(tee -a /var/log/clearwater-heat-bono.log) 2>&1
+ set -x
+
+- # Set up the signaling network namespace on each boot by creating an init file and
+- # linking to it from runlevel 2 and 3
+- cat >/etc/init.d/signaling_namespace <<EOF
+- #!/bin/bash
+- # Create the signaling namespace and configure its interfaces.
+- set -e
+-
+- # Exit if the namespace is already set up.
+- ip netns list | grep -q signaling && exit 0
+-
+- # eth1 is the signaling interface (and eth0 is the management interface).
+- # We need to set eth1 up manually - only eth0 is automatically configured via DHCP.
+- ip netns add signaling
+- ip link set eth1 netns signaling
+- ip netns exec signaling ip link set dev lo up
+- ip netns exec signaling ip addr add __private_sig_ip__/$(echo __private_sig_cidr__ | cut -d / -f 2) dev eth1
+- ip netns exec signaling ip link set dev eth1 up
+- ip netns exec signaling ip route add default via __private_sig_gateway__
+- EOF
+-
+- chmod a+x /etc/init.d/signaling_namespace
+- ln -s /etc/init.d/signaling_namespace /etc/rc2.d/S01signaling_namespace
+- ln -s /etc/init.d/signaling_namespace /etc/rc3.d/S01signaling_namespace
+-
+- # Also set up the signaling namespace now.
+- /etc/init.d/signaling_namespace
+-
+ # Configure the APT software source.
+- echo 'deb __repo_url__ binary/' > /etc/apt/sources.list.d/clearwater.list
+- curl -L http://repo.cw-ngv.com/repo_key | apt-key add -
++ echo 'deb http://artifacts.opnfv.org/functest/clearwater/debian ./' > /etc/apt/sources.list.d/clearwater.list
+ apt-get update
+
+ # Configure /etc/clearwater/local_config.
+@@ -196,11 +133,8 @@ resources:
+ etcd_ip=__etcd_ip__
+ [ -n "$etcd_ip" ] || etcd_ip=__private_mgmt_ip__
+ cat > /etc/clearwater/local_config << EOF
+- signaling_namespace=signaling
+- signaling_dns_server=__dns_sig_ip__
+- management_local_ip=__private_mgmt_ip__
+- local_ip=__private_sig_ip__
+- public_ip=__public_sig_ip__
++ local_ip=__private_mgmt_ip__
++ public_ip=__public_mgmt_ip__
+ public_hostname=__index__.bono.__zone__
+ etcd_cluster=$etcd_ip
+ EOF
+@@ -223,8 +157,8 @@ resources:
+ while ! { nsupdate -y "__zone__:__dnssec_key__" -v << EOF
+ server __dns_mgmt_ip__
+ update add bono-__index__.__zone__. 30 $(ip2rr __public_mgmt_ip__)
+- update add __index__.bono.__zone__. 30 $(ip2rr __public_sig_ip__)
+- update add __zone__. 30 $(ip2rr __public_sig_ip__)
++ update add __index__.bono.__zone__. 30 $(ip2rr __public_mgmt_ip__)
++ update add __zone__. 30 $(ip2rr __public_mgmt_ip__)
+ update add __zone__. 30 NAPTR 0 0 "s" "SIP+D2T" "" _sip._tcp.__zone__.
+ update add __zone__. 30 NAPTR 0 0 "s" "SIP+D2U" "" _sip._udp.__zone__.
+ update add _sip._tcp.__zone__. 30 SRV 0 0 5060 __index__.bono.__zone__.
+@@ -241,10 +175,19 @@ resources:
+ # Use the DNS server.
+ echo 'nameserver __dns_mgmt_ip__' > /etc/dnsmasq.resolv.conf
+ echo 'RESOLV_CONF=/etc/dnsmasq.resolv.conf' >> /etc/default/dnsmasq
+- mkdir -p /etc/netns/signaling
+- echo 'nameserver __dns_sig_ip__' > /etc/netns/signaling/resolv.conf
+ service dnsmasq force-reload
+
++ for ((i=1;i<=10;i++)); do
++ monit summary
++ test -z "$(monit summary 2>&1 |sed '1,2d' |grep -v Running |grep -v Status\ ok )" && break || sleep 60
++ done
++ clearwater-etcdctl cluster-health
++ clearwater-etcdctl member list
++ cw-check_cluster_state
++ cw-check_config_sync
++
++ wc_notify --data-binary '{"status": "SUCCESS"}'
++
+ outputs:
+ public_mgmt_ip:
+ description: IP address in public management network
+@@ -252,9 +195,3 @@ outputs:
+ private_mgmt_ip:
+ description: IP address in private management network
+ value: { get_attr: [ mgmt_port, fixed_ips, 0, ip_address ] }
+- public_sig_ip:
+- description: IP address in public signaling network
+- value: { get_attr: [ sig_floating_ip, floating_ip_address ] }
+- private_sig_ip:
+- description: IP address in private signaling network
+- value: { get_attr: [ sig_port, fixed_ips, 0, ip_address ] }
+diff --git a/clearwater.yaml b/clearwater.yaml
+index a155c60..dd90cb7 100644
+--- a/clearwater.yaml
++++ b/clearwater.yaml
+@@ -37,41 +37,6 @@ parameters:
+ type: string
+ description: IP address of external DNS server on management network
+ default: 8.8.8.8
+- public_sig_net_id:
+- type: string
+- description: ID of public signaling network
+- constraints:
+- - custom_constraint: neutron.network
+- description: Must be a valid network ID
+- private_sig_net_ip_version:
+- type: string
+- description: IP version (4 or 6) on the private signaling network
+- constraints:
+- - allowed_values:
+- - "4"
+- - "6"
+- description: Must be 4 (IPv4) or 6 (IPv6)
+- default: "4"
+- private_sig_net_cidr:
+- type: string
+- description: Private signaling network address (CIDR notation)
+- default: 192.168.1.0/24
+- private_sig_net_gateway:
+- type: string
+- description: Private signaling network gateway address
+- default: 192.168.1.254
+- private_sig_net_pool_start:
+- type: string
+- description: Start of private signaling network IP address pool
+- default: 192.168.1.1
+- private_sig_net_pool_end:
+- type: string
+- description: End of private signaling network IP address pool
+- default: 192.168.1.253
+- external_sig_dns_ip:
+- type: string
+- description: IP address of external DNS server on signaling network
+- default: 8.8.8.8
+ flavor:
+ type: string
+ description: Flavor to use
+@@ -151,18 +116,6 @@ resources:
+ private_net_pool_end: { get_param: private_mgmt_net_pool_end }
+ dns_ip: { get_param: external_mgmt_dns_ip }
+
+- sig_network:
+- type: ./network.yaml
+- properties:
+- public_net_id: { get_param: public_sig_net_id }
+- private_net_name: { str_replace: { params: { __stack__: { get_param: "OS::stack_name" } }, template: __stack__-private-signaling } }
+- private_net_ip_version: { get_param: private_sig_net_ip_version }
+- private_net_cidr: { get_param: private_sig_net_cidr }
+- private_net_gateway: { get_param: private_sig_net_gateway }
+- private_net_pool_start: { get_param: private_sig_net_pool_start }
+- private_net_pool_end: { get_param: private_sig_net_pool_end }
+- dns_ip: { get_param: external_sig_dns_ip }
+-
+ security_groups:
+ type: ./security-groups.yaml
+ properties:
+@@ -173,18 +126,17 @@ resources:
+ properties:
+ public_mgmt_net_id: { get_param: public_mgmt_net_id }
+ private_mgmt_net_id: { get_attr: [ mgmt_network, private_net ] }
+- public_sig_net_id: { get_param: public_sig_net_id }
+- private_sig_net_id: { get_attr: [ sig_network, private_net ] }
+- private_sig_net_cidr: { get_attr: [ sig_network, private_net_cidr ] }
+ flavor: { get_param: flavor }
+ image: { get_param: image }
+ key_name: { get_param: key_name }
+- dns_security_group: { get_attr: [ security_groups, dns ] }
++ base_mgmt_security_group: { get_attr: [ security_groups, base_mgmt ] }
+ zone: { get_param: zone }
+ dnssec_key: { get_param: dnssec_key }
++ dns_ip: { get_param: external_mgmt_dns_ip }
+
+ ellis:
+ type: ./ellis.yaml
++ depends_on: dns
+ properties:
+ public_mgmt_net_id: { get_param: public_mgmt_net_id }
+ private_mgmt_net_id: { get_attr: [ mgmt_network, private_net ] }
+@@ -192,7 +144,6 @@ resources:
+ image: { get_param: image }
+ key_name: { get_param: key_name }
+ base_mgmt_security_group: { get_attr: [ security_groups, base_mgmt ] }
+- ellis_mgmt_security_group: { get_attr: [ security_groups, ellis_mgmt ] }
+ repo_url: { get_param: repo_url }
+ zone: { get_param: zone }
+ dn_range_start: { get_param: dn_range_start }
+@@ -202,6 +153,7 @@ resources:
+
+ bono:
+ type: OS::Heat::ResourceGroup
++ depends_on: sprout
+ properties:
+ count: { get_param: bono_cluster_size }
+ index_var: "__index__"
+@@ -210,25 +162,20 @@ resources:
+ properties:
+ public_mgmt_net_id: { get_param: public_mgmt_net_id }
+ private_mgmt_net_id: { get_attr: [ mgmt_network, private_net ] }
+- public_sig_net_id: { get_param: public_sig_net_id }
+- private_sig_net_id: { get_attr: [ sig_network, private_net ] }
+- private_sig_net_cidr: { get_attr: [ sig_network, private_net_cidr ] }
+- private_sig_net_gateway: { get_attr: [ sig_network, private_net_gateway ] }
+ flavor: { get_param: flavor }
+ image: { get_param: image }
+ key_name: { get_param: key_name }
+ base_mgmt_security_group: { get_attr: [ security_groups, base_mgmt ] }
+- bono_sig_security_group: { get_attr: [ security_groups, bono_sig ] }
+ repo_url: { get_param: repo_url }
+ zone: { get_param: zone }
+ dns_mgmt_ip: { get_attr: [ dns, private_mgmt_ip ] }
+- dns_sig_ip: { get_attr: [ dns, private_sig_ip ] }
+ dnssec_key: { get_param: dnssec_key }
+ etcd_ip: { get_attr: [ ellis, private_mgmt_ip ] }
+ index: __index__
+
+ sprout:
+ type: OS::Heat::ResourceGroup
++ depends_on: vellum
+ properties:
+ count: { get_param: sprout_cluster_size }
+ index_var: __index__
+@@ -237,26 +184,20 @@ resources:
+ properties:
+ public_mgmt_net_id: { get_param: public_mgmt_net_id }
+ private_mgmt_net_id: { get_attr: [ mgmt_network, private_net ] }
+- public_sig_net_id: { get_param: public_sig_net_id }
+- private_sig_net_id: { get_attr: [ sig_network, private_net ] }
+- private_sig_net_cidr: { get_attr: [ sig_network, private_net_cidr ] }
+- private_sig_net_gateway: { get_attr: [ sig_network, private_net_gateway ] }
+ flavor: { get_param: flavor }
+ image: { get_param: image }
+ key_name: { get_param: key_name }
+ base_mgmt_security_group: { get_attr: [ security_groups, base_mgmt ] }
+- sprout_sig_outbound_security_group: { get_attr: [ security_groups, sprout_sig_outbound ] }
+- sprout_sig_inbound_security_group: { get_attr: [ security_groups, sprout_sig_inbound ] }
+ repo_url: { get_param: repo_url }
+ zone: { get_param: zone }
+ dns_mgmt_ip: { get_attr: [ dns, private_mgmt_ip ] }
+- dns_sig_ip: { get_attr: [ dns, private_sig_ip ] }
+ dnssec_key: { get_param: dnssec_key }
+ etcd_ip: { get_attr: [ ellis, private_mgmt_ip ] }
+ index: __index__
+
+ homer:
+ type: OS::Heat::ResourceGroup
++ depends_on: sprout
+ properties:
+ count: { get_param: homer_cluster_size }
+ index_var: __index__
+@@ -265,26 +206,20 @@ resources:
+ properties:
+ public_mgmt_net_id: { get_param: public_mgmt_net_id }
+ private_mgmt_net_id: { get_attr: [ mgmt_network, private_net ] }
+- public_sig_net_id: { get_param: public_sig_net_id }
+- private_sig_net_id: { get_attr: [ sig_network, private_net ] }
+- private_sig_net_cidr: { get_attr: [ sig_network, private_net_cidr ] }
+- private_sig_net_gateway: { get_attr: [ sig_network, private_net_gateway ] }
+ flavor: { get_param: flavor }
+ image: { get_param: image }
+ key_name: { get_param: key_name }
+ base_mgmt_security_group: { get_attr: [ security_groups, base_mgmt ] }
+- homer_mgmt_security_group: { get_attr: [ security_groups, homer_mgmt ] }
+- homer_sig_security_group: { get_attr: [ security_groups, homer_sig ] }
+ repo_url: { get_param: repo_url }
+ zone: { get_param: zone }
+ dns_mgmt_ip: { get_attr: [ dns, private_mgmt_ip ] }
+- dns_sig_ip: { get_attr: [ dns, private_sig_ip ] }
+ dnssec_key: { get_param: dnssec_key }
+ etcd_ip: { get_attr: [ ellis, private_mgmt_ip ] }
+ index: __index__
+
+ dime:
+ type: OS::Heat::ResourceGroup
++ depends_on: sprout
+ properties:
+ count: { get_param: dime_cluster_size }
+ index_var: __index__
+@@ -293,26 +228,20 @@ resources:
+ properties:
+ public_mgmt_net_id: { get_param: public_mgmt_net_id }
+ private_mgmt_net_id: { get_attr: [ mgmt_network, private_net ] }
+- public_sig_net_id: { get_param: public_sig_net_id }
+- private_sig_net_id: { get_attr: [ sig_network, private_net ] }
+- private_sig_net_cidr: { get_attr: [ sig_network, private_net_cidr ] }
+- private_sig_net_gateway: { get_attr: [ sig_network, private_net_gateway ] }
+ flavor: { get_param: flavor }
+ image: { get_param: image }
+ key_name: { get_param: key_name }
+ base_mgmt_security_group: { get_attr: [ security_groups, base_mgmt ] }
+- dime_mgmt_security_group: { get_attr: [ security_groups, dime_mgmt ] }
+- dime_sig_security_group: { get_attr: [ security_groups, dime_sig ] }
+ repo_url: { get_param: repo_url }
+ zone: { get_param: zone }
+ dns_mgmt_ip: { get_attr: [ dns, private_mgmt_ip ] }
+- dns_sig_ip: { get_attr: [ dns, private_sig_ip ] }
+ dnssec_key: { get_param: dnssec_key }
+ etcd_ip: { get_attr: [ ellis, private_mgmt_ip ] }
+ index: __index__
+
+ vellum:
+ type: OS::Heat::ResourceGroup
++ depends_on: ellis
+ properties:
+ count: { get_param: vellum_cluster_size }
+ index_var: __index__
+@@ -321,20 +250,13 @@ resources:
+ properties:
+ public_mgmt_net_id: { get_param: public_mgmt_net_id }
+ private_mgmt_net_id: { get_attr: [ mgmt_network, private_net ] }
+- public_sig_net_id: { get_param: public_sig_net_id }
+- private_sig_net_id: { get_attr: [ sig_network, private_net ] }
+- private_sig_net_cidr: { get_attr: [ sig_network, private_net_cidr ] }
+- private_sig_net_gateway: { get_attr: [ sig_network, private_net_gateway ] }
+ flavor: { get_param: flavor }
+ image: { get_param: image }
+ key_name: { get_param: key_name }
+ base_mgmt_security_group: { get_attr: [ security_groups, base_mgmt ] }
+- vellum_sig_outbound_security_group: { get_attr: [ security_groups, vellum_sig_outbound ] }
+- vellum_sig_inbound_security_group: { get_attr: [ security_groups, vellum_sig_inbound ] }
+ repo_url: { get_param: repo_url }
+ zone: { get_param: zone }
+ dns_mgmt_ip: { get_attr: [ dns, private_mgmt_ip ] }
+- dns_sig_ip: { get_attr: [ dns, private_sig_ip ] }
+ dnssec_key: { get_param: dnssec_key }
+ etcd_ip: { get_attr: [ ellis, private_mgmt_ip ] }
+ index: __index__
+diff --git a/dime.yaml b/dime.yaml
+index 642f19d..d2b8b92 100644
+--- a/dime.yaml
++++ b/dime.yaml
+@@ -23,26 +23,6 @@ parameters:
+ constraints:
+ - custom_constraint: neutron.network
+ description: Must be a valid network ID
+- public_sig_net_id:
+- type: string
+- description: ID of public signaling network
+- constraints:
+- - custom_constraint: neutron.network
+- description: Must be a valid network ID
+- private_sig_net_id:
+- type: string
+- description: ID of private signaling network
+- constraints:
+- - custom_constraint: neutron.network
+- description: Must be a valid network ID
+- private_sig_net_cidr:
+- type: string
+- description: Private signaling network address (CIDR notation)
+- default: 192.168.1.0/24
+- private_sig_net_gateway:
+- type: string
+- description: Private signaling network gateway address
+- default: 192.168.1.254
+ flavor:
+ type: string
+ description: Flavor to use
+@@ -64,12 +44,6 @@ parameters:
+ base_mgmt_security_group:
+ type: string
+ description: ID of base security group for all Clearwater nodes (management)
+- dime_sig_security_group:
+- type: string
+- description: ID of security group for Dime nodes (signaling)
+- dime_mgmt_security_group:
+- type: string
+- description: ID of security group for Dime nodes (management)
+ repo_url:
+ type: string
+ description: URL for Clearwater repository
+@@ -81,9 +55,6 @@ parameters:
+ dns_mgmt_ip:
+ type: string
+ description: IP address for DNS server on management network
+- dns_sig_ip:
+- type: string
+- description: IP address for DNS server on signaling network
+ dnssec_key:
+ type: string
+ description: DNSSEC private key (Base64-encoded)
+@@ -107,7 +78,6 @@ resources:
+ network_id: { str_replace: { params: { x: { get_param: private_mgmt_net_id } }, template: x } }
+ security_groups:
+ - { get_param: base_mgmt_security_group }
+- - { get_param: dime_mgmt_security_group }
+
+ mgmt_floating_ip:
+ type: OS::Neutron::FloatingIP
+@@ -115,13 +85,15 @@ resources:
+ floating_network_id: { get_param: public_mgmt_net_id }
+ port_id: { get_resource: mgmt_port }
+
+- sig_port:
+- type: OS::Neutron::Port
++ wait_condition:
++ type: OS::Heat::WaitCondition
+ properties:
+- # Specify the network ID by string to work around OpenStack issues - see https://github.com/Metaswitch/clearwater-heat/issues/18.
+- network_id: { str_replace: { params: { x: { get_param: private_sig_net_id } }, template: x } }
+- security_groups:
+- - { get_param: dime_sig_security_group }
++ handle: {get_resource: wait_handle}
++ count: 1
++ timeout: 1200
++
++ wait_handle:
++ type: OS::Heat::WaitConditionHandle
+
+ server:
+ type: OS::Nova::Server
+@@ -132,7 +104,6 @@ resources:
+ key_name: { get_param: key_name }
+ networks:
+ - port: { get_resource: mgmt_port }
+- - port: { get_resource: sig_port }
+ user_data_format: RAW
+ user_data:
+ str_replace:
+@@ -141,14 +112,11 @@ resources:
+ __zone__: { get_param: zone }
+ __public_mgmt_ip__: { get_attr: [ mgmt_floating_ip, floating_ip_address ] }
+ __private_mgmt_ip__: { get_attr: [ mgmt_port, fixed_ips, 0, ip_address ] }
+- __private_sig_ip__: { get_attr: [ sig_port, fixed_ips, 0, ip_address ] }
+- __private_sig_cidr__: { get_param: private_sig_net_cidr }
+- __private_sig_gateway__: { get_param: private_sig_net_gateway }
+ __dns_mgmt_ip__: { get_param: dns_mgmt_ip }
+- __dns_sig_ip__: { get_param: dns_sig_ip }
+ __dnssec_key__: { get_param: dnssec_key }
+ __etcd_ip__ : { get_param: etcd_ip }
+ __index__ : { get_param: index }
++ wc_notify: { get_attr: [wait_handle, curl_cli] }
+ template: |
+ #!/bin/bash
+
+@@ -156,36 +124,8 @@ resources:
+ exec > >(tee -a /var/log/clearwater-heat-dime.log) 2>&1
+ set -x
+
+- # Set up the signaling network namespace on each boot by creating an init file and
+- # linking to it from runlevel 2 and 3
+- cat >/etc/init.d/signaling_namespace <<EOF
+- #!/bin/bash
+- # Create the signaling namespace and configure its interfaces.
+- set -e
+-
+- # Exit if the namespace is already set up.
+- ip netns list | grep -q signaling && exit 0
+-
+- # eth1 is the signaling interface (and eth0 is the management interface).
+- # We need to set eth1 up manually - only eth0 is automatically configured via DHCP.
+- ip netns add signaling
+- ip link set eth1 netns signaling
+- ip netns exec signaling ip link set dev lo up
+- ip netns exec signaling ip addr add __private_sig_ip__/$(echo __private_sig_cidr__ | cut -d / -f 2) dev eth1
+- ip netns exec signaling ip link set dev eth1 up
+- ip netns exec signaling ip route add default via __private_sig_gateway__
+- EOF
+-
+- chmod a+x /etc/init.d/signaling_namespace
+- ln -s /etc/init.d/signaling_namespace /etc/rc2.d/S01signaling_namespace
+- ln -s /etc/init.d/signaling_namespace /etc/rc3.d/S01signaling_namespace
+-
+- # Also set up the signaling namespace now.
+- /etc/init.d/signaling_namespace
+-
+ # Configure the APT software source.
+- echo 'deb __repo_url__ binary/' > /etc/apt/sources.list.d/clearwater.list
+- curl -L http://repo.cw-ngv.com/repo_key | apt-key add -
++ echo 'deb http://artifacts.opnfv.org/functest/clearwater/debian ./' > /etc/apt/sources.list.d/clearwater.list
+ apt-get update
+
+ # Configure /etc/clearwater/local_config.
+@@ -193,11 +133,8 @@ resources:
+ etcd_ip=__etcd_ip__
+ [ -n "$etcd_ip" ] || etcd_ip=__private_mgmt_ip__
+ cat > /etc/clearwater/local_config << EOF
+- signaling_namespace=signaling
+- signaling_dns_server=__dns_sig_ip__
+- management_local_ip=__private_mgmt_ip__
+- local_ip=__private_sig_ip__
+- public_ip=__private_sig_ip__
++ local_ip=__private_mgmt_ip__
++ public_ip=__private_mgmt_ip__
+ public_hostname=dime-__index__.__zone__
+ etcd_cluster=$etcd_ip
+ EOF
+@@ -220,9 +157,9 @@ resources:
+ while ! { nsupdate -y "__zone__:__dnssec_key__" -v << EOF
+ server __dns_mgmt_ip__
+ update add dime-__index__.__zone__. 30 $(ip2rr __public_mgmt_ip__)
+- update add ralf.__zone__. 30 $(ip2rr __private_sig_ip__)
+- update add hs.__zone__. 30 $(ip2rr __private_sig_ip__)
+- update add hs-prov.__zone__. 30 $(ip2rr __private_mgmt_ip__)
++ update add ralf.__zone__. 30 $(ip2rr __public_mgmt_ip__)
++ update add hs.__zone__. 30 $(ip2rr __public_mgmt_ip__)
++ update add hs-prov.__zone__. 30 $(ip2rr __public_mgmt_ip__)
+ send
+ EOF
+ } && [ $retries -lt 10 ]
+@@ -235,17 +172,22 @@ resources:
+ # Use the DNS server.
+ echo 'nameserver __dns_mgmt_ip__' > /etc/dnsmasq.resolv.conf
+ echo 'RESOLV_CONF=/etc/dnsmasq.resolv.conf' >> /etc/default/dnsmasq
+- mkdir -p /etc/netns/signaling
+- echo 'nameserver __dns_sig_ip__' > /etc/netns/signaling/resolv.conf
+ service dnsmasq force-reload
+
++ for ((i=1;i<=10;i++)); do
++ monit summary
++ test -z "$(monit summary 2>&1 |sed '1,2d' |grep -v Running |grep -v Status\ ok )" && break || sleep 60
++ done
++ clearwater-etcdctl cluster-health
++ clearwater-etcdctl member list
++ cw-check_config_sync
++
++ wc_notify --data-binary '{"status": "SUCCESS"}'
++
+ outputs:
+ public_mgmt_ip:
+ description: IP address in public (management) network
+ value: { get_attr: [ mgmt_floating_ip, floating_ip_address ] }
+ private_mgmt_ip:
+- description: IP address in private signaling network
++ description: IP address in private management network
+ value: { get_attr: [ mgmt_port, fixed_ips, 0, ip_address ] }
+- private_sig_ip:
+- description: IP address in private signaling network
+- value: { get_attr: [ sig_port, fixed_ips, 0, ip_address ] }
+diff --git a/dns.yaml b/dns.yaml
+index 825ede1..f98ffa3 100644
+--- a/dns.yaml
++++ b/dns.yaml
+@@ -23,22 +23,6 @@ parameters:
+ constraints:
+ - custom_constraint: neutron.network
+ description: Must be a valid network ID
+- public_sig_net_id:
+- type: string
+- description: ID of public signaling network
+- constraints:
+- - custom_constraint: neutron.network
+- description: Must be a valid network ID
+- private_sig_net_id:
+- type: string
+- description: ID of private signaling network
+- constraints:
+- - custom_constraint: neutron.network
+- description: Must be a valid network ID
+- private_sig_net_cidr:
+- type: string
+- description: Private signaling network address (CIDR notation)
+- default: 192.168.1.0/24
+ flavor:
+ type: string
+ description: Flavor to use
+@@ -57,7 +41,7 @@ parameters:
+ constraints:
+ - custom_constraint: nova.keypair
+ description: Must be a valid keypair name
+- dns_security_group:
++ base_mgmt_security_group:
+ type: string
+ description: ID of security group for DNS nodes
+ zone:
+@@ -67,6 +51,10 @@ parameters:
+ dnssec_key:
+ type: string
+ description: DNSSEC private key (Base64-encoded)
++ dns_ip:
++ type: string
++ description: IP address of DNS server
++ default: 8.8.8.8
+
+ resources:
+ mgmt_port:
+@@ -75,7 +63,7 @@ resources:
+ # Specify the network ID by string to work around OpenStack issues - see https://github.com/Metaswitch/clearwater-heat/issues/18.
+ network_id: { str_replace: { params: { x: { get_param: private_mgmt_net_id } }, template: x } }
+ security_groups:
+- - { get_param: dns_security_group }
++ - { get_param: base_mgmt_security_group }
+
+ mgmt_floating_ip:
+ type: OS::Neutron::FloatingIP
+@@ -83,13 +71,15 @@ resources:
+ floating_network_id: { get_param: public_mgmt_net_id }
+ port_id: { get_resource: mgmt_port }
+
+- sig_port:
+- type: OS::Neutron::Port
++ wait_condition:
++ type: OS::Heat::WaitCondition
+ properties:
+- # Specify the network ID by string to work around OpenStack issues - see https://github.com/Metaswitch/clearwater-heat/issues/18.
+- network_id: { str_replace: { params: { x: { get_param: private_sig_net_id } }, template: x } }
+- security_groups:
+- - { get_param: dns_security_group }
++ handle: {get_resource: wait_handle}
++ count: 1
++ timeout: 1200
++
++ wait_handle:
++ type: OS::Heat::WaitConditionHandle
+
+ server:
+ type: OS::Nova::Server
+@@ -100,16 +90,15 @@ resources:
+ key_name: { get_param: key_name }
+ networks:
+ - port: { get_resource: mgmt_port }
+- - port: { get_resource: sig_port }
+ user_data_format: RAW
+ user_data:
+ str_replace:
+ params:
+ __zone__: { get_param: zone }
+ __dnssec_key__: { get_param: dnssec_key }
++ __dns_ip__: { get_param: dns_ip }
+ __public_ip__: { get_attr: [ mgmt_floating_ip, floating_ip_address ] }
+- __private_sig_ip__: { get_attr: [ sig_port, fixed_ips, 0, ip_address ] }
+- __private_sig_cidr__: { get_param: private_sig_net_cidr }
++ wc_notify: { get_attr: [wait_handle, curl_cli] }
+ template: |
+ #!/bin/bash
+
+@@ -117,14 +106,22 @@ resources:
+ exec > >(tee -a /var/log/clearwater-heat-dns.log) 2>&1
+ set -x
+
+- # Set up the signaling network interface
+- ip addr add __private_sig_ip__/$(echo __private_sig_cidr__ | cut -d / -f 2) dev eth1
+- ip link set dev eth1 up
+-
+ # Install BIND.
+ apt-get update
+ DEBIAN_FRONTEND=noninteractive apt-get install bind9 --yes
+
++ cat > /etc/bind/named.conf.options << EOF
++ options {
++ directory "/var/cache/bind";
++ forwarders {
++ __dns_ip__;
++ };
++ dnssec-validation auto;
++ auth-nxdomain no;
++ listen-on-v6 { any; };
++ };
++ EOF
++
+ # Update BIND configuration with the specified zone and key.
+ cat >> /etc/bind/named.conf.local << EOF
+ key __zone__. {
+@@ -163,6 +160,8 @@ resources:
+ # Now that BIND configuration is correct, kick it to reload.
+ service bind9 reload
+
++ wc_notify --data-binary '{"status": "SUCCESS"}'
++
+ outputs:
+ public_mgmt_ip:
+ description: IP address in public management network
+@@ -170,9 +169,6 @@ outputs:
+ private_mgmt_ip:
+ description: IP address in private signaling network
+ value: { get_attr: [ mgmt_port, fixed_ips, 0, ip_address ] }
+- private_sig_ip:
+- description: IP address in private signaling network
+- value: { get_attr: [ sig_port, fixed_ips, 0, ip_address ] }
+ zone:
+ description: DNS zone
+ value: { get_param: zone }
+diff --git a/ellis.yaml b/ellis.yaml
+index 963352d..2bd0730 100644
+--- a/ellis.yaml
++++ b/ellis.yaml
+@@ -44,9 +44,6 @@ parameters:
+ base_mgmt_security_group:
+ type: string
+ description: ID of base security group for all Clearwater nodes (management)
+- ellis_mgmt_security_group:
+- type: string
+- description: ID of security group for Ellis nodes (management)
+ repo_url:
+ type: string
+ description: URL for Clearwater repository
+@@ -95,7 +92,6 @@ resources:
+ network_id: { str_replace: { params: { x: { get_param: private_mgmt_net_id } }, template: x } }
+ security_groups:
+ - { get_param: base_mgmt_security_group }
+- - { get_param: ellis_mgmt_security_group }
+
+ mgmt_floating_ip:
+ type: OS::Neutron::FloatingIP
+@@ -103,6 +99,16 @@ resources:
+ floating_network_id: { get_param: public_mgmt_net_id }
+ port_id: { get_resource: mgmt_port }
+
++ wait_condition:
++ type: OS::Heat::WaitCondition
++ properties:
++ handle: {get_resource: wait_handle}
++ count: 1
++ timeout: 1200
++
++ wait_handle:
++ type: OS::Heat::WaitConditionHandle
++
+ server:
+ type: OS::Nova::Server
+ properties:
+@@ -126,6 +132,7 @@ resources:
+ __dnssec_key__: { get_param: dnssec_key }
+ __etcd_ip__ : { get_param: etcd_ip }
+ __index__ : { get_param: index }
++ wc_notify: { get_attr: [wait_handle, curl_cli] }
+ template: |
+ #!/bin/bash
+
+@@ -134,8 +141,7 @@ resources:
+ set -x
+
+ # Configure the APT software source.
+- echo 'deb __repo_url__ binary/' > /etc/apt/sources.list.d/clearwater.list
+- curl -L http://repo.cw-ngv.com/repo_key | apt-key add -
++ echo 'deb http://artifacts.opnfv.org/functest/clearwater/debian ./' > /etc/apt/sources.list.d/clearwater.list
+ apt-get update
+
+ # Configure /etc/clearwater/local_config. Add xdms_hostname here to use Homer's management
+@@ -176,7 +182,7 @@ resources:
+ chronos_hostname=vellum.__zone__
+ ralf_session_store=vellum.__zone__
+
+- upstream_port=0
++ upstream_hostname=sprout.__zone__
+
+ # Email server configuration
+ smtp_smarthost=localhost
+@@ -189,6 +195,8 @@ resources:
+ turn_workaround=secret
+ ellis_api_key=secret
+ ellis_cookie_key=secret
++
++ reduce_cassandra_mem_usage=Y
+ EOF
+ /usr/share/clearwater/clearwater-config-manager/scripts/cw-config upload shared_config --autoconfirm --dir /tmp
+
+@@ -197,7 +205,6 @@ resources:
+ # local_settings.py runs to pick up the configuration changes.
+ service clearwater-infrastructure restart
+ service ellis stop
+- /usr/share/clearwater/ellis/env/bin/python /usr/share/clearwater/ellis/src/metaswitch/ellis/tools/create_numbers.py --start __dn_range_start__ --count __dn_range_length__ --realm __zone__
+
+ # Function to give DNS record type and IP address for specified IP address
+ ip2rr() {
+@@ -228,6 +235,18 @@ resources:
+ echo 'RESOLV_CONF=/etc/dnsmasq.resolv.conf' >> /etc/default/dnsmasq
+ service dnsmasq force-reload
+
++ for ((i=1;i<=10;i++)); do
++ monit summary
++ test -z "$(monit summary 2>&1 |sed '1,2d' |grep -v Running |grep -v Status\ ok )" && break || sleep 60
++ done
++ clearwater-etcdctl cluster-health
++ clearwater-etcdctl member list
++ cw-check_config_sync
++
++ /usr/share/clearwater/ellis/env/bin/python /usr/share/clearwater/ellis/src/metaswitch/ellis/tools/create_numbers.py --start __dn_range_start__ --count __dn_range_length__ --realm __zone__
++
++ wc_notify --data-binary '{"status": "SUCCESS"}'
++
+ outputs:
+ public_mgmt_ip:
+ description: IP address in public management network
+diff --git a/homer.yaml b/homer.yaml
+index 4337984..d23adb5 100644
+--- a/homer.yaml
++++ b/homer.yaml
+@@ -23,26 +23,6 @@ parameters:
+ constraints:
+ - custom_constraint: neutron.network
+ description: Must be a valid network ID
+- public_sig_net_id:
+- type: string
+- description: ID of public signaling network
+- constraints:
+- - custom_constraint: neutron.network
+- description: Must be a valid network ID
+- private_sig_net_id:
+- type: string
+- description: ID of private signaling network
+- constraints:
+- - custom_constraint: neutron.network
+- description: Must be a valid network ID
+- private_sig_net_cidr:
+- type: string
+- description: Private signaling network address (CIDR notation)
+- default: 192.168.1.0/24
+- private_sig_net_gateway:
+- type: string
+- description: Private signaling network gateway address
+- default: 192.168.1.254
+ flavor:
+ type: string
+ description: Flavor to use
+@@ -64,12 +44,6 @@ parameters:
+ base_mgmt_security_group:
+ type: string
+ description: ID of base security group for all Clearwater nodes (management)
+- homer_mgmt_security_group:
+- type: string
+- description: ID of security group for Homer nodes (maangement)
+- homer_sig_security_group:
+- type: string
+- description: ID of security group for Homer nodes (signaling)
+ repo_url:
+ type: string
+ description: URL for Clearwater repository
+@@ -81,9 +55,6 @@ parameters:
+ dns_mgmt_ip:
+ type: string
+ description: IP address for DNS server on management network
+- dns_sig_ip:
+- type: string
+- description: IP address for DNS server on signaling network
+ dnssec_key:
+ type: string
+ description: DNSSEC private key (Base64-encoded)
+@@ -107,7 +78,6 @@ resources:
+ network_id: { str_replace: { params: { x: { get_param: private_mgmt_net_id } }, template: x } }
+ security_groups:
+ - { get_param: base_mgmt_security_group }
+- - { get_param: homer_mgmt_security_group }
+
+ mgmt_floating_ip:
+ type: OS::Neutron::FloatingIP
+@@ -115,19 +85,15 @@ resources:
+ floating_network_id: { get_param: public_mgmt_net_id }
+ port_id: { get_resource: mgmt_port }
+
+- sig_port:
+- type: OS::Neutron::Port
++ wait_condition:
++ type: OS::Heat::WaitCondition
+ properties:
+- # Specify the network ID by string to work around OpenStack issues - see https://github.com/Metaswitch/clearwater-heat/issues/18.
+- network_id: { str_replace: { params: { x: { get_param: private_sig_net_id } }, template: x } }
+- security_groups:
+- - { get_param: homer_sig_security_group }
++ handle: {get_resource: wait_handle}
++ count: 1
++ timeout: 1200
+
+- sig_floating_ip:
+- type: OS::Neutron::FloatingIP
+- properties:
+- floating_network_id: { get_param: public_sig_net_id }
+- port_id: { get_resource: sig_port }
++ wait_handle:
++ type: OS::Heat::WaitConditionHandle
+
+ server:
+ type: OS::Nova::Server
+@@ -138,7 +104,6 @@ resources:
+ key_name: { get_param: key_name }
+ networks:
+ - port: { get_resource: mgmt_port }
+- - port: { get_resource: sig_port }
+ user_data_format: RAW
+ user_data:
+ str_replace:
+@@ -147,15 +112,11 @@ resources:
+ __zone__: { get_param: zone }
+ __public_mgmt_ip__: { get_attr: [ mgmt_floating_ip, floating_ip_address ] }
+ __private_mgmt_ip__: { get_attr: [ mgmt_port, fixed_ips, 0, ip_address ] }
+- __public_sig_ip__: { get_attr: [ sig_floating_ip, floating_ip_address ] }
+- __private_sig_ip__: { get_attr: [ sig_port, fixed_ips, 0, ip_address ] }
+- __private_sig_cidr__: { get_param: private_sig_net_cidr }
+- __private_sig_gateway__: { get_param: private_sig_net_gateway }
+ __dns_mgmt_ip__: { get_param: dns_mgmt_ip }
+- __dns_sig_ip__: { get_param: dns_sig_ip }
+ __dnssec_key__: { get_param: dnssec_key }
+ __etcd_ip__ : { get_param: etcd_ip }
+ __index__ : { get_param: index }
++ wc_notify: { get_attr: [wait_handle, curl_cli] }
+ template: |
+ #!/bin/bash
+
+@@ -163,36 +124,8 @@ resources:
+ exec > >(tee -a /var/log/clearwater-heat-homer.log) 2>&1
+ set -x
+
+- # Set up the signaling network namespace on each boot by creating an init file and
+- # linking to it from runlevel 2 and 3
+- cat >/etc/init.d/signaling_namespace <<EOF
+- #!/bin/bash
+- # Create the signaling namespace and configure its interfaces.
+- set -e
+-
+- # Exit if the namespace is already set up.
+- ip netns list | grep -q signaling && exit 0
+-
+- # eth1 is the signaling interface (and eth0 is the management interface).
+- # We need to set eth1 up manually - only eth0 is automatically configured via DHCP.
+- ip netns add signaling
+- ip link set eth1 netns signaling
+- ip netns exec signaling ip link set dev lo up
+- ip netns exec signaling ip addr add __private_sig_ip__/$(echo __private_sig_cidr__ | cut -d / -f 2) dev eth1
+- ip netns exec signaling ip link set dev eth1 up
+- ip netns exec signaling ip route add default via __private_sig_gateway__
+- EOF
+-
+- chmod a+x /etc/init.d/signaling_namespace
+- ln -s /etc/init.d/signaling_namespace /etc/rc2.d/S01signaling_namespace
+- ln -s /etc/init.d/signaling_namespace /etc/rc3.d/S01signaling_namespace
+-
+- # Also set up the signaling namespace now.
+- /etc/init.d/signaling_namespace
+-
+ # Configure the APT software source.
+- echo 'deb __repo_url__ binary/' > /etc/apt/sources.list.d/clearwater.list
+- curl -L http://repo.cw-ngv.com/repo_key | apt-key add -
++ echo 'deb http://artifacts.opnfv.org/functest/clearwater/debian ./' > /etc/apt/sources.list.d/clearwater.list
+ apt-get update
+
+ # Configure /etc/clearwater/local_config.
+@@ -200,11 +133,8 @@ resources:
+ etcd_ip=__etcd_ip__
+ [ -n "$etcd_ip" ] || etcd_ip=__private_mgmt_ip__
+ cat > /etc/clearwater/local_config << EOF
+- signaling_namespace=signaling
+- signaling_dns_server=__dns_sig_ip__
+- management_local_ip=__private_mgmt_ip__
+- local_ip=__private_sig_ip__
+- public_ip=__public_sig_ip__
++ local_ip=__private_mgmt_ip__
++ public_ip=__public_mgmt_ip__
+ public_hostname=homer-__index__.__zone__
+ etcd_cluster=$etcd_ip
+ EOF
+@@ -227,7 +157,7 @@ resources:
+ while ! { nsupdate -y "__zone__:__dnssec_key__" -v << EOF
+ server __dns_mgmt_ip__
+ update add homer-__index__.__zone__. 30 $(ip2rr __public_mgmt_ip__)
+- update add homer.__zone__. 30 $(ip2rr __public_sig_ip__)
++ update add homer.__zone__. 30 $(ip2rr __public_mgmt_ip__)
+ send
+ EOF
+ } && [ $retries -lt 10 ]
+@@ -237,14 +167,22 @@ resources:
+ sleep 5
+ done
+
+- # Use the DNS server.
+ # Use the DNS server.
+ echo 'nameserver __dns_mgmt_ip__' > /etc/dnsmasq.resolv.conf
+ echo 'RESOLV_CONF=/etc/dnsmasq.resolv.conf' >> /etc/default/dnsmasq
+- mkdir -p /etc/netns/signaling
+- echo 'nameserver __dns_sig_ip__' > /etc/netns/signaling/resolv.conf
+ service dnsmasq force-reload
+
++ for ((i=1;i<=10;i++)); do
++ monit summary
++ test -z "$(monit summary 2>&1 |sed '1,2d' |grep -v Running |grep -v Status\ ok )" && break || sleep 60
++ done
++ clearwater-etcdctl cluster-health
++ clearwater-etcdctl member list
++ cw-check_cluster_state
++ cw-check_config_sync
++
++ wc_notify --data-binary '{"status": "SUCCESS"}'
++
+ outputs:
+ public_mgmt_ip:
+ description: IP address in public management network
+@@ -252,9 +190,3 @@ outputs:
+ private_mgmt_ip:
+ description: IP address in private management network
+ value: { get_attr: [ mgmt_port, fixed_ips, 0, ip_address ] }
+- public_sig_ip:
+- description: IP address in public signaling network
+- value: { get_attr: [ sig_floating_ip, floating_ip_address ] }
+- private_sig_ip:
+- description: IP address in private signaling network
+- value: { get_attr: [ sig_port, fixed_ips, 0, ip_address ] }
+diff --git a/security-groups.yaml b/security-groups.yaml
+index 5921d32..c73fe2b 100644
+--- a/security-groups.yaml
++++ b/security-groups.yaml
+@@ -32,340 +32,14 @@ resources:
+ - protocol: icmp
+ # SSH
+ - protocol: tcp
+- port_range_min: 22
+- port_range_max: 22
++ port_range_min: 1
++ port_range_max: 65535
+ # SNMP
+ - protocol: udp
+- port_range_min: 161
+- port_range_max: 161
+- # etcd
+- - protocol: tcp
+- port_range_min: 2380
+- port_range_max: 2380
+- remote_mode: remote_group_id
+- #remote_group_id: { get_resource: base_mgmt } # omit remote_group_id to reference yourself
+- - protocol: tcp
+- port_range_min: 4000
+- port_range_max: 4000
+- remote_mode: remote_group_id
+- #remote_group_id: { get_resource: base_mgmt } # omit remote_group_id to reference yourself
+-
+- dns:
+- type: OS::Neutron::SecurityGroup
+- properties:
+- name: { str_replace: { params: { __name_prefix__: { get_param: "name_prefix" } }, template: __name_prefix__-dns } }
+- description: Security group for DNS nodes
+- rules:
+- # All egress traffic
+- - direction: egress
+- ethertype: IPv4
+- - direction: egress
+- ethertype: IPv6
+- # ICMP
+- - protocol: icmp
+- # SSH
+- - protocol: tcp
+- port_range_min: 22
+- port_range_max: 22
+- # DNS
+- - protocol: udp
+- port_range_min: 53
+- port_range_max: 53
+- - protocol: tcp
+- port_range_min: 53
+- port_range_max: 53
+-
+- ellis_mgmt:
+- type: OS::Neutron::SecurityGroup
+- properties:
+- name: { str_replace: { params: { __name_prefix__: { get_param: "name_prefix" } }, template: __name_prefix__-ellis-mgmt } }
+- description: Security group for Ellis nodes (management)
+- rules:
+- # HTTP
+- - protocol: tcp
+- port_range_min: 80
+- port_range_max: 80
+- # HTTPS
+- - protocol: tcp
+- port_range_min: 443
+- port_range_max: 443
+-
+- bono_sig:
+- type: OS::Neutron::SecurityGroup
+- properties:
+- name: { str_replace: { params: { __name_prefix__: { get_param: "name_prefix" } }, template: __name_prefix__-bono-sig } }
+- description: Security group for Bono nodes (signaling)
+- rules:
+- # STUN/TURN
+- - protocol: udp
+- port_range_min: 3478
+- port_range_max: 3478
+- - protocol: tcp
+- port_range_min: 3478
+- port_range_max: 3478
+- # Internal SIP
+- - protocol: tcp
+- port_range_min: 5058
+- port_range_max: 5058
+- remote_mode: remote_group_id
+- #remote_group_id: { get_resource: bono_sig } # omit remote_group_id to reference yourself
+- - protocol: tcp
+- port_range_min: 5058
+- port_range_max: 5058
+- remote_mode: remote_group_id
+- remote_group_id: { get_resource: sprout_sig_outbound }
+- # External SIP
+- - protocol: udp
+- port_range_min: 5060
+- port_range_max: 5060
+- - protocol: tcp
+- port_range_min: 5060
+- port_range_max: 5060
+- # External SIP/WebSocket
+- - protocol: tcp
+- port_range_min: 5062
+- port_range_max: 5062
+- # RTP
+- - protocol: udp
+- port_range_min: 32768
++ port_range_min: 1
+ port_range_max: 65535
+
+-
+- sprout_sig_outbound:
+- type: OS::Neutron::SecurityGroup
+- properties:
+- name: { str_replace: { params: { __name_prefix__: { get_param: "name_prefix" } }, template: __name_prefix__-sprout-sig-outbound } }
+- description: Security group for Sprout nodes outbound traffic (signaling)
+- rules:
+- # Internal SIP
+- - protocol: tcp
+- port_range_min: 5052
+- port_range_max: 5052
+- remote_mode: remote_group_id
+- #remote_group_id: { get_resource: sprout_sig_outbound } # omit remote_group_id to reference yourself
+- - protocol: tcp
+- port_range_min: 5054
+- port_range_max: 5054
+- remote_mode: remote_group_id
+- #remote_group_id: { get_resource: sprout_sig_outbound } # omit remote_group_id to reference yourself
+-
+- sprout_sig_inbound:
+- type: OS::Neutron::SecurityGroup
+- properties:
+- name: { str_replace: { params: { __name_prefix__: { get_param: "name_prefix" } }, template: __name_prefix__-sprout-sig-inbound } }
+- description: Security group for Sprout nodes inbound traffic (signaling)
+- rules:
+- # Internal SIP
+- - protocol: tcp
+- port_range_min: 5052
+- port_range_max: 5052
+- remote_mode: remote_group_id
+- remote_group_id: { get_resource: bono_sig }
+- - protocol: tcp
+- port_range_min: 5054
+- port_range_max: 5054
+- remote_mode: remote_group_id
+- remote_group_id: { get_resource: bono_sig }
+- # Chronos timer pops
+- - protocol: tcp
+- port_range_min: 9888
+- port_range_max: 9888
+- remote_mode: remote_group_id
+- remote_group_id: { get_resource: vellum_sig_outbound }
+- # Notifications from Homestead
+- - protocol: tcp
+- port_range_min: 9888
+- port_range_max: 9888
+- remote_mode: remote_group_id
+- remote_group_id: { get_resource: dime_sig }
+-
+- homer_mgmt:
+- type: OS::Neutron::SecurityGroup
+- properties:
+- name: { str_replace: { params: { __name_prefix__: { get_param: "name_prefix" } }, template: __name_prefix__-homer-mgmt } }
+- description: Security group for Homer nodes (management)
+- rules:
+- # Ut/HTTP
+- - protocol: tcp
+- port_range_min: 7888
+- port_range_max: 7888
+- - protocol: tcp
+- port_range_min: 7888
+- port_range_max: 7888
+- remote_mode: remote_group_id
+- remote_group_id: { get_resource: sprout_sig_outbound }
+-
+- homer_sig:
+- type: OS::Neutron::SecurityGroup
+- properties:
+- name: { str_replace: { params: { __name_prefix__: { get_param: "name_prefix" } }, template: __name_prefix__-homer-sig } }
+- description: Security group for Homer nodes (signaling)
+- rules:
+- # Ut/HTTP
+- - protocol: tcp
+- port_range_min: 7888
+- port_range_max: 7888
+- - protocol: tcp
+- port_range_min: 7888
+- port_range_max: 7888
+- remote_mode: remote_group_id
+- remote_group_id: { get_resource: sprout_sig_outbound }
+- - protocol: tcp
+- port_range_min: 9160
+- port_range_max: 9160
+- remote_mode: remote_group_id
+- #remote_group_id: { get_resource: homer_sig } # omit remote_group_id to reference yourself
+-
+- dime_mgmt:
+- type: OS::Neutron::SecurityGroup
+- properties:
+- name: { str_replace: { params: { __name_prefix__: { get_param: "name_prefix" } }, template: __name_prefix__-dime-mgmt } }
+- description: Security group for Dime nodes (management)
+- rules:
+- # REST-ful Provisioning API
+- - protocol: tcp
+- port_range_min: 8889
+- port_range_max: 8889
+- remote_mode: remote_group_id
+- remote_group_id: { get_resource: ellis_mgmt }
+-
+- dime_sig:
+- type: OS::Neutron::SecurityGroup
+- properties:
+- name: { str_replace: { params: { __name_prefix__: { get_param: "name_prefix" } }, template: __name_prefix__-dime-sig } }
+- description: Security group for Dime nodes (signaling)
+- rules:
+- # Cx-like HTTP API
+- - protocol: tcp
+- port_range_min: 8888
+- port_range_max: 8888
+- remote_mode: remote_group_id
+- remote_group_id: { get_resource: bono_sig }
+- - protocol: tcp
+- port_range_min: 8888
+- port_range_max: 8888
+- remote_mode: remote_group_id
+- remote_group_id: { get_resource: sprout_sig_outbound }
+- # Rf-like/HTTP API
+- - protocol: tcp
+- port_range_min: 10888
+- port_range_max: 10888
+- remote_mode: remote_group_id
+- remote_group_id: { get_resource: bono_sig }
+- - protocol: tcp
+- port_range_min: 10888
+- port_range_max: 10888
+- remote_mode: remote_group_id
+- remote_group_id: { get_resource: sprout_sig_outbound }
+- # Chronos timer pops
+- - protocol: tcp
+- port_range_min: 10888
+- port_range_max: 10888
+- remote_mode: remote_group_id
+- remote_group_id: { get_resource: vellum_sig_outbound }
+-
+- vellum_sig_outbound:
+- type: OS::Neutron::SecurityGroup
+- properties:
+- name: { str_replace: { params: { __name_prefix__: { get_param: "name_prefix" } }, template: __name_prefix__-vellum-sig-outbound } }
+- description: Security group for Vellum nodes outbound traffic (signaling)
+- rules:
+- # Chronos
+- - protocol: tcp
+- port_range_min: 7253
+- port_range_max: 7253
+- remote_mode: remote_group_id
+- #remote_group_id: { get_resource: vellum_sig_outbound } # omit remote_group_id to reference yourself
+- # Cassandra
+- - protocol: tcp
+- port_range_min: 7000
+- port_range_max: 7000
+- remote_mode: remote_group_id
+- #remote_group_id: { get_resource: vellum_sig_outbound } # omit remote_group_id to reference yourself
+- # Memcached listening to Astaire
+- - protocol: tcp
+- port_range_min: 11211
+- port_range_max: 11211
+- remote_mode: remote_group_id
+- #remote_group_id: { get_resource: vellum_sig_outbound } # omit remote_group_id to reference yourself
+-
+- vellum_sig_inbound:
+- type: OS::Neutron::SecurityGroup
+- properties:
+- name: { str_replace: { params: { __name_prefix__: { get_param: "name_prefix" } }, template: __name_prefix__-vellum-sig-inbound } }
+- description: Security group for Vellum nodes inbound traffic (signaling)
+- rules:
+- # Astaire
+- - protocol: tcp
+- port_range_min: 11311
+- port_range_max: 11311
+- remote_mode: remote_group_id
+- remote_group_id: { get_resource: sprout_sig_outbound }
+- # Astaire
+- - protocol: tcp
+- port_range_min: 11311
+- port_range_max: 11311
+- remote_mode: remote_group_id
+- remote_group_id: { get_resource: dime_sig }
+- # Chronos
+- - protocol: tcp
+- port_range_min: 7253
+- port_range_max: 7253
+- remote_mode: remote_group_id
+- remote_group_id: { get_resource: sprout_sig_outbound }
+- # Chronos
+- - protocol: tcp
+- port_range_min: 7253
+- port_range_max: 7253
+- remote_mode: remote_group_id
+- remote_group_id: { get_resource: dime_sig }
+- # Cassandra Thrift
+- - protocol: tcp
+- port_range_min: 9160
+- port_range_max: 9160
+- remote_mode: remote_group_id
+- remote_group_id: { get_resource: dime_sig }
+- # Cassandra Thrift
+- - protocol: tcp
+- port_range_min: 9160
+- port_range_max: 9160
+- remote_mode: remote_group_id
+- remote_group_id: { get_resource: homer_sig }
+-
+ outputs:
+ base_mgmt:
+ description: Base security group for all Clearwater nodes (management)
+- value: { get_resource: base_mgmt }
+- dns:
+- description: Security group for DNS nodes
+- value: { get_resource: dns }
+- ellis_mgmt:
+- description: Security group for Ellis nodes (managment)
+- value: { get_resource: ellis_mgmt }
+- bono_sig:
+- description: Security group for Bono nodes (signaling)
+- value: { get_resource: bono_sig }
+- sprout_sig_outbound:
+- description: Security group for Sprout nodes outbound traffic (signaling)
+- value: { get_resource: sprout_sig_outbound }
+- sprout_sig_inbound:
+- description: Security group for Sprout nodes inbound traffic (signaling)
+- value: { get_resource: sprout_sig_inbound }
+- homer_mgmt:
+- description: Security group for Homer nodes (management)
+- value: { get_resource: homer_mgmt }
+- homer_sig:
+- description: Security group for Homer nodes (signaling)
+- value: { get_resource: homer_sig }
+- dime_mgmt:
+- description: Security group for Dime nodes (management)
+- value: { get_resource: dime_mgmt }
+- dime_sig:
+- description: Security group for Dime nodes (signaling)
+- value: { get_resource: dime_sig }
+- vellum_sig_outbound:
+- description: Security group for Vellum nodes outbound traffic (signaling)
+- value: { get_resource: vellum_sig_outbound }
+- vellum_sig_inbound:
+- description: Security group for Vellum nodes inbound traffic (signaling)
+- value: { get_resource: vellum_sig_inbound }
++ value: { get_resource: base_mgmt }
+diff --git a/sprout.yaml b/sprout.yaml
+index 9c533b7..b51750b 100644
+--- a/sprout.yaml
++++ b/sprout.yaml
+@@ -23,26 +23,6 @@ parameters:
+ constraints:
+ - custom_constraint: neutron.network
+ description: Must be a valid network ID
+- public_sig_net_id:
+- type: string
+- description: ID of public signaling network
+- constraints:
+- - custom_constraint: neutron.network
+- description: Must be a valid network ID
+- private_sig_net_id:
+- type: string
+- description: ID of private signaling network
+- constraints:
+- - custom_constraint: neutron.network
+- description: Must be a valid network ID
+- private_sig_net_cidr:
+- type: string
+- description: Private signaling network address (CIDR notation)
+- default: 192.168.1.0/24
+- private_sig_net_gateway:
+- type: string
+- description: Private signaling network gateway address
+- default: 192.168.1.254
+ flavor:
+ type: string
+ description: Flavor to use
+@@ -64,12 +44,6 @@ parameters:
+ base_mgmt_security_group:
+ type: string
+ description: ID of base security group for all Clearwater nodes (management)
+- sprout_sig_outbound_security_group:
+- type: string
+- description: ID of security group for Sprout nodes outbound traffic (signaling)
+- sprout_sig_inbound_security_group:
+- type: string
+- description: ID of security group for Sprout nodes inbound traffic (signaling)
+ repo_url:
+ type: string
+ description: URL for Clearwater repository
+@@ -81,9 +55,6 @@ parameters:
+ dns_mgmt_ip:
+ type: string
+ description: IP address for DNS server on management network
+- dns_sig_ip:
+- type: string
+- description: IP address for DNS server on signaling network
+ dnssec_key:
+ type: string
+ description: DNSSEC private key (Base64-encoded)
+@@ -114,14 +85,15 @@ resources:
+ floating_network_id: { get_param: public_mgmt_net_id }
+ port_id: { get_resource: mgmt_port }
+
+- sig_port:
+- type: OS::Neutron::Port
++ wait_condition:
++ type: OS::Heat::WaitCondition
+ properties:
+- # Specify the network ID by string to work around OpenStack issues - see https://github.com/Metaswitch/clearwater-heat/issues/18.
+- network_id: { str_replace: { params: { x: { get_param: private_sig_net_id } }, template: x } }
+- security_groups:
+- - { get_param: sprout_sig_outbound_security_group }
+- - { get_param: sprout_sig_inbound_security_group }
++ handle: {get_resource: wait_handle}
++ count: 1
++ timeout: 1200
++
++ wait_handle:
++ type: OS::Heat::WaitConditionHandle
+
+ server:
+ type: OS::Nova::Server
+@@ -132,7 +104,6 @@ resources:
+ key_name: { get_param: key_name }
+ networks:
+ - port: { get_resource: mgmt_port }
+- - port: { get_resource: sig_port }
+ user_data_format: RAW
+ user_data:
+ str_replace:
+@@ -141,14 +112,11 @@ resources:
+ __zone__: { get_param: zone }
+ __public_mgmt_ip__: { get_attr: [ mgmt_floating_ip, floating_ip_address ] }
+ __private_mgmt_ip__: { get_attr: [ mgmt_port, fixed_ips, 0, ip_address ] }
+- __private_sig_ip__: { get_attr: [ sig_port, fixed_ips, 0, ip_address ] }
+- __private_sig_cidr__: { get_param: private_sig_net_cidr }
+- __private_sig_gateway__: { get_param: private_sig_net_gateway }
+ __dns_mgmt_ip__: { get_param: dns_mgmt_ip }
+- __dns_sig_ip__: { get_param: dns_sig_ip }
+ __dnssec_key__: { get_param: dnssec_key }
+ __etcd_ip__ : { get_param: etcd_ip }
+ __index__ : { get_param: index }
++ wc_notify: { get_attr: [wait_handle, curl_cli] }
+ template: |
+ #!/bin/bash
+
+@@ -156,36 +124,8 @@ resources:
+ exec > >(tee -a /var/log/clearwater-heat-sprout.log) 2>&1
+ set -x
+
+- # Set up the signaling network namespace on each boot by creating an init file and
+- # linking to it from runlevel 2 and 3
+- cat >/etc/init.d/signaling_namespace <<EOF
+- #!/bin/bash
+- # Create the signaling namespace and configure its interfaces.
+- set -e
+-
+- # Exit if the namespace is already set up.
+- ip netns list | grep -q signaling && exit 0
+-
+- # eth1 is the signaling interface (and eth0 is the management interface).
+- # We need to set eth1 up manually - only eth0 is automatically configured via DHCP.
+- ip netns add signaling
+- ip link set eth1 netns signaling
+- ip netns exec signaling ip link set dev lo up
+- ip netns exec signaling ip addr add __private_sig_ip__/$(echo __private_sig_cidr__ | cut -d / -f 2) dev eth1
+- ip netns exec signaling ip link set dev eth1 up
+- ip netns exec signaling ip route add default via __private_sig_gateway__
+- EOF
+-
+- chmod a+x /etc/init.d/signaling_namespace
+- ln -s /etc/init.d/signaling_namespace /etc/rc2.d/S01signaling_namespace
+- ln -s /etc/init.d/signaling_namespace /etc/rc3.d/S01signaling_namespace
+-
+- # Also set up the signaling namespace now.
+- /etc/init.d/signaling_namespace
+-
+ # Configure the APT software source.
+- echo 'deb __repo_url__ binary/' > /etc/apt/sources.list.d/clearwater.list
+- curl -L http://repo.cw-ngv.com/repo_key | apt-key add -
++ echo 'deb http://artifacts.opnfv.org/functest/clearwater/debian ./' > /etc/apt/sources.list.d/clearwater.list
+ apt-get update
+
+ # Configure /etc/clearwater/local_config.
+@@ -193,11 +133,8 @@ resources:
+ etcd_ip=__etcd_ip__
+ [ -n "$etcd_ip" ] || etcd_ip=__private_mgmt_ip__
+ cat > /etc/clearwater/local_config << EOF
+- signaling_namespace=signaling
+- signaling_dns_server=__dns_sig_ip__
+- management_local_ip=__private_mgmt_ip__
+- local_ip=__private_sig_ip__
+- public_ip=__private_sig_ip__
++ local_ip=__private_mgmt_ip__
++ public_ip=__private_mgmt_ip__
+ public_hostname=__index__.sprout.__zone__
+ etcd_cluster=$etcd_ip
+ EOF
+@@ -220,10 +157,10 @@ resources:
+ while ! { nsupdate -y "__zone__:__dnssec_key__" -v << EOF
+ server __dns_mgmt_ip__
+ update add sprout-__index__.__zone__. 30 $(ip2rr __public_mgmt_ip__)
+- update add __index__.sprout.__zone__. 30 $(ip2rr __private_sig_ip__)
+- update add sprout.__zone__. 30 $(ip2rr __private_sig_ip__)
+- update add scscf.sprout.__zone__. 30 $(ip2rr __private_sig_ip__)
+- update add icscf.sprout.__zone__. 30 $(ip2rr __private_sig_ip__)
++ update add __index__.sprout.__zone__. 30 $(ip2rr __public_mgmt_ip__)
++ update add sprout.__zone__. 30 $(ip2rr __public_mgmt_ip__)
++ update add scscf.sprout.__zone__. 30 $(ip2rr __public_mgmt_ip__)
++ update add icscf.sprout.__zone__. 30 $(ip2rr __public_mgmt_ip__)
+ update add sprout.__zone__. 30 NAPTR 0 0 "s" "SIP+D2T" "" _sip._tcp.sprout.__zone__.
+ update add _sip._tcp.sprout.__zone__. 30 SRV 0 0 5054 __index__.sprout.__zone__.
+ update add icscf.sprout.__zone__. 30 NAPTR 0 0 "s" "SIP+D2T" "" _sip._tcp.icscf.sprout.__zone__.
+@@ -242,17 +179,23 @@ resources:
+ # Use the DNS server.
+ echo 'nameserver __dns_mgmt_ip__' > /etc/dnsmasq.resolv.conf
+ echo 'RESOLV_CONF=/etc/dnsmasq.resolv.conf' >> /etc/default/dnsmasq
+- mkdir -p /etc/netns/signaling
+- echo 'nameserver __dns_sig_ip__' > /etc/netns/signaling/resolv.conf
+ service dnsmasq force-reload
+
++ for ((i=1;i<=10;i++)); do
++ monit summary
++ test -z "$(monit summary 2>&1 |sed '1,2d' |grep -v Running |grep -v Status\ ok )" && break || sleep 60
++ done
++ clearwater-etcdctl cluster-health
++ clearwater-etcdctl member list
++ cw-check_cluster_state
++ cw-check_config_sync
++
++ wc_notify --data-binary '{"status": "SUCCESS"}'
++
+ outputs:
+ public_mgmt_ip:
+ description: IP address in public (management) network
+ value: { get_attr: [ mgmt_floating_ip, floating_ip_address ] }
+ private_mgmt_ip:
+- description: IP address in private signaling network
++ description: IP address in private management network
+ value: { get_attr: [ mgmt_port, fixed_ips, 0, ip_address ] }
+- private_sig_ip:
+- description: IP address in private signaling network
+- value: { get_attr: [ sig_port, fixed_ips, 0, ip_address ] }
+diff --git a/vellum.yaml b/vellum.yaml
+index aab71f9..de15fcf 100644
+--- a/vellum.yaml
++++ b/vellum.yaml
+@@ -23,26 +23,6 @@ parameters:
+ constraints:
+ - custom_constraint: neutron.network
+ description: Must be a valid network ID
+- public_sig_net_id:
+- type: string
+- description: ID of public signaling network
+- constraints:
+- - custom_constraint: neutron.network
+- description: Must be a valid network ID
+- private_sig_net_id:
+- type: string
+- description: ID of private signaling network
+- constraints:
+- - custom_constraint: neutron.network
+- description: Must be a valid network ID
+- private_sig_net_cidr:
+- type: string
+- description: Private signaling network address (CIDR notation)
+- default: 192.168.1.0/24
+- private_sig_net_gateway:
+- type: string
+- description: Private signaling network gateway address
+- default: 192.168.1.254
+ flavor:
+ type: string
+ description: Flavor to use
+@@ -64,12 +44,6 @@ parameters:
+ base_mgmt_security_group:
+ type: string
+ description: ID of base security group for all Clearwater nodes (management)
+- vellum_sig_outbound_security_group:
+- type: string
+- description: ID of security group for Vellum nodes outbound traffic (signaling)
+- vellum_sig_inbound_security_group:
+- type: string
+- description: ID of security group for Vellum nodes inbound traffic (signaling)
+ repo_url:
+ type: string
+ description: URL for Clearwater repository
+@@ -81,9 +55,6 @@ parameters:
+ dns_mgmt_ip:
+ type: string
+ description: IP address for DNS server on management network
+- dns_sig_ip:
+- type: string
+- description: IP address for DNS server on signaling network
+ dnssec_key:
+ type: string
+ description: DNSSEC private key (Base64-encoded)
+@@ -114,14 +85,15 @@ resources:
+ floating_network_id: { get_param: public_mgmt_net_id }
+ port_id: { get_resource: mgmt_port }
+
+- sig_port:
+- type: OS::Neutron::Port
++ wait_condition:
++ type: OS::Heat::WaitCondition
+ properties:
+- # Specify the network ID by string to work around OpenStack issues - see https://github.com/Metaswitch/clearwater-heat/issues/18.
+- network_id: { str_replace: { params: { x: { get_param: private_sig_net_id } }, template: x } }
+- security_groups:
+- - { get_param: vellum_sig_outbound_security_group }
+- - { get_param: vellum_sig_inbound_security_group }
++ handle: {get_resource: wait_handle}
++ count: 1
++ timeout: 1200
++
++ wait_handle:
++ type: OS::Heat::WaitConditionHandle
+
+ server:
+ type: OS::Nova::Server
+@@ -132,7 +104,6 @@ resources:
+ key_name: { get_param: key_name }
+ networks:
+ - port: { get_resource: mgmt_port }
+- - port: { get_resource: sig_port }
+ user_data_format: RAW
+ user_data:
+ str_replace:
+@@ -141,51 +112,22 @@ resources:
+ __zone__: { get_param: zone }
+ __public_mgmt_ip__: { get_attr: [ mgmt_floating_ip, floating_ip_address ] }
+ __private_mgmt_ip__: { get_attr: [ mgmt_port, fixed_ips, 0, ip_address ] }
+- __private_sig_ip__: { get_attr: [ sig_port, fixed_ips, 0, ip_address ] }
+- __private_sig_cidr__: { get_param: private_sig_net_cidr }
+- __private_sig_gateway__: { get_param: private_sig_net_gateway }
+ __dns_mgmt_ip__: { get_param: dns_mgmt_ip }
+- __dns_sig_ip__: { get_param: dns_sig_ip }
+ __dnssec_key__: { get_param: dnssec_key }
+ __etcd_ip__ : { get_param: etcd_ip }
+ __index__ : { get_param: index }
++ wc_notify: { get_attr: [wait_handle, curl_cli] }
+ template: |
+ #!/bin/bash
+
+ # Log all output to file.
+ exec > >(tee -a /var/log/clearwater-heat-vellum.log) 2>&1
+ set -x
+-
+- # Set up the signaling network namespace on each boot by creating an init file and
+- # linking to it from runlevel 2 and 3
+- cat >/etc/init.d/signaling_namespace <<EOF
+- #!/bin/bash
+- # Create the signaling namespace and configure its interfaces.
+- set -e
+-
+- # Exit if the namespace is already set up.
+- ip netns list | grep -q signaling && exit 0
+-
+- # eth1 is the signaling interface (and eth0 is the management interface).
+- # We need to set eth1 up manually - only eth0 is automatically configured via DHCP.
+- ip netns add signaling
+- ip link set eth1 netns signaling
+- ip netns exec signaling ip link set dev lo up
+- ip netns exec signaling ip addr add __private_sig_ip__/$(echo __private_sig_cidr__ | cut -d / -f 2) dev eth1
+- ip netns exec signaling ip link set dev eth1 up
+- ip netns exec signaling ip route add default via __private_sig_gateway__
+- EOF
+-
+- chmod a+x /etc/init.d/signaling_namespace
+- ln -s /etc/init.d/signaling_namespace /etc/rc2.d/S01signaling_namespace
+- ln -s /etc/init.d/signaling_namespace /etc/rc3.d/S01signaling_namespace
+-
+- # Also set up the signaling namespace now.
+- /etc/init.d/signaling_namespace
++ sleep 180
++ sysctl -w net.ipv6.conf.lo.disable_ipv6=0
+
+ # Configure the APT software source.
+- echo 'deb __repo_url__ binary/' > /etc/apt/sources.list.d/clearwater.list
+- curl -L http://repo.cw-ngv.com/repo_key | apt-key add -
++ echo 'deb http://artifacts.opnfv.org/functest/clearwater/debian ./' > /etc/apt/sources.list.d/clearwater.list
+ apt-get update
+
+ # Configure /etc/clearwater/local_config.
+@@ -193,11 +135,8 @@ resources:
+ etcd_ip=__etcd_ip__
+ [ -n "$etcd_ip" ] || etcd_ip=__private_mgmt_ip__
+ cat > /etc/clearwater/local_config << EOF
+- signaling_namespace=signaling
+- signaling_dns_server=__dns_sig_ip__
+- management_local_ip=__private_mgmt_ip__
+- local_ip=__private_sig_ip__
+- public_ip=__private_sig_ip__
++ local_ip=__private_mgmt_ip__
++ public_ip=__private_mgmt_ip__
+ public_hostname=__index__.vellum.__zone__
+ etcd_cluster=$etcd_ip
+ EOF
+@@ -206,7 +145,7 @@ resources:
+ mkdir -p /etc/chronos
+ cat > /etc/chronos/chronos.conf << EOF
+ [http]
+- bind-address = __private_sig_ip__
++ bind-address = __private_mgmt_ip__
+ bind-port = 7253
+ threads = 50
+
+@@ -218,7 +157,7 @@ resources:
+ enabled = true
+
+ [dns]
+- servers = __dns_sig_ip__
++ servers = __dns_mgmt_ip__
+ EOF
+
+ # Now install the software.
+@@ -239,7 +178,7 @@ resources:
+ while ! { nsupdate -y "__zone__:__dnssec_key__" -v << EOF
+ server __dns_mgmt_ip__
+ update add vellum-__index__.__zone__. 30 $(ip2rr __public_mgmt_ip__)
+- update add vellum.__zone__. 30 $(ip2rr __private_sig_ip__)
++ update add vellum.__zone__. 30 $(ip2rr __public_mgmt_ip__)
+ send
+ EOF
+ } && [ $retries -lt 10 ]
+@@ -252,10 +191,19 @@ resources:
+ # Use the DNS server.
+ echo 'nameserver __dns_mgmt_ip__' > /etc/dnsmasq.resolv.conf
+ echo 'RESOLV_CONF=/etc/dnsmasq.resolv.conf' >> /etc/default/dnsmasq
+- mkdir -p /etc/netns/signaling
+- echo 'nameserver __dns_sig_ip__' > /etc/netns/signaling/resolv.conf
+ service dnsmasq force-reload
+
++ for ((i=1;i<=10;i++)); do
++ monit summary
++ test -z "$(monit summary 2>&1 |sed '1,2d' |grep -v Running |grep -v Status\ ok )" && break || sleep 60
++ done
++ clearwater-etcdctl cluster-health
++ clearwater-etcdctl member list
++ cw-check_cluster_state
++ cw-check_config_sync
++
++ wc_notify --data-binary '{"status": "SUCCESS"}'
++
+ outputs:
+ public_mgmt_ip:
+ description: IP address in public management network
+@@ -263,6 +211,3 @@ outputs:
+ private_mgmt_ip:
+ description: IP address in private management network
+ value: { get_attr: [ mgmt_port, fixed_ips, 0, ip_address ] }
+- private_sig_ip:
+- description: IP address in private signaling network
+- value: { get_attr: [ sig_port, fixed_ips, 0, ip_address ] }
diff --git a/docker/vnf/hooks/post_checkout b/docker/vnf/hooks/post_checkout
index 8d0e98124..c347524ea 100644
--- a/docker/vnf/hooks/post_checkout
+++ b/docker/vnf/hooks/post_checkout
@@ -1,4 +1,4 @@
-#!/bin/bash
+#!/bin/sh
from="${DOCKER_REPO%/*}/functest-core:${DOCKER_TAG}"
sed -i "s|^FROM.*$|FROM ${from}|" Dockerfile
diff --git a/docker/vnf/testcases.yaml b/docker/vnf/testcases.yaml
index 938f0b309..6b483af6a 100644
--- a/docker/vnf/testcases.yaml
+++ b/docker/vnf/testcases.yaml
@@ -2,26 +2,45 @@
tiers:
-
name: vnf
- order: 4
- ci_loop: '(daily)|(weekly)'
description: >-
Collection of VNF test cases.
testcases:
-
+ case_name: cloudify
+ project_name: functest
+ criteria: 100
+ blocking: false
+ description: >-
+ This test case deploys the Cloudify orchestrator.
+ run:
+ name: cloudify
+ -
case_name: cloudify_ims
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-.*-nofeature-.*ha'
+ - NO_TENANT_NETWORK: '^(?![tT]rue$)'
+ run:
+ name: cloudify_ims
+
+ -
+ case_name: heat_ims
+ project_name: functest
+ criteria: 100
+ blocking: false
+ description: >-
+ This test case deploys an OpenSource vIMS solution from
+ Clearwater using the OpenStack Heat orchestrator.
+ It also runs some signaling traffic.
+ dependencies:
+ - NO_TENANT_NETWORK: '^(?![tT]rue$)'
run:
- module: 'functest.opnfv_tests.vnf.ims.cloudify_ims'
- class: 'CloudifyIms'
+ name: heat_ims
-
case_name: vyos_vrouter
@@ -31,11 +50,9 @@ tiers:
description: >-
This test case is vRouter testing.
dependencies:
- installer: ''
- scenario: 'os-.*-nofeature-.*ha'
+ - NO_TENANT_NETWORK: '^(?![tT]rue$)'
run:
- module: 'functest.opnfv_tests.vnf.router.cloudify_vrouter'
- class: 'CloudifyVrouter'
+ name: vyos_vrouter
-
case_name: juju_epc
@@ -46,8 +63,6 @@ tiers:
vEPC validation with Juju as VNF manager and ABoT as test
executor.
dependencies:
- installer: ''
- scenario: 'os-.*-nofeature-.*ha'
+ - NO_TENANT_NETWORK: '^(?![tT]rue$)'
run:
- module: 'functest.opnfv_tests.vnf.epc.juju_epc'
- class: 'JujuEpc'
+ name: juju_epc
diff --git a/docs/com/css/theme/OPNFV-Berlin.css b/docs/com/css/theme/OPNFV-Berlin.css
index 9f957d6f1..34f73b4bd 100644
--- a/docs/com/css/theme/OPNFV-Berlin.css
+++ b/docs/com/css/theme/OPNFV-Berlin.css
@@ -31,13 +31,13 @@ body {
bottom: 1em;
left: 1em;
font-size: 0.5em;
-
+
}
.reveal .slides > section, .reveal .slides > section > section {
line-height: 1.3;
font-weight: inherit; }
-
+
.reveal .opnfv-title {
background-image: url("../../img/title-bg-berlin.png" no-repeat);
}
@@ -87,7 +87,7 @@ body {
.reveal h1 {
text-shadow: none; }
-
+
/*********************************************
* OTHER
diff --git a/docs/com/css/theme/OPNFV.css b/docs/com/css/theme/OPNFV.css
index 745a2a8de..c59c59f8d 100644
--- a/docs/com/css/theme/OPNFV.css
+++ b/docs/com/css/theme/OPNFV.css
@@ -30,13 +30,13 @@ body {
bottom: 1em;
left: 1em;
font-size: 0.5em;
-
+
}
.reveal .slides > section, .reveal .slides > section > section {
line-height: 1.3;
font-weight: inherit; }
-
+
.reveal .opnfv-title {
background-image: url("../../img/title-bg.png" no-repeat);
}
@@ -83,7 +83,7 @@ body {
.reveal h1 {
text-shadow: none; }
-
+
/*********************************************
* OTHER
diff --git a/docs/com/pres/Summit/Berlin-2016/conversation.html b/docs/com/pres/Summit/Berlin-2016/conversation.html
index 356c2ad1e..5c1e18450 100644
--- a/docs/com/pres/Summit/Berlin-2016/conversation.html
+++ b/docs/com/pres/Summit/Berlin-2016/conversation.html
@@ -215,7 +215,7 @@
</div>
<div class='footer'>
- <img src="../../../img/logo-OPNFV-Berlin.png" alt="OPNFV logo">
+ <img src="../../../img/logo-OPNFV-Berlin.png" alt="OPNFV logo">
</div>
</div>
diff --git a/docs/com/pres/Summit/Berlin-2016/summit-Berlin.html b/docs/com/pres/Summit/Berlin-2016/summit-Berlin.html
index 97fa66c18..2b3b3b4ef 100644
--- a/docs/com/pres/Summit/Berlin-2016/summit-Berlin.html
+++ b/docs/com/pres/Summit/Berlin-2016/summit-Berlin.html
@@ -81,7 +81,7 @@
</section>
<section data-markdown>
## so concretely...
- * Validate scenarios for the release
+ * Validate scenarios for the release
* Give confidence on OPNFV fresh releases
* Ensure consistancy towards installers
* Ensure End to End interoperability
@@ -135,7 +135,7 @@
* 2 installers: Foreman/Fuel
* Lots of manual operations (reporting, documentation)
</section>
- </section>
+ </section>
<section>
<section data-markdown>
# Brahmaputra
@@ -146,8 +146,8 @@
* 3 feature projects: doctor, promise, sdnvpn
* 13 Scenarios
* 4 Installers (Apex, Compass, Fuel, Joid)
- * Test result collection
- * Automatic dashboard
+ * Test result collection
+ * Automatic dashboard
</section>
<section>
<h3>Jiras</h3>
@@ -196,7 +196,7 @@
</tr>
</tbody>
</table>
- * difference of duration due to POD and test suites
+ * difference of duration due to POD and test suites
</section>
<section data-markdown>
@@ -204,7 +204,7 @@
* Tempest/Rally
* harmonizing installer related OpenStack configuration differences
* creating customized test lists
- * main challenge was resolving SDN controller interworking problems
+ * main challenge was resolving SDN controller interworking problems
* vIMS
* complete but complex test case
* very interesting to automate (pre MANO, most of Telco needs met there)
@@ -212,7 +212,7 @@
</section>
- <section>
+ <section>
<section data-markdown>
# Colorado
</section>
@@ -221,7 +221,7 @@
## What's new?
* New internal test cases: healthcheck, security
* New controler: OpenContrail?
- * New feature projects (domino, multisites, movie, parser, moon, copper, models, onos-sfc...)
+ * New feature projects (domino, multisites, movie, parser, moon, copper, models, onos-sfc...)
* ARM Support (congratulations to ENEA team!)
* Simplified feature project integration journey
</section>
@@ -255,19 +255,19 @@
* New VNFs (vEPC, vCDN, vWhatever...)
* Multi sites (e.g bgpvpn with different back ends)
* Better test coverage
- </section>
+ </section>
<section data-markdown>
## A Functional testing As a Service framework
* Scenario owner can select their relevant test cases
* Test duration estimation
* Agile dashboarding
* Analytics
- </section>
+ </section>
<section data-markdown>
## Upstream
* Rally: time to give back more
- * Functest description for ETSI?
- </section>
+ * Functest description for ETSI?
+ </section>
</section>
<section>
diff --git a/docs/com/pres/Summit/Berlin-2016/testapi.html b/docs/com/pres/Summit/Berlin-2016/testapi.html
index c40637cbf..5e56d5052 100644
--- a/docs/com/pres/Summit/Berlin-2016/testapi.html
+++ b/docs/com/pres/Summit/Berlin-2016/testapi.html
@@ -69,7 +69,7 @@
* Test cases
* Results
</section>
-
+
<section data-markdown>
## Status Currently
* From many projects
@@ -87,7 +87,7 @@
</aside>
</script>
</section>
-
+
<section data-markdown>
## Help building
* Dashboards
@@ -135,8 +135,8 @@
<li>Scripts to support databse backup/restore/update</li>
<li>Support installation</li>
<aside class='notes'>
- So you can discover and understand the capabilities of the service without
- access to source code, documentation, or through network traffic inspection,
+ So you can discover and understand the capabilities of the service without
+ access to source code, documentation, or through network traffic inspection,
and also you can interact with the TestAPI directly through swagger website.
</aside>
</ul>
@@ -148,12 +148,12 @@
<section data-markdown>
# API Evoluation
</section>
-
+
<section>
<h2> URI changes...</h2>
- <div style="text-align:left"">
+ <div style="text-align:left"">
<p> testresults.opnfv.org/<span style="color:lightblue">TestAPI</span> => <br>testresults.opnfv.org/<span style="color:yellow">test/api/v1</span> </p>
-
+
<p> /test/api/v1/<b>pods</b></p>
<p> /test/api/v1/<b>projects</b></p>
<p> /test/api/v1/projects/qtip/<b>cases</b></p>
@@ -200,7 +200,7 @@
<section>
<h2>unit tests</h2>
<pre><code class="hljs" data-trim contenteditable>
-umry8364@umry8364-Latitude-E6400:~/Dev/OPNFV/releng/utils/test/result_collection_api$ ./run_test.sh
+umry8364@umry8364-Latitude-E6400:~/Dev/OPNFV/releng/utils/test/result_collection_api$ ./run_test.sh
Tests running...
WARNING:tornado.general:404 GET /dashboard/v1/results?case=vPing&pod=zte-pod1&version=C&installer=fuel&period=5 (127.0.0.1): Project name missing
WARNING:tornado.access:404 GET /dashboard/v1/results?case=vPing&pod=zte-pod1&version=C&installer=fuel&period=5 (127.0.0.1) 2.30ms
diff --git a/docs/com/pres/compliance/compliance.md b/docs/com/pres/compliance/compliance.md
new file mode 100644
index 000000000..cbe0dbe17
--- /dev/null
+++ b/docs/com/pres/compliance/compliance.md
@@ -0,0 +1,97 @@
+# From Verification to CNTT Compliance
+
+[Cédric Ollivier](mailto:cedric.ollivier@orange.com)
+
+2019/12/04
+
+
+
+## Infrastructure Verification
+
+
+### Functest in a nutshell
+
+- verify any kind of OpenStack and Kubernetes deployments (OPNFV model)
+ including production environments
+- conform with upstream rules (OpenStack gate jobs and Kubernetes conformance
+ tests)
+- ensure that the platforms meet Network Functions Virtualization requirements
+
+
+### Functest suites
+
+- all functional tests (3000+) as defined by the upstream communities
+ (e.g. Tempest, neutron-tempest-api, Barbican, Patrole...)
+- 3 hours upstream API and dataplane benchmarking tests (Rally, VMTP and
+ Shaker)
+- Virtual Network Function deployments and testing (vIMS, vRouter and vEPC)
+
+
+
+## CNTT Compliance
+
+
+### Verification vs Compliance
+
+- verification allows skipping test if optional services (Gnocchi, Barbican,
+ etc.) or capabilities (remote console access, Neutron BGPVPN or SFC, etc.)
+ are missing
+- compliance forces here the full API descriptions as currently proposed by
+ CNTT (please see
+ [Interfaces and APIs](https://github.com/cntt-n/CNTT/blob/master/doc/ref_arch/openstack/chapters/chapter05.md))
+- then the testcase descriptions should forbid skipping any test and cover only
+ the mandatory services (and their mandatory capabilities)
+
+
+### Changelog
+
+- all the logics were already in Functest and the underlying frameworks (Rally,
+ Tempest, etc.)
+- 2 new CNTT-related containers including the new testcase descriptions were
+ published to easily verify the compliance
+- all 3 Functest SUTs (Rocky, Stein/Train and Master) are now compliant with
+ CNTT API to ensure the continuous integration
+- the benchmarking testcases doesn't validate any KPI as nothing is written in
+ CNTT documentation
+
+
+### RI verification and Compliance
+
+- CNTT Reference Implementation 1 is already continuously verified
+ ([continuous integration model](https://build.opnfv.org/ci/view/cntt/job/cntt-latest-daily/))
+- the conformance is currently failing due to a few bugs in deployments and
+ missing features
+
+**Be free to [deploy your own CNTT Compliance CI/CD toolchain](https://wiki.opnfv.org/pages/viewpage.action?pageId=32015004)
+ in a few commands**
+
+
+
+## Conclusion
+
+
+### Next steps
+
+- fix reference implementation 1 deployments and then achieve the compliance
+- port existing OPNFV testcases to Xtesting and then add them in the continuous
+ integration loop
+- update the testcase descritions according to the CNTT progress (KPI, API
+ changes)
+
+
+### Takeaways
+
+- Functest allows verifying any production Infrastructure and now checking the
+ CNTT API Compliance
+- all containers can be already consumed
+- any third-party certification should reuse the Functest CNTT-related
+ containers as they are
+- [CNTT RI continuous integration](https://build.opnfv.org/ci/view/cntt/job/cntt-latest-daily/)
+ is in place and any testcase can be smoothly added if they leverage on
+ Xtesting
+
+**Try it, and you will love it!**
+
+
+
+## Thank you
diff --git a/docs/com/pres/compliance/index.html b/docs/com/pres/compliance/index.html
new file mode 100644
index 000000000..94fc121d6
--- /dev/null
+++ b/docs/com/pres/compliance/index.html
@@ -0,0 +1,52 @@
+<html>
+<head>
+<title>From Verification to Compliance</title>
+<meta name="author" content="Cédric Ollivier">
+<meta name="viewport"
+ content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
+<link rel="stylesheet" href="../reveal.js/css/reveal.css">
+<link rel="stylesheet" href="../reveal.js/css/theme/white.css">
+<link rel="stylesheet" href="../reveal.js/lib/css/zenburn.css">
+<script>
+var link = document.createElement( 'link' );
+link.rel = 'stylesheet';
+link.type = 'text/css';
+link.href = window.location.search.match( /print-pdf/gi ) ? '../reveal.js/css/print/pdf.css' : '../reveal.js/css/print/paper.css';
+document.getElementsByTagName( 'head' )[0].appendChild( link );
+</script>
+</head>
+<body>
+ <div class="reveal">
+ <div class="slides">
+ <section data-markdown="compliance.md" data-separator="^\n\n\n"
+ data-separator-vertical="^\n\n" data-separator-notes="^Note:"></section>
+ </div>
+ </div>
+ <script src="../reveal.js/lib/js/head.min.js"></script>
+ <script src="../reveal.js/js/reveal.js"></script>
+ <script>
+ Reveal.initialize({
+ dependencies : [ {
+ src : '../reveal.js/plugin/markdown/marked.js',
+ condition : function() {
+ return !!document.querySelector('[data-markdown]');
+ }
+ }, {
+ src : '../reveal.js/plugin/markdown/markdown.js',
+ condition : function() {
+ return !!document.querySelector('[data-markdown]');
+ }
+ }, {
+ src: '../reveal.js/plugin/highlight/highlight.js',
+ async: true,
+ callback: function() {
+ hljs.initHighlightingOnLoad();
+ }
+ }, {
+ src: '../reveal.js/plugin/notes/notes.js',
+ async: true
+ } ]
+ });
+ </script>
+</body>
+</html>
diff --git a/docs/com/pres/dockerslicing/dockerslicing.md b/docs/com/pres/dockerslicing/dockerslicing.md
index a66453248..0d1ce5e21 100644
--- a/docs/com/pres/dockerslicing/dockerslicing.md
+++ b/docs/com/pres/dockerslicing/dockerslicing.md
@@ -63,7 +63,7 @@
### 8 Functest containers
-```bash
+```shell
$ sudo docker search opnfv |grep functest-
opnfv/functest-core OPNFV Functest core image
opnfv/functest-restapi OPNFV Functest restapi image
diff --git a/docs/com/pres/euphrates_functest_evolution/euphrates.md b/docs/com/pres/euphrates_functest_evolution/euphrates.md
index 49aab16cd..2c3105539 100644
--- a/docs/com/pres/euphrates_functest_evolution/euphrates.md
+++ b/docs/com/pres/euphrates_functest_evolution/euphrates.md
@@ -120,7 +120,7 @@ export OS_IDENTITY_API_VERSION=3
#### Retrieve all the images
```
-mkdir -p images && wget -q -O- https://git.opnfv.org/functest/plain/functest/ci/download_images.sh | bash -s -- images && ls -1 images/*
+mkdir -p images && wget -q -O- https://git.opnfv.org/functest/plain/functest/ci/download_images.sh | sh -s -- images && ls -1 images/*
images/CentOS-7-aarch64-GenericCloud.qcow2
images/CentOS-7-aarch64-GenericCloud.qcow2.xz
images/CentOS-7-x86_64-GenericCloud.qcow2
diff --git a/docs/com/pres/functest2019/functest2019.md b/docs/com/pres/functest2019/functest2019.md
new file mode 100644
index 000000000..48f01cb0c
--- /dev/null
+++ b/docs/com/pres/functest2019/functest2019.md
@@ -0,0 +1,105 @@
+# Functest 2019
+
+[Cédric Ollivier](mailto:cedric.ollivier@orange.com)
+
+2019/01/08
+
+
+
+## Gates
+
+
+### Today's Verify -1
+
+- one error is detected by yamllint, pep8, pylint, ansible-lint, bashate or
+ doc8
+- one unit test fails (py27 and py35)
+- specific modules are not rated 10/10 by pylint
+- our Framework is not fully covered
+- unix permissions are wrong
+- one doc cannot be generated without warning
+
+Please see [tox.ini](https://git.opnfv.org/functest/tree/tox.ini) for details
+
+
+### Great! But
+
+- the current gate checks all coding rules, our Framework and all interfaces
+to third-parties but **not our testcases**
+- it doesn't break **the circular dependencies** between Installers and
+Functest (Installers ask for a trustable healthcheck but we need results of
+"Installer runs" as prerequisites)
+
+Our testcases have still **to be verified by hand** what differs from
+OpenStack Workflow.
+
+
+### Functional gating
+
+- we need to run all Functest patches before merge against reference
+plateforms (OpenStack and Kubernetes)
+- a voting job must forbid the merge if one test fails (as the workflow
+process implemented by OpenStack)
+
+
+### Improve the current daily model
+
+- all Functest jobs are linked to the OPNFV installers and can hardly be
+ reused by endusers
+- all test suites are run sequentially
+- rally_full is excluded due to its duration (~3 hours)
+- all possible remaining resources are cleant when installing the scenarios
+
+**It's fine for gating installers but not for verifying that Functest supports parallel and live testing**
+
+
+### New Xtesting Ansible role
+
+- deploy anywhere the full OPNFV CI/CD toolchain in few commands
+- easily add external bots voting in reviews
+- produce all Xtesting-based fonctional jobs (Xtesting, Functest and Functest
+ Kubernetes) in Releng
+- could be instanciated for testing services out of the infrastructure domain
+
+**It's already in a [good shape](https://lists.opnfv.org/g/opnfv-tech-discuss/message/22552). [Try it!](https://wiki.opnfv.org/pages/viewpage.action?pageId=32015004)**
+
+
+
+## Quality Assurance
+
+**Functest is matching the OpenStack Quality Golden rules**
+
+
+### Pylint and coverage (started from E release)
+- only need to refactor several vnf testcases and to remove duplicated code
+- document well and cover Functest utils: they are reused by
+OPNFV third-parties (SFC, SDNVPN)
+
+** Functest will be rated 10/10 very soon**
+
+
+### releasing
+
+- Functest could be also released as a classical Python packages like Xtesting(
+[PyPI](https://pypi.python.org/pypi))
+- Xtesting and Functest could be released as GNU/Linux distribution packages
+
+
+
+## other challenges
+
+
+### proposals
+
+- integrate Rally and Tempest as core modules in Functest (we do merge tempest.py and
+ conf_utils.py)
+- deploy cloud-native VNF (Clearwater IMS?)
+- why not leveraging on OpenStack middlewares such as
+ [oslo.config](https://docs.openstack.org/oslo.config/latest/)?
+- promote our VNF testcases in the upstream communities
+
+**Any new testcase is more than welcome!**
+
+
+
+## Thank you
diff --git a/docs/com/pres/functest2019/index.html b/docs/com/pres/functest2019/index.html
new file mode 100644
index 000000000..33dc9a9f2
--- /dev/null
+++ b/docs/com/pres/functest2019/index.html
@@ -0,0 +1,52 @@
+<html>
+<head>
+<title>Functest 2019</title>
+<meta name="author" content="Cédric Ollivier">
+<meta name="viewport"
+ content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
+<link rel="stylesheet" href="../reveal.js/css/reveal.css">
+<link rel="stylesheet" href="../reveal.js/css/theme/white.css">
+<link rel="stylesheet" href="../reveal.js/lib/css/zenburn.css">
+<script>
+var link = document.createElement( 'link' );
+link.rel = 'stylesheet';
+link.type = 'text/css';
+link.href = window.location.search.match( /print-pdf/gi ) ? '../reveal.js/css/print/pdf.css' : '../reveal.js/css/print/paper.css';
+document.getElementsByTagName( 'head' )[0].appendChild( link );
+</script>
+</head>
+<body>
+ <div class="reveal">
+ <div class="slides">
+ <section data-markdown="functest2019.md" data-separator="^\n\n\n"
+ data-separator-vertical="^\n\n" data-separator-notes="^Note:"></section>
+ </div>
+ </div>
+ <script src="../reveal.js/lib/js/head.min.js"></script>
+ <script src="../reveal.js/js/reveal.js"></script>
+ <script>
+ Reveal.initialize({
+ dependencies : [ {
+ src : '../reveal.js/plugin/markdown/marked.js',
+ condition : function() {
+ return !!document.querySelector('[data-markdown]');
+ }
+ }, {
+ src : '../reveal.js/plugin/markdown/markdown.js',
+ condition : function() {
+ return !!document.querySelector('[data-markdown]');
+ }
+ }, {
+ src: '../reveal.js/plugin/highlight/highlight.js',
+ async: true,
+ callback: function() {
+ hljs.initHighlightingOnLoad();
+ }
+ }, {
+ src: '../reveal.js/plugin/notes/notes.js',
+ async: true
+ } ]
+ });
+ </script>
+</body>
+</html>
diff --git a/docs/com/pres/functest2020/functest2020.md b/docs/com/pres/functest2020/functest2020.md
new file mode 100644
index 000000000..a81667939
--- /dev/null
+++ b/docs/com/pres/functest2020/functest2020.md
@@ -0,0 +1,61 @@
+# Functest 2020
+
+[Cédric Ollivier](mailto:cedric.ollivier@orange.com)
+
+2020/01/16
+
+
+
+## What's new in Jerma?
+
+
+### Better test case verification
+
+- switch to Ceph in our Functest SUTs
+- add Neutron features in our SUTs to improve the case verification
+- test all capabilities possible (e.g. vnc_console)
+- verify automatically the CNTT-related containers into additional to the
+ classical ones
+- harden xrally_kubernetes
+
+**Functest SUTs are compliant to CNTT RC**
+
+
+### New test cases
+
+- tempest_horizon
+- tempest_keystone
+- tempest_cinder
+- refstack_platform
+- refstack_object
+- octavia
+- xrally_kubernetes
+
+
+### New usage
+
+- **support CNTT RC (API testing, API and dataplane benchmarking, VNF onboarding and testing)**
+- verify ONAP WindRiver OpenLab via Functest CI in a VM ("Inception model")
+- allow minimal l2-only testing via Rally
+
+**still pushing the limit!**
+
+
+
+## Kali (K-release)
+
+
+### Ideas:
+
+- finish updating to Alpine 3.11 and Python 3.8
+- finish KloudBuster integration (it has to be updated to Python3 first)
+- add tempest-stress
+- update and possibly add heat-tempest-plugin
+- add cyborg-tempest-plugin? ironic-tempest-plugin ? xxx-tempest-plugin?
+- add CNF into Kubernetes testing
+
+**continuously hardening the gates and improving code quality**
+
+
+
+## Thank you
diff --git a/docs/com/pres/functest2020/index.html b/docs/com/pres/functest2020/index.html
new file mode 100644
index 000000000..88195becb
--- /dev/null
+++ b/docs/com/pres/functest2020/index.html
@@ -0,0 +1,52 @@
+<html>
+<head>
+<title>Functest 2020</title>
+<meta name="author" content="Cédric Ollivier">
+<meta name="viewport"
+ content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
+<link rel="stylesheet" href="../reveal.js/css/reveal.css">
+<link rel="stylesheet" href="../reveal.js/css/theme/white.css">
+<link rel="stylesheet" href="../reveal.js/lib/css/zenburn.css">
+<script>
+var link = document.createElement( 'link' );
+link.rel = 'stylesheet';
+link.type = 'text/css';
+link.href = window.location.search.match( /print-pdf/gi ) ? '../reveal.js/css/print/pdf.css' : '../reveal.js/css/print/paper.css';
+document.getElementsByTagName( 'head' )[0].appendChild( link );
+</script>
+</head>
+<body>
+ <div class="reveal">
+ <div class="slides">
+ <section data-markdown="functest2020.md" data-separator="^\n\n\n"
+ data-separator-vertical="^\n\n" data-separator-notes="^Note:"></section>
+ </div>
+ </div>
+ <script src="../reveal.js/lib/js/head.min.js"></script>
+ <script src="../reveal.js/js/reveal.js"></script>
+ <script>
+ Reveal.initialize({
+ dependencies : [ {
+ src : '../reveal.js/plugin/markdown/marked.js',
+ condition : function() {
+ return !!document.querySelector('[data-markdown]');
+ }
+ }, {
+ src : '../reveal.js/plugin/markdown/markdown.js',
+ condition : function() {
+ return !!document.querySelector('[data-markdown]');
+ }
+ }, {
+ src: '../reveal.js/plugin/highlight/highlight.js',
+ async: true,
+ callback: function() {
+ hljs.initHighlightingOnLoad();
+ }
+ }, {
+ src: '../reveal.js/plugin/notes/notes.js',
+ async: true
+ } ]
+ });
+ </script>
+</body>
+</html>
diff --git a/docs/com/pres/gambia/gambia.md b/docs/com/pres/gambia/gambia.md
new file mode 100644
index 000000000..4a65e9905
--- /dev/null
+++ b/docs/com/pres/gambia/gambia.md
@@ -0,0 +1,178 @@
+# Functest on steroids
+
+[Cédric Ollivier](mailto:cedric.ollivier@orange.com)
+
+2019/01/08
+
+
+
+## OPNFV
+
+![OPNFV](https://docs.opnfv.org/en/stable-fraser/_images/OPNFV_testing_working_group1.png)
+<!-- .element: style="border: 0; width: 90%" -->
+
+
+
+## Verify OpenStack and Kubernetes
+
+
+### Functest in a nutshell
+
+- verify any kind of OpenStack and Kubernetes deployments
+- conform with upstream rules (OpenStack gate jobs and Kubernetes conformance
+ tests)
+- ensure that the platforms meet Network Functions Virtualization requirements
+
+
+### Functest suites
+
+- as many upstream functional tests as possible (e.g. Tempest,
+ neutron-tempest-api, Barbican, Patrole...)
+- upstream API and dataplane benchmarking tools (Rally, Vmtp and Shaker)
+- additional VNF deployments and testing (vIMS, vRouter and vEPC)
+
+**Dovetail only runs few Functest functional tests and then we have to verify
+any OPNFV-certified scenarios via Functest anyway**
+
+
+### What's new in Functest?
+
+- new testcases were quickly integrated in Functest: Patrole, Barbican, Shaker,
+ ...
+- all testcases can run in parallel to decrease the overall duration
+- the resources cleaning has been improved
+- **our testcases may be run vs VIM in production**
+- **it includes most of the OpenStack gate jobs**
+
+
+### Support of OS and K8s master
+
+| Functest | OpenStack | Kubernetes |
+| :------: | :---------: | :--------: |
+| master | master | master |
+| hunter | rocky | v1.11.3 |
+| gambia | queens | v1.11.3 |
+
+
+### < 50 Euros
+
+![Raspberry PI](raspberrypi.jpg)
+<!-- .element: style="border: 0; width: 70%" -->
+
+
+
+## Reuse of OPNFV
+
+
+### Xtesting in a nutshell
+
+- allow the developer to work only on the test suites without diving into CI/CD
+ integration
+- simplify test integration in a complete LFN-based CI/CD toolchain (e.g.
+ Jenkins, Testing Containers, Test API and dashboard)
+- allow a proper design and verify multiple components in the same CI/CD
+ toolchain (OpenStack, Kubernetes, ONAP, etc.)
+
+**Easy to use and very useful for any CI/CD toochain (unlinked to Infrastrure)**
+
+
+### A user story ONAP
+
+- all tests are run by a specialized Docker container(**<100 MB**) instead of
+the classical ONAP testing virtual machine (**> 1GB**).
+- the container mainly inherits from opnfv/xtesting and is completed by:
+ - Python dependencies
+ - all ONAP Robot Framework files retrieved from the original repositories
+ - testcases.yaml describing the testcases
+
+[Orange-OpenSource/xtesting-onap-robot](https://github.com/Orange-OpenSource/xtesting-onap-robot/)
+
+
+### What's new in Xtesting?
+
+- new ansible roles and playbooks have been developed to allow **deploying your
+ full CI/CD toolchains in few minutes** (Jenkins, Minio, TestAPI, MongoDB and
+ Docker registry)
+
+```shell
+virtualenv xtesting
+. xtesting/bin/activate
+pip install ansible docker
+ansible-galaxy install collivier.xtesting
+git clone https://gerrit.opnfv.org/gerrit/functest-xtesting functest-xtesting-src
+ansible-playbook functest-xtesting-src/ansible/site.yml
+deactivate
+```
+
+**They are already reused in Functest and by Orange out of the
+Infrastrure domain**
+
+
+
+## Collect results
+
+
+### OPNFV Test Database in a nutshell
+
+- it's a fair comparison of Neutron implementations (Agents vs SDN
+ controller)
+- it stores all verification results and all performance data from different
+ hardware over the world which could be easily postprocessed
+- it could be very useful to select the adequate opensource solutions
+ regarding metrics and capabilities
+
+
+### which Neutron backend?
+
+- most Neutron standalone and OVN scenarios pass Functest decently
+- no ODL scenarios pass the advanced testcases (benchmarking tools and
+ VNFs). It's still unclear if it's due to the Installers, ODL or POD
+ misconfigurations.
+- no Tungsten Fabric is released in Gambia
+
+**We expected that ODL results would have improved before the first Gambia
+ corrective**
+
+
+### Contrail testing (out of OPNFV)
+
+- **3.X 4.X**: mostly verified except some functional tests about
+ visibility which fail due to the falsy admin role (they can be easily
+ blacklisted)
+- **5.X**: a limited set of bugs in Contrail mostly forbid running few
+ functional tests and benchmarking tools:
+ - wrong external network listing
+ - Contrail doesn't allow booting a VM without network (and elects the wrong
+ network)
+
+
+### And performance?
+
+- OVS DPDK is not fully integrated by an OPNFV installer (Fuel is in a good
+ shape to support it)
+- the only scenario including VPP is not part of Gambia
+
+**From the time being, we can't evaluate the benefits of OVS DPDK or VPP thanks
+ to OPNFV**
+
+
+
+## Conclusion
+
+
+### Gambia
+
+- Functest and Xtesting are powerful and easy to (re)use (containers, jenkins
+ jobs, ansible playbooks, Raspberry PI, etc.).
+- the number of installers and scenarios decreased in Gambia (it's still
+ unclear regarding the overall quality). **What about OPNFV Test Database if
+ it decreases again in 2019?**
+
+
+### And beyond
+
+- test frameworks are now considered as crucial for OPNFV (see [Last OPNFV Marketing update](https://wiki.opnfv.org/download/attachments/2925933/OPNFV%20Marketing%20Update%20091818.pptx?version=1&modificationDate=1537228648000&api=v2)) and Functest and Xtesting could be
+already widely reused out of OPNFV
+- the new test-driven approach as proposed by the [OPNFV Strategic Plan](https://wiki.opnfv.org/download/attachments/2925933/OPNFV%20Strategy%20and%20Plan%20v0.5.pptx?version=1&modificationDate=1540961098000&api=v2) could increase **the quality of all
+scenarios**. But we are also suggesting to let the installers decide their
+test cases.
diff --git a/docs/com/pres/gambia/index.html b/docs/com/pres/gambia/index.html
new file mode 100644
index 000000000..db3a6aaa2
--- /dev/null
+++ b/docs/com/pres/gambia/index.html
@@ -0,0 +1,52 @@
+<html>
+<head>
+<title>Functest on steroids</title>
+<meta name="author" content="Cédric Ollivier">
+<meta name="viewport"
+ content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
+<link rel="stylesheet" href="../reveal.js/css/reveal.css">
+<link rel="stylesheet" href="../reveal.js/css/theme/white.css">
+<link rel="stylesheet" href="../reveal.js/lib/css/zenburn.css">
+<script>
+var link = document.createElement( 'link' );
+link.rel = 'stylesheet';
+link.type = 'text/css';
+link.href = window.location.search.match( /print-pdf/gi ) ? '../reveal.js/css/print/pdf.css' : '../reveal.js/css/print/paper.css';
+document.getElementsByTagName( 'head' )[0].appendChild( link );
+</script>
+</head>
+<body>
+ <div class="reveal">
+ <div class="slides">
+ <section data-markdown="gambia.md" data-separator="^\n\n\n"
+ data-separator-vertical="^\n\n" data-separator-notes="^Note:"></section>
+ </div>
+ </div>
+ <script src="../reveal.js/lib/js/head.min.js"></script>
+ <script src="../reveal.js/js/reveal.js"></script>
+ <script>
+ Reveal.initialize({
+ dependencies : [ {
+ src : '../reveal.js/plugin/markdown/marked.js',
+ condition : function() {
+ return !!document.querySelector('[data-markdown]');
+ }
+ }, {
+ src : '../reveal.js/plugin/markdown/markdown.js',
+ condition : function() {
+ return !!document.querySelector('[data-markdown]');
+ }
+ }, {
+ src: '../reveal.js/plugin/highlight/highlight.js',
+ async: true,
+ callback: function() {
+ hljs.initHighlightingOnLoad();
+ }
+ }, {
+ src: '../reveal.js/plugin/notes/notes.js',
+ async: true
+ } ]
+ });
+ </script>
+</body>
+</html>
diff --git a/docs/com/pres/gambia/raspberrypi.jpg b/docs/com/pres/gambia/raspberrypi.jpg
new file mode 100644
index 000000000..60a2638f3
--- /dev/null
+++ b/docs/com/pres/gambia/raspberrypi.jpg
Binary files differ
diff --git a/docs/com/pres/oran/ftth.png b/docs/com/pres/oran/ftth.png
new file mode 100644
index 000000000..5b441d1de
--- /dev/null
+++ b/docs/com/pres/oran/ftth.png
Binary files differ
diff --git a/docs/com/pres/oran/oran.md b/docs/com/pres/oran/oran.md
new file mode 100644
index 000000000..87fba1306
--- /dev/null
+++ b/docs/com/pres/oran/oran.md
@@ -0,0 +1,90 @@
+---
+author: Cédric Ollivier
+title: OPNFV/CNTT CI assets
+date: 2020/12/01
+---
+## Continuous integration
+
+
+### A few CNTT reqs
+
+- OPNFV has built a complete CI/CD toolchain for continuously deploying and
+ testing cloud infrastructure
+- Reference conformance only requires for the local deployment of the
+ same components
+- all test cases must be delivered as **Docker containers** including the
+ common test case execution and the unified way to manage all the interactions
+
+**Integrate smoothly and deploy fastly**
+
+
+### How OPNFV/CNTT helps?
+
+- **Functest** offers a collection of state-of-the-art virtual infrastructure
+ test suites
+- **Xtesting** helps assembling sparse test cases and accelerating the adoption
+ of CI/CD best practices
+- **XtestingCI** eases deploying anywhere plug-and-play CI/CD toolchains in a
+ few commands
+- **CNTT** defines conformance suites and its playbooks leveraging this 3
+ testing frameworks
+
+**Leverage best opensource tools and practices**
+
+
+### Testing [FTTH](https://en.wikipedia.org/wiki/Fiber_to_the_x) equipment
+
+![FTTH](ftth.png)
+
+
+### Deploy your CI toolchain
+
+```
+virtualenv xtesting
+. xtesting/bin/activate
+pip install ansible
+ansible-galaxy install collivier.xtesting
+git clone https://gerrit.opnfv.org/gerrit/functest-xtesting functest-xtesting-src
+ansible-playbook functest-xtesting-src/ansible/site.yml
+deactivate
+rm -rf functest-xtesting-src xtesting
+```
+
+**More scenarios in [[1]](https://wiki.opnfv.org/pages/viewpage.action?pageId=32015004)**
+
+
+
+## Testing
+
+
+### Verif', Compliance and Interop'
+
+- verification allows skipping test if optional services or capabilities are
+ missing
+- compliance forces the full API descriptions as currently proposed by
+ CNTT and then skips all optional capability testing
+- the opensource certifications are driven by simple interoperability testing
+ (RefStack and OVP are about less than 10% of Functest. **trustability?**)
+
+**Fine tune the same test frameworks**
+
+
+### [CNTT RC1](https://build.opnfv.org/ci/view/functest/job/functest-leguer-daily/12/)
+
+![RC1](rc1.png)
+
+
+
+## Conclusion
+
+
+### Key takeaways
+
+- **test integration requirements** are crucial to smoothly assemble all
+ test cases
+- leverage **existing** OPNFV testing knowledge (projects) and experience
+ (history) by utilising the OPNFV toolchain design already in-place
+- **3000+** functional tests, **3 hours** upstream API and dataplane benchmarks
+ and VNFs automatically onboarded and tested **can be reused asis**
+
+**Keep it simple and do not reivent the wheel**
diff --git a/docs/com/pres/oran/rc1.png b/docs/com/pres/oran/rc1.png
new file mode 100644
index 000000000..9179f3bb6
--- /dev/null
+++ b/docs/com/pres/oran/rc1.png
Binary files differ
diff --git a/docs/com/pres/reveal.js b/docs/com/pres/reveal.js
-Subproject a349ff43c58c23f9c837b8ea9b5fc7d4761b8de
+Subproject 2c5396b7d347f8ee1344016f15b93d4f7840156
diff --git a/docs/com/pres/rfp/index.html b/docs/com/pres/rfp/index.html
new file mode 100644
index 000000000..538c0c8c8
--- /dev/null
+++ b/docs/com/pres/rfp/index.html
@@ -0,0 +1,52 @@
+<html>
+<head>
+<title>OPNFV and CNTT in Orange RFP</title>
+<meta name="author" content="Cédric Ollivier">
+<meta name="viewport"
+ content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
+<link rel="stylesheet" href="../reveal.js/css/reveal.css">
+<link rel="stylesheet" href="../reveal.js/css/theme/white.css">
+<link rel="stylesheet" href="../reveal.js/lib/css/zenburn.css">
+<script>
+var link = document.createElement( 'link' );
+link.rel = 'stylesheet';
+link.type = 'text/css';
+link.href = window.location.search.match( /print-pdf/gi ) ? '../reveal.js/css/print/pdf.css' : '../reveal.js/css/print/paper.css';
+document.getElementsByTagName( 'head' )[0].appendChild( link );
+</script>
+</head>
+<body>
+ <div class="reveal">
+ <div class="slides">
+ <section data-markdown="rfp.md" data-separator="^\n\n\n"
+ data-separator-vertical="^\n\n" data-separator-notes="^Note:"></section>
+ </div>
+ </div>
+ <script src="../reveal.js/lib/js/head.min.js"></script>
+ <script src="../reveal.js/js/reveal.js"></script>
+ <script>
+ Reveal.initialize({
+ dependencies : [ {
+ src : '../reveal.js/plugin/markdown/marked.js',
+ condition : function() {
+ return !!document.querySelector('[data-markdown]');
+ }
+ }, {
+ src : '../reveal.js/plugin/markdown/markdown.js',
+ condition : function() {
+ return !!document.querySelector('[data-markdown]');
+ }
+ }, {
+ src: '../reveal.js/plugin/highlight/highlight.js',
+ async: true,
+ callback: function() {
+ hljs.initHighlightingOnLoad();
+ }
+ }, {
+ src: '../reveal.js/plugin/notes/notes.js',
+ async: true
+ } ]
+ });
+ </script>
+</body>
+</html>
diff --git a/docs/com/pres/rfp/rfp.md b/docs/com/pres/rfp/rfp.md
new file mode 100644
index 000000000..66f7ba9e7
--- /dev/null
+++ b/docs/com/pres/rfp/rfp.md
@@ -0,0 +1,97 @@
+# OPNFV and CNTT in Orange RFP
+
+[Cédric Ollivier](mailto:cedric.ollivier@orange.com)
+
+2020/09/19
+
+
+
+## Vision and contributions
+
+
+### Our guidelines
+
+- **automate** to bring determinism and to meet the new
+ software release rate
+- test all software layers **independently** (OpenStack, Kubernetes and VNFs)
+- run all deployment and verification jobs in **our** continous integration
+ chains
+- leverage best **opensource** tools and practices
+
+**Integrate smoothly and deploy everywhere fastly**
+
+
+### How OpenSource helps?
+
+- **Functest** offers a collection of state-of-the-art virtual infrastructure
+ test suites
+- **Xtesting** helps assembling sparse test cases and accelerating the adoption
+ of CI/CD best practices
+- **XtestingCI** eases deploying anywhere plug-and-play CI/CD toolchains in a
+ few commands
+- **CNTT** defines conformance suites and its playbooks leveraging this 3
+ softwares
+
+**Any contribution is more than welcome!
+[[1]](https://www.linkedin.com/pulse/call-functest-cntt-rc1-contributions-c%25C3%25A9dric-ollivier/)
+[[2]](https://www.linkedin.com/pulse/call-functest-cntt-rc2-contributions-c%25C3%25A9dric-ollivier/)**
+
+
+
+## CNTT/OPNFV in Orange
+
+
+### A couple of RFP requirements
+
+- the **full** CNTT reference conformance for OpenStack results and outputs
+ (Orange CNTT Field Trial is in a very good shape
+ [[1]](http://testresults.opnfv.org/functest/field_trial/)
+ [[2]](https://www.linkedin.com/pulse/cntt-field-trials-c%C3%A9dric-ollivier/))
+- the **success** of the Functest Kubernetes test suites (now released as
+ part of CNTT RC2 Baraque)
+- **first** VNF test cases running in **our** continuous integration chain
+ thanks to Xtesting and XtestingCI
+
+**It's implementing Orange and CNTT targets**
+
+
+### Orange CNTT RC1 Field Trial
+
+- helped detecting a couple of issues in CNTT RC1
+- integrated cinder backup and nova instance_password in Orange IaaS
+- to fix 10 remaining single test failures (out 2000+ functional tests, 3 hours
+ benchmarking and 3 VNFs automatically onboarded and tested)
+- to enhance Functest juju_epc to pass proxies
+
+**99,999%**
+
+
+### Wish list
+
+- to integrate **more benchmarks** in CNTT conformance (e.g. disk benchmarking)
+- to switch from the current Kubernetes interoperability testing to a **true**
+ CNTT conformance suite
+- to build the first **VNF and CNF** conformance suites (**high priority**)
+
+**We need your contribution helps!
+[[1]](https://www.linkedin.com/pulse/call-functest-cntt-rc1-contributions-c%25C3%25A9dric-ollivier/)
+[[2]](https://www.linkedin.com/pulse/call-functest-cntt-rc2-contributions-c%25C3%25A9dric-ollivier/)**
+
+
+
+## Conclusion
+
+
+### Take aways
+
+- Orange leverages OPNFV and CNTT in RFP
+- we keep contributing in both specification and implementation streams for
+ the success of Network Function Virtualization
+- we expect more OPNFV and CNTT contributions especially for VNF and CNF
+ conformance suites, our initial CNTT target
+
+**Try CNTT reference suites, you will love them!**
+
+
+
+## Thank you!
diff --git a/docs/com/pres/stockholm/chainedci.png b/docs/com/pres/stockholm/chainedci.png
new file mode 100644
index 000000000..df594cd3a
--- /dev/null
+++ b/docs/com/pres/stockholm/chainedci.png
Binary files differ
diff --git a/docs/com/pres/stockholm/ftth.png b/docs/com/pres/stockholm/ftth.png
new file mode 100644
index 000000000..5b441d1de
--- /dev/null
+++ b/docs/com/pres/stockholm/ftth.png
Binary files differ
diff --git a/docs/com/pres/stockholm/index.html b/docs/com/pres/stockholm/index.html
new file mode 100644
index 000000000..65fa37a3a
--- /dev/null
+++ b/docs/com/pres/stockholm/index.html
@@ -0,0 +1,52 @@
+<html>
+<head>
+<title>From Paris to Stockholm</title>
+<meta name="author" content="Cédric Ollivier">
+<meta name="viewport"
+ content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
+<link rel="stylesheet" href="../reveal.js/css/reveal.css">
+<link rel="stylesheet" href="../reveal.js/css/theme/white.css">
+<link rel="stylesheet" href="../reveal.js/lib/css/zenburn.css">
+<script>
+var link = document.createElement( 'link' );
+link.rel = 'stylesheet';
+link.type = 'text/css';
+link.href = window.location.search.match( /print-pdf/gi ) ? '../reveal.js/css/print/pdf.css' : '../reveal.js/css/print/paper.css';
+document.getElementsByTagName( 'head' )[0].appendChild( link );
+</script>
+</head>
+<body>
+ <div class="reveal">
+ <div class="slides">
+ <section data-markdown="stockholm.md" data-separator="^\n\n\n"
+ data-separator-vertical="^\n\n" data-separator-notes="^Note:"></section>
+ </div>
+ </div>
+ <script src="../reveal.js/lib/js/head.min.js"></script>
+ <script src="../reveal.js/js/reveal.js"></script>
+ <script>
+ Reveal.initialize({
+ dependencies : [ {
+ src : '../reveal.js/plugin/markdown/marked.js',
+ condition : function() {
+ return !!document.querySelector('[data-markdown]');
+ }
+ }, {
+ src : '../reveal.js/plugin/markdown/markdown.js',
+ condition : function() {
+ return !!document.querySelector('[data-markdown]');
+ }
+ }, {
+ src: '../reveal.js/plugin/highlight/highlight.js',
+ async: true,
+ callback: function() {
+ hljs.initHighlightingOnLoad();
+ }
+ }, {
+ src: '../reveal.js/plugin/notes/notes.js',
+ async: true
+ } ]
+ });
+ </script>
+</body>
+</html>
diff --git a/docs/com/pres/stockholm/stockholm.md b/docs/com/pres/stockholm/stockholm.md
new file mode 100644
index 000000000..2fe99cd6e
--- /dev/null
+++ b/docs/com/pres/stockholm/stockholm.md
@@ -0,0 +1,164 @@
+# From Paris to Stockholm
+
+[Cédric Ollivier](mailto:cedric.ollivier@orange.com)
+
+2019/06/09
+
+
+
+## Agenda
+
+
+### Agenda
+
+- Functest and Xtesting in a nutshell
+- what's new from Paris (Iruya and J-release)?
+ - code improvement
+ - functional gates
+ - switch to python3
+ - Raspberry PI
+- what's next? GSMA, CNF, ETSI...
+
+
+
+## Infrastructure verification
+
+
+### Functest in a nutshell
+
+- verify any kind of OpenStack and Kubernetes deployments (OPNFV model)
+ including production environments
+- conform with upstream rules (OpenStack gate jobs and Kubernetes conformance
+ tests)
+- ensure that the platforms meet Network Functions Virtualization requirements
+
+
+### Functest suites
+
+- all functional tests (2000+) as defined by the upstream communities
+ (e.g. Tempest, neutron-tempest-api, Barbican, Patrole...)
+- upstream API and dataplane benchmarking tools (Rally, VMTP and Shaker)
+- Virtual Network Function deployments and testing (vIMS, vRouter and vEPC)
+
+
+
+### Network automation journey
+
+
+### Xtesting in a nutshell
+
+- allow the developer to work only on the test suites without diving into
+ CI/CD integration
+- simplify test integration in a complete LFN-based CI/CD toolchain (e.g.
+ Jenkins, Testing Containers, Test API and dashboard)
+- allow a proper design and verify multiple components in the same CI/CD
+ toolchain (OpenStack, Kubernetes, ONAP, etc.)
+
+**Easy to use and very useful for any CI/CD toolchain**
+
+
+### Chained CI
+
+![OPNFV](chainedci.png)
+<!-- .element: style="border: 0" -->
+
+
+### Testing [FTTH](https://en.wikipedia.org/wiki/Fiber_to_the_x) equipment
+
+![OPNFV](ftth.png)
+<!-- .element: style="border: 0; width: 90%" -->
+
+
+### Demo
+
+- describe the testcase execution
+- build and publish your container
+- list your test in the toolchain description
+- deploy your own toolchain in a few commands
+
+https://wiki.opnfv.org/pages/viewpage.action?pageId=32015004
+
+
+
+## What's new from Paris (Iruya and J-release)
+
+
+### Code improvement
+
+- all patches are now verified by [bandit](https://github.com/PyCQA/bandit) (in
+ addition to yamllint, pep8, pylint, ansible-lint and bashate. Please see
+ [tox.ini](https://git.opnfv.org/functest/tree/tox.ini) for details).
+- 10/10 by pylint is now enforced for all
+ Functest packages
+
+**we still need python3.6 in build servers to run our unit tests vs python3**
+
+
+### Functional Gates
+
+- live-migration, VMTP and Shaker are now verified in all gates (pre and post
+ merge)
+- Functest is continuously executed up to 4 tests in parallel verifying our
+ reference OpenStack/Kubernetes
+- we continuously check the remaining resources after multiple runs (they only
+ remain a few region and volume leaks which are being fixed)
+
+
+### Switch to python3
+
+- all latest Functest containers switched to python3 as default (Functest has
+ supported both python2 and python3 via six for a while)
+- all missing decode/encode calls are backported to Hunter and Iruya
+- VMTP has been updated to keep the same testcase list
+- our patch about Cloudify REST client will be published upstream if the
+ project is still active
+
+
+### Raspberry PI
+
+- travis-ci.org allows us to continuously cross-compile containers (Hunter,
+ Iruya and latest) for arm (Raspberry PI) and arm64
+- no additional configuration is required (Docker manifest allows an unify way
+ to run the containers whatever the architectures)
+- only testcases leveraging on go have not yet been ported (juju_epc and
+ Kubernetes conformance tests)
+
+**Try it, and you will love it!**
+
+
+### New testcases
+
+- refstack_platform and refstack_object (already part of tempest_full) are now
+ dedicated testcases in Functest
+- tempest_slow is on our agenda to keep conforming with OpenStack gates
+
+
+### New opportunities
+
+- a few indentified opportunities about
+[CNF](https://www.cncf.io/announcement/2019/02/25/cncf-launches-cloud-native-network-functions-cnf-testbed/):
+[Clearwater Ims via Kubernetes](https://github.com/Metaswitch/clearwater-docker/)
+and [xrally-kubernetes](https://github.com/xrally/xrally-kubernetes)
+- GSMA should come with new testcases needs (Functest can already be executed
+ vs the current profiles)
+- ETSI could leverage on Xtesting to package its testcases
+
+
+
+## Conclusion
+
+
+### Takeaways
+
+- Xtesting is a key helper from first tests to full end2end service testing
+- Functest allows verifying production Infrastructure and is breaking the
+ classical preproduction/production model
+- And we are still pushing the limits:
+ - python packages
+ - GNU/Linux packages
+
+**Upstream first! Try them, and you will love them! **
+
+
+
+## Thank you
diff --git a/docs/com/pres/vevent202004/index.html b/docs/com/pres/vevent202004/index.html
new file mode 100644
index 000000000..7c1118242
--- /dev/null
+++ b/docs/com/pres/vevent202004/index.html
@@ -0,0 +1,52 @@
+<html>
+<head>
+<title>2020 April Virtual Technical Event</title>
+<meta name="author" content="Cédric Ollivier">
+<meta name="viewport"
+ content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
+<link rel="stylesheet" href="../reveal.js/css/reveal.css">
+<link rel="stylesheet" href="../reveal.js/css/theme/white.css">
+<link rel="stylesheet" href="../reveal.js/lib/css/zenburn.css">
+<script>
+var link = document.createElement( 'link' );
+link.rel = 'stylesheet';
+link.type = 'text/css';
+link.href = window.location.search.match( /print-pdf/gi ) ? '../reveal.js/css/print/pdf.css' : '../reveal.js/css/print/paper.css';
+document.getElementsByTagName( 'head' )[0].appendChild( link );
+</script>
+</head>
+<body>
+ <div class="reveal">
+ <div class="slides">
+ <section data-markdown="vevent202004.md" data-separator="^\n\n\n"
+ data-separator-vertical="^\n\n" data-separator-notes="^Note:"></section>
+ </div>
+ </div>
+ <script src="../reveal.js/lib/js/head.min.js"></script>
+ <script src="../reveal.js/js/reveal.js"></script>
+ <script>
+ Reveal.initialize({
+ dependencies : [ {
+ src : '../reveal.js/plugin/markdown/marked.js',
+ condition : function() {
+ return !!document.querySelector('[data-markdown]');
+ }
+ }, {
+ src : '../reveal.js/plugin/markdown/markdown.js',
+ condition : function() {
+ return !!document.querySelector('[data-markdown]');
+ }
+ }, {
+ src: '../reveal.js/plugin/highlight/highlight.js',
+ async: true,
+ callback: function() {
+ hljs.initHighlightingOnLoad();
+ }
+ }, {
+ src: '../reveal.js/plugin/notes/notes.js',
+ async: true
+ } ]
+ });
+ </script>
+</body>
+</html>
diff --git a/docs/com/pres/vevent202004/vevent202004.md b/docs/com/pres/vevent202004/vevent202004.md
new file mode 100644
index 000000000..a7f8b5dc4
--- /dev/null
+++ b/docs/com/pres/vevent202004/vevent202004.md
@@ -0,0 +1,99 @@
+# CNTT RC April 2020 and beyond
+
+[Cédric Ollivier](mailto:cedric.ollivier@orange.com)
+
+2020/04/21
+
+
+
+## CNTT RC status
+
+
+### Functest SUTs
+
+- ease verifying automatically the CNTT-related containers (5 SUTs in total)
+- mostly conformed with OpenStack reference implementations except:
+ - all use Ceph and Ceph RadosGW
+ - one SUT leverages on OVN to check RA1 Chapter5 vs SDN Controllers
+- OpenStack and Kubernetes are not redeployed between 2 runs as opposed to
+ [CNTT RI](https://build.opnfv.org/ci/view/cntt/job/cntt-latest-daily/102/)
+
+**Functest SUTs are compliant to CNTT RC**
+
+
+### RC verification vs Neutron
+
+- all branches are successful vs Neutron reference implementation:
+ - [Functest Hunter (Rocky)](https://build.opnfv.org/ci/view/functest/job/functest-hunter-daily/485/)
+ - [Functest Iruya (Stein)](https://build.opnfv.org/ci/view/functest/job/functest-iruya-daily/452/)
+ - [Functest Jerma (Train)](https://build.opnfv.org/ci/view/functest/job/functest-jerma-daily/249/)
+ - [Functest Master (next Ussuri)](https://build.opnfv.org/ci/view/functest/job/functest-latest-daily/597/)
+
+
+### RC verification vs OVN
+
+- the overall results are in a good shape as Functest master includes all latest software:
+ - [CNTT Conformance passed sucessfully](https://build.opnfv.org/ci/view/functest/job/functest-ovn-latest-daily/17/)
+ - [IaaS verification](https://build.opnfv.org/ci/view/functest/job/functest-ovn-latest-daily/17/)
+ failed due to one Rally task hanging iteration (under analysis)
+
+**RA1 Chapter 5 is compatible with external SDN controllers**
+
+
+
+## Field trial results
+
+
+### Orange IaaS
+
+- Orange IaaS verification has leveraged on the Functest containers before CNTT
+- Functest containers are also executed to verify the deployment before any VNF
+ onboarding
+- a few mandatory features are missing to fully pass CNTT Compliance
+ ([cinder backup](https://cntt-n.github.io/CNTT/doc/ref_arch/openstack/chapters/chapter05.html)
+ and [keystone security_compliance](https://cntt-n.github.io/CNTT/doc/ref_arch/openstack/chapters/chapter05.html))
+- a few extra RadosGW configurations are needed
+
+**the CNTT Conformance is in a good shape**
+
+
+
+## What's next?
+
+
+### last minute's changes:
+
+- tempest_heat was recently added in Functest IaaS verification and will be
+ tuned for CNTT compliance
+- tempest_horizon should be added into CNTT RC document (mandatory features)
+
+**they would be added into CNTT RC very soon**
+
+
+### and beyond
+
+- NFVBench and VSperf are being xtesting-ready and should be added in RC
+- a few CNTT issues are opened for developping Functest and then RC:
+ - [Run fio or dd in Functest](https://github.com/cntt-n/CNTT/issues/1477)
+ - [Add ceph bench and rbd bench into Functest](https://github.com/cntt-n/CNTT/issues/1476)
+ - [Add swift-bench in Functest](https://github.com/cntt-n/CNTT/issues/1474)
+
+**[help is needed!](https://github.com/cntt-n/CNTT/issues?q=is%3Aopen+is%3Aissue+project%3Acntt-n%2FCNTT%2F4)**
+
+
+
+## Conclusion
+
+
+### Take aways
+
+- CNTT RC1 1.0 seems good and stable
+- [RA1 Chapter 5]((https://cntt-n.github.io/CNTT/doc/ref_arch/openstack/chapters/chapter05.html)
+ is compatible with external SDN controllers
+- Orange IaaS is closed to be compliant
+
+**any contribution and RC results are more than welcome!**
+
+
+
+## Thank you
diff --git a/docs/com/pres/vevent202010/index.html b/docs/com/pres/vevent202010/index.html
new file mode 100644
index 000000000..a24c721d2
--- /dev/null
+++ b/docs/com/pres/vevent202010/index.html
@@ -0,0 +1,52 @@
+<html>
+<head>
+<title>Orange CNTT RC1 Field Trial feedbacks</title>
+<meta name="author" content="Cédric Ollivier">
+<meta name="viewport"
+ content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
+<link rel="stylesheet" href="../reveal.js/css/reveal.css">
+<link rel="stylesheet" href="../reveal.js/css/theme/white.css">
+<link rel="stylesheet" href="../reveal.js/lib/css/zenburn.css">
+<script>
+var link = document.createElement( 'link' );
+link.rel = 'stylesheet';
+link.type = 'text/css';
+link.href = window.location.search.match( /print-pdf/gi ) ? '../reveal.js/css/print/pdf.css' : '../reveal.js/css/print/paper.css';
+document.getElementsByTagName( 'head' )[0].appendChild( link );
+</script>
+</head>
+<body>
+ <div class="reveal">
+ <div class="slides">
+ <section data-markdown="vevent202010.md" data-separator="^\n\n\n"
+ data-separator-vertical="^\n\n" data-separator-notes="^Note:"></section>
+ </div>
+ </div>
+ <script src="../reveal.js/lib/js/head.min.js"></script>
+ <script src="../reveal.js/js/reveal.js"></script>
+ <script>
+ Reveal.initialize({
+ dependencies : [ {
+ src : '../reveal.js/plugin/markdown/marked.js',
+ condition : function() {
+ return !!document.querySelector('[data-markdown]');
+ }
+ }, {
+ src : '../reveal.js/plugin/markdown/markdown.js',
+ condition : function() {
+ return !!document.querySelector('[data-markdown]');
+ }
+ }, {
+ src: '../reveal.js/plugin/highlight/highlight.js',
+ async: true,
+ callback: function() {
+ hljs.initHighlightingOnLoad();
+ }
+ }, {
+ src: '../reveal.js/plugin/notes/notes.js',
+ async: true
+ } ]
+ });
+ </script>
+</body>
+</html>
diff --git a/docs/com/pres/vevent202010/vevent202010.md b/docs/com/pres/vevent202010/vevent202010.md
new file mode 100644
index 000000000..b128210ac
--- /dev/null
+++ b/docs/com/pres/vevent202010/vevent202010.md
@@ -0,0 +1,62 @@
+# Orange CNTT RC1 Field Trial
+
+[Cédric Ollivier](mailto:cedric.ollivier@orange.com)
+
+2020/10/14
+
+
+
+## CNTT RC1 Field Trial
+
+
+### Orange CNTT RC1 Field Trial
+
+- helped detecting a couple of issues in CNTT RC1
+- integrated cinder backup and nova instance_password in Orange IaaS
+- to fix 10 remaining single test failures (out 2000+ functional tests, 3 hours
+ benchmarking and 3 VNFs automatically onboarded and tested)
+- to enhance Functest juju_epc to pass proxies
+
+**99,999%**
+
+
+### Orange CNTT RC1 feedbacks
+
+- we easily executed the CNTT RC1 playbook asis and no clear bug was found in
+ CNTT RC1 Baldy
+- CNTT RC1 is now used in our Orange IaaS verification in addition to the
+ classical Functest containers
+- CNTT RC1 is also executed to verify all deployments before onboarding any VNF
+- CNTT RC1 Baldy and CNTT RC2 Baraque are listed in **Orange RFP requirements**
+ (see last ONES
+ [[1]](http://testresults.opnfv.org/functest/ONES2020NA_OPNFV-CNTT_RFP.1080p.mp4))
+
+
+
+## What else?
+
+
+### Wish list
+
+- to integrate **more benchmarks** in CNTT conformance (e.g. disk benchmarking)
+- to switch from the current Kubernetes interoperability testing to a **true**
+ CNTT conformance suite
+- to build the first **VNF and CNF** conformance suites (**high priority**)
+
+**We need your contribution helps!
+[[2]](https://www.linkedin.com/pulse/call-functest-cntt-rc1-contributions-c%25C3%25A9dric-ollivier/)
+[[3]](https://www.linkedin.com/pulse/call-functest-cntt-rc2-contributions-c%25C3%25A9dric-ollivier/)**
+
+
+### New Functest opportunities
+
+- to implement live monitoring of your OpenStack and Kubernetes deployments via
+ a subset of Functest (healthcheck? new Rally tasks?)
+- to implement new functest testcases to validate and verify OpenStack upgrades
+ (new Rally tasks)?
+
+**Try Functest Leguer, you will love it [[4]](https://www.linkedin.com/pulse/opnfv-functest-leguer-out-c%25C3%25A9dric-ollivier/)**
+
+
+
+## Thank you!
diff --git a/docs/testing/developer/internship/testapi_evolution/conf.py b/docs/conf.py
index f59308c59..7a8d1858d 100644
--- a/docs/testing/developer/internship/testapi_evolution/conf.py
+++ b/docs/conf.py
@@ -1,7 +1,7 @@
# -*- coding: utf-8 -*-
#
-# TestAPI evolution documentation build configuration file, created by
-# sphinx-quickstart on Wed Apr 4 06:00:42 2018.
+# Functest documentation build configuration file, created
+# by sphinx-quickstart on Tue Apr 3 03:51:57 2018.
#
# This file is execfile()d with the current directory set to its
# containing dir.
@@ -19,8 +19,6 @@
# import os
# import sys
# sys.path.insert(0, os.path.abspath('.'))
-import sphinx_opnfv_theme
-
# -- General configuration ------------------------------------------------
@@ -46,7 +44,7 @@ source_suffix = '.rst'
master_doc = 'index'
# General information about the project.
-project = u'TestAPI evolution'
+project = u'Functest'
copyright = u'2018, Functest <opnfv-tech-discuss@lists.opnfv.org>'
author = u'Functest <opnfv-tech-discuss@lists.opnfv.org>'
@@ -83,29 +81,22 @@ todo_include_todos = False
# The theme to use for HTML and HTML Help pages. See the documentation for
# a list of builtin themes.
#
-html_theme = 'opnfv'
+html_theme = 'sphinx_rtd_theme'
# Theme options are theme-specific and customize the look and feel of a theme
# further. For a list of options available for each theme, see the
# documentation.
#
# html_theme_options = {}
-html_theme_options = {
- 'bootswatch_theme': 'journal',
- 'navbar_sidebarrel': False,
- 'navbar_title': '',
-}
# Add any paths that contain custom themes here, relative to this directory.
# html_theme_path = []
-html_theme_path = sphinx_opnfv_theme.get_html_theme_path()
# Add any paths that contain custom static files (such as style sheets) here,
# relative to this directory. They are copied after the builtin static files,
# so a file named "default.css" will overwrite the builtin "default.css".
# html_static_path = []
-
# Custom sidebar templates, must be a dictionary that maps document names
# to template names.
#
@@ -122,7 +113,7 @@ html_sidebars = {
# -- Options for HTMLHelp output ------------------------------------------
# Output file base name for HTML help builder.
-htmlhelp_basename = 'TestAPIevolutiondoc'
+htmlhelp_basename = 'Functestdoc'
# -- Options for LaTeX output ---------------------------------------------
@@ -150,8 +141,8 @@ latex_elements = {
# author, documentclass [howto, manual, or own class]).
latex_documents = [
(master_doc,
- 'TestAPIevolution.tex',
- u'TestAPI evolution Documentation',
+ 'Functest.tex',
+ u'Functest Documentation',
u'Functest \\textless{}opnfv-tech-discuss@lists.opnfv.org\\textgreater{}',
'manual'),
]
@@ -163,8 +154,8 @@ latex_documents = [
# (source start file, name, description, authors, manual section).
man_pages = [
(master_doc,
- 'testapievolution',
- u'TestAPI evolution Documentation',
+ 'functest',
+ u'Functest Documentation',
[author],
1)
]
@@ -177,10 +168,12 @@ man_pages = [
# dir menu entry, description, category)
texinfo_documents = [
(master_doc,
- 'TestAPIevolution',
- u'TestAPI evolution Documentation',
+ 'Functest',
+ u'Functest Documentation',
author,
- 'TestAPIevolution',
+ 'Functest',
'One line description of project.',
'Miscellaneous'),
]
+
+spelling_word_list_filename = 'spelling_wordlist.txt'
diff --git a/docs/images/clearwater-architecture-v2.png b/docs/images/clearwater-architecture-v2.png
new file mode 100644
index 000000000..e4d209a13
--- /dev/null
+++ b/docs/images/clearwater-architecture-v2.png
Binary files differ
diff --git a/docs/images/concepts_mapping_fraser.png b/docs/images/concepts_mapping_fraser.png
new file mode 100644
index 000000000..a566e39db
--- /dev/null
+++ b/docs/images/concepts_mapping_fraser.png
Binary files differ
diff --git a/docs/index.rst b/docs/index.rst
new file mode 100644
index 000000000..4d0fcd8ba
--- /dev/null
+++ b/docs/index.rst
@@ -0,0 +1,15 @@
+.. SPDX-License-Identifier: CC-BY-4.0
+
+.. _functest:
+
+**************
+OPNFV Functest
+**************
+
+.. toctree::
+ :maxdepth: 1
+
+ testing/user/configguide/index
+ testing/user/userguide/index
+ testing/developer/devguide/index
+ release/release-notes/index
diff --git a/docs/release/release-notes/apex.rst b/docs/release/release-notes/apex.rst
deleted file mode 100644
index 959b10722..000000000
--- a/docs/release/release-notes/apex.rst
+++ /dev/null
@@ -1,47 +0,0 @@
-apex
-====
-
-os-nosdn-nofeature-ha
----------------------
-
-==================== =================== ========== ======== =========
-testcase date pod_name result jira
-==================== =================== ========== ======== =========
-connection_check 2018-04-07 04:52:18 lf-pod1 PASS
-api_check 2018-04-07 05:05:30 lf-pod1 PASS
-snaps_health_check 2018-04-07 05:06:12 lf-pod1 PASS
-vping_ssh 2018-04-07 05:07:49 lf-pod1 PASS
-vping_userdata 2018-04-07 05:08:55 lf-pod1 PASS
-tempest_smoke_serial 2018-04-07 05:24:59 lf-pod1 PASS
-rally_sanity 2018-04-07 05:46:43 lf-pod1 FAIL APEX-564
-refstack_defcore 2018-04-07 05:49:54 lf-pod1 PASS
-patrole 2018-04-07 05:53:10 lf-pod1 PASS
-snaps_smoke 2018-04-07 06:50:35 lf-pod1 FAIL SNAPS-283
-neutron_trunk 2018-04-07 06:53:13 lf-pod1 PASS
-cloudify_ims 2018-04-07 07:19:50 lf-pod1 PASS
-vyos_vrouter 2018-04-07 07:40:53 lf-pod1 PASS
-juju_epc 2018-04-07 08:06:00 lf-pod1 FAIL APEX-570
-==================== =================== ========== ======== =========
-
-os-odl-nofeature-ha
--------------------
-
-==================== =================== ========== ======== =========
-testcase date pod_name result jira
-==================== =================== ========== ======== =========
-connection_check 2018-04-07 13:18:17 lf-pod1 PASS
-api_check 2018-04-07 13:30:11 lf-pod1 PASS
-snaps_health_check 2018-04-07 13:31:46 lf-pod1 PASS
-vping_ssh 2018-04-07 13:32:46 lf-pod1 PASS
-vping_userdata 2018-04-07 13:33:40 lf-pod1 PASS
-tempest_smoke_serial 2018-04-07 13:53:58 lf-pod1 FAIL
-rally_sanity 2018-04-07 14:12:42 lf-pod1 FAIL
-refstack_defcore 2018-04-07 14:21:20 lf-pod1 FAIL
-patrole 2018-04-07 14:24:48 lf-pod1 FAIL
-snaps_smoke 2018-04-07 15:05:15 lf-pod1 FAIL SNAPS-283
-odl 2018-04-07 14:25:10 lf-pod1 PASS
-neutron_trunk 2018-04-07 15:07:53 lf-pod1 FAIL
-cloudify_ims lf-pod1
-vyos_vrouter lf-pod1
-juju_epc lf-pod1
-==================== =================== ========== ======== =========
diff --git a/docs/release/release-notes/compass.rst b/docs/release/release-notes/compass.rst
deleted file mode 100644
index 57b6ac68e..000000000
--- a/docs/release/release-notes/compass.rst
+++ /dev/null
@@ -1,57 +0,0 @@
-compass
-=======
-
-os-nosdn-nofeature-ha
----------------------
-
-==================== =================== =========== ======== ===========
-testcase date pod_name result jira
-==================== =================== =========== ======== ===========
-connection_check 2018-04-20 08:11:02 huawei-pod1 PASS
-api_check 2018-04-18 05:41:29 huawei-pod1 PASS
-snaps_health_check 2018-04-18 05:43:03 huawei-pod1 PASS
-vping_ssh 2018-04-18 05:45:33 huawei-pod1 PASS
-vping_userdata 2018-04-18 05:47:28 huawei-pod1 PASS
-tempest_smoke_serial 2018-04-18 06:03:52 huawei-pod1 FAIL COMPASS-588
-rally_sanity 2018-04-18 06:33:29 huawei-pod1 PASS
-refstack_defcore 2018-04-13 22:02:34 huawei-pod1 FAIL
-patrole 2018-04-18 06:36:42 huawei-pod1 PASS
-snaps_smoke 2018-04-18 07:30:19 huawei-pod1 FAIL SNAPS-283
-neutron_trunk 2018-04-18 07:33:57 huawei-pod1 FAIL
-cloudify_ims 2018-04-18 08:19:27 huawei-pod1 PASS
-vyos_vrouter 2018-04-18 08:45:36 huawei-pod1 PASS
-juju_epc 2018-04-18 11:15:12 huawei-pod1 FAIL
-==================== =================== =========== ======== ===========
-
-os-odl_l3-nofeature-ha
-----------------------
-
-==================== =================== =========== ======== =========
-testcase date pod_name result jira
-==================== =================== =========== ======== =========
-connection_check 2018-04-17 03:03:00 huawei-pod1 PASS
-api_check 2018-04-17 03:13:00 huawei-pod1 PASS
-snaps_health_check 2018-04-17 03:13:37 huawei-pod1 PASS
-vping_ssh 2018-04-17 03:14:32 huawei-pod1 PASS
-vping_userdata 2018-04-17 03:15:24 huawei-pod1 PASS
-tempest_smoke_serial 2018-04-17 03:31:19 huawei-pod1 FAIL
-rally_sanity 2018-04-17 04:00:16 huawei-pod1 PASS
-refstack_defcore 2018-04-12 20:39:54 huawei-pod1 PASS
-patrole 2018-04-17 04:02:52 huawei-pod1 PASS
-snaps_smoke 2018-04-17 04:52:31 huawei-pod1 FAIL SNAPS-283
-odl 2018-04-17 04:03:13 huawei-pod1 PASS
-neutron_trunk 2018-04-17 04:55:37 huawei-pod1 FAIL
-cloudify_ims 2018-04-17 05:25:17 huawei-pod1 PASS
-vyos_vrouter 2018-04-17 05:51:12 huawei-pod1 PASS
-juju_epc 2018-04-17 06:53:35 huawei-pod1 PASS
-==================== =================== =========== ======== =========
-
-k8-nosdn-nofeature-ha
----------------------
-
-=============== =================== =========== ======== ======
-testcase date pod_name result jira
-=============== =================== =========== ======== ======
-k8s_smoke 2018-04-17 19:28:56 huawei-pod1 FAIL
-k8s_conformance 2018-04-17 19:44:09 huawei-pod1 FAIL
-=============== =================== =========== ======== ======
diff --git a/docs/release/release-notes/conf.py b/docs/release/release-notes/conf.py
deleted file mode 100644
index b9a996a7e..000000000
--- a/docs/release/release-notes/conf.py
+++ /dev/null
@@ -1,184 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Functest Release Notes documentation build configuration file, created by
-# sphinx-quickstart on Tue Apr 3 03:40:39 2018.
-#
-# This file is execfile()d with the current directory set to its
-# containing dir.
-#
-# Note that not all possible configuration values are present in this
-# autogenerated file.
-#
-# All configuration values have a default; values that are commented out
-# serve to show the default.
-
-# If extensions (or modules to document with autodoc) are in another directory,
-# add these directories to sys.path here. If the directory is relative to the
-# documentation root, use os.path.abspath to make it absolute, like shown here.
-#
-# import os
-# import sys
-# sys.path.insert(0, os.path.abspath('.'))
-import sphinx_opnfv_theme
-
-
-# -- General configuration ------------------------------------------------
-
-# If your documentation needs a minimal Sphinx version, state it here.
-#
-# needs_sphinx = '1.0'
-
-# Add any Sphinx extension module names here, as strings. They can be
-# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
-# ones.
-extensions = []
-
-# Add any paths that contain templates here, relative to this directory.
-templates_path = ['_templates']
-
-# The suffix(es) of source filenames.
-# You can specify multiple suffix as a list of string:
-#
-# source_suffix = ['.rst', '.md']
-source_suffix = '.rst'
-
-# The master toctree document.
-master_doc = 'index'
-
-# General information about the project.
-project = u'Functest Release Notes'
-copyright = u'2018, Functest <opnfv-tech-discuss@lists.opnfv.org>'
-author = u'Functest <opnfv-tech-discuss@lists.opnfv.org>'
-
-# The version info for the project you're documenting, acts as replacement for
-# |version| and |release|, also used in various other places throughout the
-# built documents.
-#
-# The short X.Y version.
-version = u'master'
-# The full version, including alpha/beta/rc tags.
-release = u'master'
-
-# The language for content autogenerated by Sphinx. Refer to documentation
-# for a list of supported languages.
-#
-# This is also used if you do content translation via gettext catalogs.
-# Usually you set "language" from the command line for these cases.
-language = None
-
-# List of patterns, relative to source directory, that match files and
-# directories to ignore when looking for source files.
-# This patterns also effect to html_static_path and html_extra_path
-exclude_patterns = []
-
-# The name of the Pygments (syntax highlighting) style to use.
-pygments_style = 'sphinx'
-
-# If true, `todo` and `todoList` produce output, else they produce nothing.
-todo_include_todos = False
-
-
-# -- Options for HTML output ----------------------------------------------
-
-# The theme to use for HTML and HTML Help pages. See the documentation for
-# a list of builtin themes.
-#
-html_theme = 'opnfv'
-
-# Theme options are theme-specific and customize the look and feel of a theme
-# further. For a list of options available for each theme, see the
-# documentation.
-#
-# html_theme_options = {}
-html_theme_options = {
- 'bootswatch_theme': 'journal',
- 'navbar_sidebarrel': False,
- 'navbar_title': '',
-}
-
-# Add any paths that contain custom themes here, relative to this directory.
-# html_theme_path = []
-html_theme_path = sphinx_opnfv_theme.get_html_theme_path()
-
-# Add any paths that contain custom static files (such as style sheets) here,
-# relative to this directory. They are copied after the builtin static files,
-# so a file named "default.css" will overwrite the builtin "default.css".
-# html_static_path = []
-
-# Custom sidebar templates, must be a dictionary that maps document names
-# to template names.
-#
-# This is required for the alabaster theme
-# refs: http://alabaster.readthedocs.io/en/latest/installation.html#sidebars
-html_sidebars = {
- '**': [
- 'relations.html', # needs 'show_related': True theme option to display
- 'searchbox.html',
- ]
-}
-
-
-# -- Options for HTMLHelp output ------------------------------------------
-
-# Output file base name for HTML help builder.
-htmlhelp_basename = 'FunctestReleaseNotesdoc'
-
-
-# -- Options for LaTeX output ---------------------------------------------
-
-latex_elements = {
- # The paper size ('letterpaper' or 'a4paper').
- #
- # 'papersize': 'letterpaper',
-
- # The font size ('10pt', '11pt' or '12pt').
- #
- # 'pointsize': '10pt',
-
- # Additional stuff for the LaTeX preamble.
- #
- # 'preamble': '',
-
- # Latex figure (float) alignment
- #
- # 'figure_align': 'htbp',
-}
-
-# Grouping the document tree into LaTeX files. List of tuples
-# (source start file, target name, title,
-# author, documentclass [howto, manual, or own class]).
-latex_documents = [
- (master_doc, 'FunctestReleaseNotes.tex',
- u'Functest Release Notes Documentation',
- u'Functest \\textless{}opnfv-tech-discuss@lists.opnfv.org\\textgreater{}',
- 'manual'),
-]
-
-
-# -- Options for manual page output ---------------------------------------
-
-# One entry per manual page. List of tuples
-# (source start file, name, description, authors, manual section).
-man_pages = [
- (master_doc,
- 'functestreleasenotes',
- u'Functest Release Notes Documentation',
- [author],
- 1)
-]
-
-
-# -- Options for Texinfo output -------------------------------------------
-
-# Grouping the document tree into Texinfo files. List of tuples
-# (source start file, target name, title, author,
-# dir menu entry, description, category)
-texinfo_documents = [
- (master_doc,
- 'FunctestReleaseNotes',
- u'Functest Release Notes Documentation',
- author,
- 'FunctestReleaseNotes',
- 'One line description of project.',
- 'Miscellaneous'),
-]
diff --git a/docs/release/release-notes/daisy.rst b/docs/release/release-notes/daisy.rst
deleted file mode 100644
index bd52f7099..000000000
--- a/docs/release/release-notes/daisy.rst
+++ /dev/null
@@ -1,47 +0,0 @@
-daisy
-=====
-
-os-nosdn-nofeature-ha
----------------------
-
-==================== =================== ========== ======== =========
-testcase date pod_name result jira
-==================== =================== ========== ======== =========
-connection_check 2018-04-12 13:45:13 zte-pod2 PASS
-api_check 2018-04-12 13:55:54 zte-pod2 PASS
-snaps_health_check 2018-04-12 13:56:33 zte-pod2 PASS
-vping_ssh 2018-04-12 13:58:58 zte-pod2 PASS
-vping_userdata 2018-04-12 13:59:54 zte-pod2 PASS
-tempest_smoke_serial 2018-04-12 14:15:24 zte-pod2 PASS
-rally_sanity 2018-04-12 14:43:18 zte-pod2 PASS
-refstack_defcore 2018-04-12 14:49:02 zte-pod2 PASS
-patrole 2018-04-12 14:53:20 zte-pod2 PASS
-snaps_smoke 2018-04-12 15:42:14 zte-pod2 PASS SNAPS-283
-neutron_trunk zte-pod2
-cloudify_ims 2018-04-12 16:14:40 zte-pod2 PASS
-vyos_vrouter 2018-04-12 16:37:09 zte-pod2 PASS
-juju_epc 2018-04-12 17:29:07 zte-pod2 PASS
-==================== =================== ========== ======== =========
-
-os-odl-nofeature-ha
--------------------
-
-==================== =================== ========== ======== =========
-testcase date pod_name result jira
-==================== =================== ========== ======== =========
-connection_check 2018-04-12 20:58:36 zte-pod2 PASS
-api_check 2018-04-12 21:09:58 zte-pod2 PASS
-snaps_health_check 2018-04-12 21:10:36 zte-pod2 PASS
-vping_ssh 2018-04-12 21:12:56 zte-pod2 PASS
-vping_userdata 2018-04-12 21:14:03 zte-pod2 PASS
-tempest_smoke_serial 2018-04-12 21:37:11 zte-pod2 FAIL
-rally_sanity 2018-04-12 22:06:49 zte-pod2 PASS
-refstack_defcore 2018-04-12 22:11:48 zte-pod2 PASS
-patrole 2018-04-12 22:39:08 zte-pod2 FAIL
-snaps_smoke 2018-04-12 00:34:53 zte-pod2 FAIL SNAPS-283
-odl 2018-04-12 22:40:09 zte-pod2 FAIL
-neutron_trunk zte-pod2
-cloudify_ims 2018-04-12 22:48:35 zte-pod2 FAIL
-vyos_vrouter 2018-04-12 22:49:39 zte-pod2 FAIL
-juju_epc 2018-04-12 22:50:43 zte-pod2 FAIL
-==================== =================== ========== ======== =========
diff --git a/docs/release/release-notes/fuel_amd64.rst b/docs/release/release-notes/fuel_amd64.rst
deleted file mode 100644
index 0bc952bc6..000000000
--- a/docs/release/release-notes/fuel_amd64.rst
+++ /dev/null
@@ -1,47 +0,0 @@
-fuel(amd64)
-===========
-
-os-nosdn-nofeature-ha
----------------------
-
-==================== =================== ========== ======== ========
-testcase date pod_name result jira
-==================== =================== ========== ======== ========
-connection_check 2018-04-18 23:17:40 lf-pod2 PASS
-api_check 2018-04-18 23:29:39 lf-pod2 PASS
-snaps_health_check 2018-04-18 23:30:25 lf-pod2 PASS
-vping_ssh 2018-04-18 23:31:30 lf-pod2 PASS
-vping_userdata 2018-04-18 23:32:48 lf-pod2 PASS
-tempest_smoke_serial 2018-04-18 23:52:15 lf-pod2 PASS
-rally_sanity 2018-04-19 00:23:44 lf-pod2 PASS
-refstack_defcore 2018-04-11 23:20:58 lf-pod2 PASS
-patrole 2018-04-19 00:26:51 lf-pod2 PASS
-snaps_smoke 2018-04-19 01:33:11 lf-pod2 FAIL FUEL-356
-neutron_trunk 2018-04-19 01:36:15 lf-pod2 PASS
-cloudify_ims 2018-04-19 01:53:49 lf-pod2 FAIL
-vyos_vrouter 2018-04-19 02:11:34 lf-pod2 FAIL
-juju_epc 2018-04-19 02:20:31 lf-pod2 FAIL
-==================== =================== ========== ======== ========
-
-os-odl-nofeature-ha
--------------------
-
-==================== =================== ========== ======== =========
-testcase date pod_name result jira
-==================== =================== ========== ======== =========
-connection_check 2018-04-13 04:43:03 lf-pod2 PASS
-api_check 2018-04-13 05:01:11 lf-pod2 FAIL
-snaps_health_check 2018-04-06 23:29:48 lf-pod2 PASS
-vping_ssh 2018-04-06 23:31:06 lf-pod2 PASS
-vping_userdata 2018-04-06 23:32:13 lf-pod2 PASS
-tempest_smoke_serial 2018-04-06 23:51:25 lf-pod2 FAIL
-rally_sanity 2018-04-07 00:24:03 lf-pod2 FAIL
-refstack_defcore 2018-04-07 00:30:34 lf-pod2 PASS
-patrole 2018-04-07 00:34:31 lf-pod2 PASS
-snaps_smoke 2018-04-07 01:44:38 lf-pod2 FAIL SNAPS-283
-odl 2018-04-07 00:34:42 lf-pod2 FAIL
-neutron_trunk 2018-04-07 01:47:59 lf-pod2 FAIL
-cloudify_ims lf-pod2
-vyos_vrouter lf-pod2
-juju_epc lf-pod2
-==================== =================== ========== ======== =========
diff --git a/docs/release/release-notes/fuel_arm64.rst b/docs/release/release-notes/fuel_arm64.rst
deleted file mode 100644
index 176b8323f..000000000
--- a/docs/release/release-notes/fuel_arm64.rst
+++ /dev/null
@@ -1,21 +0,0 @@
-fuel(arm64)
-===========
-
-os-nosdn-nofeature-ha
----------------------
-
-==================== =================== ========== ======== =========
-testcase date pod_name result jira
-==================== =================== ========== ======== =========
-connection_check 2018-04-11 12:08:43 arm-pod6 PASS
-api_check 2018-04-11 11:56:14 arm-pod6 PASS
-snaps_health_check 2018-04-11 12:01:02 arm-pod6 FAIL
-vping_ssh 2018-04-05 20:31:11 arm-pod6 PASS
-vping_userdata 2018-04-05 20:35:28 arm-pod6 PASS
-tempest_smoke_serial 2018-04-05 21:47:34 arm-pod6 PASS
-rally_sanity 2018-04-05 23:07:52 arm-pod6 PASS
-refstack_defcore 2018-04-05 23:32:04 arm-pod6 FAIL
-patrole 2018-04-05 23:47:59 arm-pod6 PASS
-snaps_smoke 2018-04-06 02:56:45 arm-pod6 FAIL SNAPS-283
-neutron_trunk 2018-04-06 03:10:36 arm-pod6 PASS
-==================== =================== ========== ======== =========
diff --git a/docs/release/release-notes/functest-gating.rst b/docs/release/release-notes/functest-gating.rst
deleted file mode 100644
index 0aac41b33..000000000
--- a/docs/release/release-notes/functest-gating.rst
+++ /dev/null
@@ -1,27 +0,0 @@
-.. SPDX-License-Identifier: CC-BY-4.0
-
-Release Gating
-==============
-
-Thanks to the analysis of the offical OPNFV results and local tests (see
-`Orange ONAP Openlab`_), Functest is trustable for verifying all OPNFV Fraser
-installers and more generally classical OpenStack Pike and Kubernetes
-deployments.
-
-It should be noted that:
-
- * any failed result highlights side effects for end users
- * OpenStack scenarios which don't pass tempest_smoke_serial break the
- upstream rules (and then decrease the overall quality) as all patches are
- tested vs tempest in OpenStack gating
-
-.. _`Orange ONAP Openlab`: https://wiki.opnfv.org/pages/viewpage.action?pageId=13211751
-
-.. toctree::
-
- apex.rst
- compass.rst
- daisy.rst
- fuel_amd64.rst
- fuel_arm64.rst
- joid.rst
diff --git a/docs/release/release-notes/functest-release.rst b/docs/release/release-notes/functest-release.rst
index 7e0bc7851..b5e228caa 100644
--- a/docs/release/release-notes/functest-release.rst
+++ b/docs/release/release-notes/functest-release.rst
@@ -23,44 +23,62 @@ OpenStack
The internal test cases are:
* connection_check
- * api_check
- * snaps_health_check
+ * tenantnetwork1
+ * tenantnetwork2
+ * vmready1
+ * vmready2
+ * singlevm1
+ * singlevm2
* vping_ssh
* vping_userdata
- * tempest_smoke_serial
- * rally_sanity
- * refstack_defcore
- * patrole
+ * cinder_test
+ * tempest_smoke
+ * tempest_horizon
* odl
- * snaps_smoke
- * neutron_trunk
- * tempest_full_parallel
+ * tempest_neutron
+ * tempest_cinder
+ * tempest_keystone
+ * tempest_heat
+ * tempest_telemetry
+ * rally_sanity
+ * refstack_compute
+ * refstack_object
+ * refstack_platform
+ * tempest_full
+ * tempest_scenario
+ * tempest_slow
+ * patrole_admin
+ * patrole_user
+ * patrole_reader
+ * tempest_barbican
+ * tempest_octavia
+ * tempest_cyborg
* rally_full
+ * rally_jobs
+ * vmtp
+ * shaker
+ * cloudify
* cloudify_ims
+ * heat_ims
* vyos_vrouter
* juju_epc
-The OPNFV projects integrated into Functest framework for automation are:
-
- * doctor
- * bgpvpn
- * odl-sfc
- * barometer
- * fds
- * parser
-
Kubernetes
----------
The internal test cases are:
+ * k8s_quick
* k8s_smoke
* k8s_conformance
-
-The OPNFV projects integrated into Functest framework for automation are:
-
- * stor4nfv
- * clover
+ * xrally_kubernetes
+ * kube_hunter
+ * kube_bench_master
+ * kube_bench_node
+ * xrally_kubernetes_full
+ * k8s_vims
+ * helm_vims
+ * cnf_conformance
Release Data
============
@@ -81,84 +99,62 @@ Software
* https://hub.docker.com/r/opnfv/functest-healthcheck
* https://hub.docker.com/r/opnfv/functest-smoke
- * https://hub.docker.com/r/opnfv/functest-features
- * https://hub.docker.com/r/opnfv/functest-components
+ * https://hub.docker.com/r/opnfv/functest-benchmarking
* https://hub.docker.com/r/opnfv/functest-vnf
- * https://hub.docker.com/r/opnfv/functest-parser
+ * https://hub.docker.com/r/opnfv/functest-smoke-cntt
+ * https://hub.docker.com/r/opnfv/functest-benchmarking-cntt
Functest Docker images (Kubernetes):
* https://hub.docker.com/r/opnfv/functest-kubernetes-healthcheck
* https://hub.docker.com/r/opnfv/functest-kubernetes-smoke
- * https://hub.docker.com/r/opnfv/functest-kubernetes-features
+ * https://hub.docker.com/r/opnfv/functest-kubernetes-security
+ * https://hub.docker.com/r/opnfv/functest-kubernetes-benchmarking
+ * https://hub.docker.com/r/opnfv/functest-kubernetes-cnf
Docker tag for master: latest
Documents
---------
- * Config Guide: http://docs.opnfv.org/en/latest/submodules/functest/docs/testing/user/configguide/index.html
- * User Guide: http://docs.opnfv.org/en/latest/submodules/functest/docs/testing/user/userguide/index.html
- * Developer Guide: http://docs.opnfv.org/en/latest/submodules/functest/docs/testing/developer/devguide/index.html
- * API Docs: http://functest.readthedocs.io/en/latest/
+ * Functest Guides: https://functest.readthedocs.io/en/latest/
+ * API Docs: https://functest-api.readthedocs.io/en/latest/
Version change
==============
-New test cases
---------------
-
- * neutron_trunk
- * patrole
- * juju_epc
- * k8s_smoke
- * k8s_conformance
- * stor4nfv
- * clover
-
Key changes
-----------
- * update test cases and containers to `OpenStack Pike`_
- * move the framework into a separate project: Xtesting_
- * ease running all containers thanks to default values
- * clean interfaces with OPNFV Installers and Features
- * rewrite all vnfs to allow multiple tests in parallel
- * fully support non-default region names and Keystone v3 domains
- * refactor all tempest-based test cases (e.g. refstack_defcore)
- * remove obsolete OpenStack and Functest utils
- * verify all changes via doc8 and yamllint too
- * generate reports for all tempest-based test cases
+ * update testcases and containers to `OpenStack master`_ and to
+ `Kubernetes master`_
-.. _`OpenStack Pike`: https://raw.githubusercontent.com/openstack/requirements/stable/pike/upper-constraints.txt
-.. _Xtesting: http://xtesting.readthedocs.io/en/latest/
+.. _`OpenStack master`: https://github.com/openstack/requirements/blob/master/upper-constraints.txt
+.. _`Kubernetes master`: https://github.com/kubernetes/kubernetes
Key benefits
------------
- * the enduser can run all tests by setting only one input (EXTERNAL_NETWORK)
- * the developer can only work on the test suites without diving into CI/CD
- integration
- * both OpenStack and Kubernetes deployments can be verified
- * Functest test cases are trustable as they meet the best coding rules (unit
- tests, coverage, linters, etc.)
- * Functest can be reused in other projects (e.g.
- `ONS: Re-using OPNFV framework tests for LFN projects`_)
+ * the enduser can easily deploy its own `Functest toolchains`_ in few commands
+ * everyone can pick stable Functest rolling releases (latest included)
+ * Functest can verify VIM in production even on `Raspberry PI`_
+ * all testcases can run in parallel (tested with 4 executors in our gates)
+ * no remaining resources detected in our gates after multiple runs
-.. _`ONS: Re-using OPNFV framework tests for LFN projects`: https://wiki.lfnetworking.org/display/LN/LFN+Developer+Forum+Schedule?preview=/328197/328329/ONS-OPNFV%20framework%20tests%20for%20LFN%20projects.pdf
+.. _`Functest toolchains`: https://github.com/collivier/ansible-role-xtesting
+.. _`Raspberry PI`: https://github.com/opnfv/functest/blob/master/PI.md
Code quality
------------
- * pylint: ~9.5/10
- * code coverage: ~70%
+ * pylint: 10.00/10
+ * code coverage: 70%
Useful links
============
- * wiki project page: https://wiki.opnfv.org/opnfv_functional_testing
- * Functest git repository: https://git.opnfv.org/cgit/functest
- * Functest CI dashboard: https://build.opnfv.org/ci/view/functest/
+ * Functest git repository: https://github.com/opnfv/functest
+ * Functest CI dashboard: http://104.154.71.112:8080/view/functest/
* JIRA dashboard: https://jira.opnfv.org/secure/Dashboard.jspa?selectPageId=10611
* Functest IRC channel: #opnfv-functest
* Reporting page: http://testresults.opnfv.org/reporting/master/functest/functest.html
diff --git a/docs/release/release-notes/index.rst b/docs/release/release-notes/index.rst
index 5ded938da..25c2cbdfb 100644
--- a/docs/release/release-notes/index.rst
+++ b/docs/release/release-notes/index.rst
@@ -7,10 +7,6 @@ Functest Release Notes
**********************
.. toctree::
- :numbered:
:maxdepth: 4
functest-release.rst
- functest-gating.rst
-
-Build date: |today|
diff --git a/docs/release/release-notes/joid.rst b/docs/release/release-notes/joid.rst
deleted file mode 100644
index 08acc947f..000000000
--- a/docs/release/release-notes/joid.rst
+++ /dev/null
@@ -1,24 +0,0 @@
-joid
-====
-
-os-nosdn-nofeature-ha
----------------------
-
-==================== =================== ============ ======== =========
-testcase date pod_name result jira
-==================== =================== ============ ======== =========
-connection_check 2018-04-19 08:34:42 huawei-pod12 PASS
-api_check 2018-04-19 08:43:15 huawei-pod12 PASS
-snaps_health_check 2018-04-19 08:43:44 huawei-pod12 PASS
-vping_ssh 2018-04-19 08:45:12 huawei-pod12 PASS
-vping_userdata 2018-04-19 08:46:31 huawei-pod12 PASS
-tempest_smoke_serial 2018-04-19 09:01:29 huawei-pod12 FAIL
-rally_sanity 2018-04-19 09:05:00 huawei-pod12 FAIL
-refstack_defcore 2018-04-12 23:47:59 huawei-pod12 FAIL
-patrole 2018-04-19 09:08:12 huawei-pod12 FAIL
-snaps_smoke 2018-04-19 09:54:29 huawei-pod12 FAIL SNAPS-283
-neutron_trunk huawei-pod12
-cloudify_ims 2018-04-19 09:57:23 huawei-pod12 FAIL
-vyos_vrouter 2018-04-19 10:03:12 huawei-pod12 FAIL
-juju_epc 2018-04-19 10:03:38 huawei-pod12 FAIL
-==================== =================== ============ ======== =========
diff --git a/docs/results/euphrates/5.0/apex.html b/docs/results/euphrates/5.0/apex.html
index 2a75054c3..34f0c1503 100644
--- a/docs/results/euphrates/5.0/apex.html
+++ b/docs/results/euphrates/5.0/apex.html
@@ -307,13 +307,13 @@ $(document).ready(function (){
<th width="10%">Iteration</th>
</tr>
<tr class="tr-ok">
-
+
</tr><tr class="tr-ok">
-
+
</tr><tr class="tr-ok">
-
+
</tr><tr class="tr-ok">
-
+
</tr><tr class="tr-ok">
<td><a href=http://testresultS.opnfv.org/reporting>os-odl-fdio-ha</a></td>
<td><div id="gaugeScenario5"></div></td>
@@ -327,7 +327,7 @@ $(document).ready(function (){
<td>4/18</td>
<td>3</td>
</tr><tr class="tr-ok">
-
+
</tr><tr class="tr-ok">
<td><a href=https://build.opnfv.org/ci/view/functest/job/functest-apex-baremetal-daily-euphrates/108/console>os-nosdn-ovs_dpdk-ha</a></td>
<td><div id="gaugeScenario8"></div></td>
@@ -341,9 +341,9 @@ $(document).ready(function (){
<td>16/18</td>
<td>2</td>
</tr><tr class="tr-ok">
-
+
</tr><tr class="tr-ok">
-
+
</tr><tr class="tr-ok">
<td><a href=https://build.opnfv.org/ci/view/functest/job/functest-apex-baremetal-daily-euphrates/139/console>os-nosdn-fdio-ha</a></td>
<td><div id="gaugeScenario12"></div></td>
@@ -357,11 +357,11 @@ $(document).ready(function (){
<td>18/20</td>
<td>3</td>
</tr><tr class="tr-ok">
-
+
</tr><tr class="tr-ok">
-
+
</tr><tr class="tr-ok">
-
+
</tr><tr class="tr-ok">
<td><a href=https://build.opnfv.org/ci/view/functest/job/functest-apex-baremetal-daily-euphrates/121/console>os-nosdn-bar-ha</a></td>
<td><div id="gaugeScenario17"></div></td>
@@ -369,7 +369,7 @@ $(document).ready(function (){
<td>26/27</td>
<td>4</td>
</tr><tr class="tr-ok">
-
+
</tr><tr class="tr-ok">
<td><a href=https://build.opnfv.org/ci/view/functest/job/functest-apex-baremetal-daily-euphrates/134/console>os-nosdn-nofeature-ha</a></td>
<td><div id="gaugeScenario19"></div></td>
@@ -413,9 +413,9 @@ $(document).ready(function (){
<td>8/30</td>
<td>4</td>
</tr><tr class="tr-ok">
-
+
</tr><tr class="tr-ok">
-
+
</tr><tr class="tr-ok">
<td><a href=https://build.opnfv.org/ci/view/functest/job/functest-apex-baremetal-daily-euphrates/114/console>os-ovn-nofeature-noha</a></td>
<td><div id="gaugeScenario7"></div></td>
@@ -423,9 +423,9 @@ $(document).ready(function (){
<td>6/18</td>
<td>2</td>
</tr><tr class="tr-ok">
-
+
</tr><tr class="tr-ok">
-
+
</tr><tr class="tr-ok">
<td><a href=https://build.opnfv.org/ci/view/functest/job/functest-apex-baremetal-daily-euphrates/136/console>os-odl-nofeature-noha</a></td>
<td><div id="gaugeScenario10"></div></td>
@@ -439,9 +439,9 @@ $(document).ready(function (){
<td>4/18</td>
<td>3</td>
</tr><tr class="tr-ok">
-
+
</tr><tr class="tr-ok">
-
+
</tr><tr class="tr-ok">
<td><a href=http://testresultS.opnfv.org/reporting>os-odl-fdio_dvr-noha</a></td>
<td><div id="gaugeScenario14"></div></td>
@@ -461,7 +461,7 @@ $(document).ready(function (){
<td>18/18</td>
<td>3</td>
</tr><tr class="tr-ok">
-
+
</tr><tr class="tr-ok">
<td><a href=https://build.opnfv.org/ci/view/functest/job/functest-apex-baremetal-daily-euphrates/128/console>os-nosdn-calipso-noha</a></td>
<td><div id="gaugeScenario18"></div></td>
@@ -469,7 +469,7 @@ $(document).ready(function (){
<td>18/18</td>
<td>3</td>
</tr><tr class="tr-ok">
-
+
</tr>
</table>
@@ -489,31 +489,31 @@ $(document).ready(function (){
<tr>
<th>
Health (connection)
-
+
</th><th>
Health (api)
-
+
</th><th>
Health (dhcp)
-
+
</th><th>
vPing (ssh)
-
+
</th><th>
vPing (userdata)
-
+
</th><th>
Tempest (smoke)
-
+
</th><th>
Rally (smoke)
-
+
</th><th>
Refstack
-
+
</th><th>
SNAPS
-
+
</th>
</tr>
<tr class="tr-weather-weather">
@@ -534,31 +534,31 @@ $(document).ready(function (){
<tr>
<th>
Health (connection)
-
+
</th><th>
Health (api)
-
+
</th><th>
Health (dhcp)
-
+
</th><th>
vPing (ssh)
-
+
</th><th>
vPing (userdata)
-
+
</th><th>
Tempest (smoke)
-
+
</th><th>
Rally (smoke)
-
+
</th><th>
Refstack
-
+
</th><th>
SNAPS
-
+
</th><th>
Domino
*
@@ -582,37 +582,37 @@ $(document).ready(function (){
<tr>
<th>
Health (connection)
-
+
</th><th>
Health (api)
-
+
</th><th>
Health (dhcp)
-
+
</th><th>
vPing (ssh)
-
+
</th><th>
vPing (userdata)
-
+
</th><th>
Tempest (smoke)
-
+
</th><th>
Rally (smoke)
-
+
</th><th>
Refstack
-
+
</th><th>
ODL
-
+
</th><th>
FDS
-
+
</th><th>
SNAPS
-
+
</th><th>
Domino
*
@@ -636,34 +636,34 @@ $(document).ready(function (){
<tr>
<th>
Health (connection)
-
+
</th><th>
Health (api)
-
+
</th><th>
Health (dhcp)
-
+
</th><th>
vPing (ssh)
-
+
</th><th>
vPing (userdata)
-
+
</th><th>
Tempest (smoke)
-
+
</th><th>
Rally (smoke)
-
+
</th><th>
Refstack
-
+
</th><th>
ODL
-
+
</th><th>
SNAPS
-
+
</th><th>
Doctor
*
@@ -693,37 +693,37 @@ $(document).ready(function (){
<tr>
<th>
Health (connection)
-
+
</th><th>
Health (api)
-
+
</th><th>
Health (dhcp)
-
+
</th><th>
vPing (ssh)
-
+
</th><th>
vPing (userdata)
-
+
</th><th>
Tempest (smoke)
-
+
</th><th>
Rally (smoke)
-
+
</th><th>
Refstack
-
+
</th><th>
ODL
-
+
</th><th>
FDS
-
+
</th><th>
SNAPS
-
+
</th><th>
Domino
*
@@ -747,31 +747,31 @@ $(document).ready(function (){
<tr>
<th>
Health (connection)
-
+
</th><th>
Health (api)
-
+
</th><th>
Health (dhcp)
-
+
</th><th>
vPing (ssh)
-
+
</th><th>
vPing (userdata)
-
+
</th><th>
Tempest (smoke)
-
+
</th><th>
Rally (smoke)
-
+
</th><th>
Refstack
-
+
</th><th>
SNAPS
-
+
</th>
</tr>
<tr class="tr-weather-weather">
@@ -792,31 +792,31 @@ $(document).ready(function (){
<tr>
<th>
Health (connection)
-
+
</th><th>
Health (api)
-
+
</th><th>
Health (dhcp)
-
+
</th><th>
vPing (ssh)
-
+
</th><th>
vPing (userdata)
-
+
</th><th>
Tempest (smoke)
-
+
</th><th>
Rally (smoke)
-
+
</th><th>
Refstack
-
+
</th><th>
SNAPS
-
+
</th><th>
Doctor
*
@@ -843,31 +843,31 @@ $(document).ready(function (){
<tr>
<th>
Health (connection)
-
+
</th><th>
Health (api)
-
+
</th><th>
Health (dhcp)
-
+
</th><th>
vPing (ssh)
-
+
</th><th>
vPing (userdata)
-
+
</th><th>
Tempest (smoke)
-
+
</th><th>
Rally (smoke)
-
+
</th><th>
Refstack
-
+
</th><th>
SNAPS
-
+
</th>
</tr>
<tr class="tr-weather-weather">
@@ -888,31 +888,31 @@ $(document).ready(function (){
<tr>
<th>
Health (connection)
-
+
</th><th>
Health (api)
-
+
</th><th>
Health (dhcp)
-
+
</th><th>
vPing (userdata)
-
+
</th><th>
Tempest (smoke)
-
+
</th><th>
Rally (smoke)
-
+
</th><th>
Refstack
-
+
</th><th>
ODL
-
+
</th><th>
SNAPS
-
+
</th><th>
Doctor
*
@@ -942,34 +942,34 @@ $(document).ready(function (){
<tr>
<th>
Health (connection)
-
+
</th><th>
Health (api)
-
+
</th><th>
Health (dhcp)
-
+
</th><th>
vPing (ssh)
-
+
</th><th>
vPing (userdata)
-
+
</th><th>
Tempest (smoke)
-
+
</th><th>
Rally (smoke)
-
+
</th><th>
Refstack
-
+
</th><th>
ODL
-
+
</th><th>
SNAPS
-
+
</th><th>
Doctor
*
@@ -996,31 +996,31 @@ $(document).ready(function (){
<tr>
<th>
Health (connection)
-
+
</th><th>
Health (api)
-
+
</th><th>
Health (dhcp)
-
+
</th><th>
vPing (ssh)
-
+
</th><th>
vPing (userdata)
-
+
</th><th>
Tempest (smoke)
-
+
</th><th>
Rally (smoke)
-
+
</th><th>
Refstack
-
+
</th><th>
SNAPS
-
+
</th>
</tr>
<tr class="tr-weather-weather">
@@ -1041,31 +1041,31 @@ $(document).ready(function (){
<tr>
<th>
Health (connection)
-
+
</th><th>
Health (api)
-
+
</th><th>
Health (dhcp)
-
+
</th><th>
vPing (ssh)
-
+
</th><th>
vPing (userdata)
-
+
</th><th>
Tempest (smoke)
-
+
</th><th>
Rally (smoke)
-
+
</th><th>
Refstack
-
+
</th><th>
SNAPS
-
+
</th><th>
Domino
*
@@ -1089,34 +1089,34 @@ $(document).ready(function (){
<tr>
<th>
Health (connection)
-
+
</th><th>
Health (api)
-
+
</th><th>
Health (dhcp)
-
+
</th><th>
vPing (ssh)
-
+
</th><th>
vPing (userdata)
-
+
</th><th>
Tempest (smoke)
-
+
</th><th>
Rally (smoke)
-
+
</th><th>
Refstack
-
+
</th><th>
ODL
-
+
</th><th>
SNAPS
-
+
</th><th>
Doctor
*
@@ -1143,37 +1143,37 @@ $(document).ready(function (){
<tr>
<th>
Health (connection)
-
+
</th><th>
Health (api)
-
+
</th><th>
Health (dhcp)
-
+
</th><th>
vPing (ssh)
-
+
</th><th>
vPing (userdata)
-
+
</th><th>
Tempest (smoke)
-
+
</th><th>
Rally (smoke)
-
+
</th><th>
Refstack
-
+
</th><th>
ODL
-
+
</th><th>
FDS
-
+
</th><th>
SNAPS
-
+
</th><th>
Domino
*
@@ -1197,31 +1197,31 @@ $(document).ready(function (){
<tr>
<th>
Health (connection)
-
+
</th><th>
Health (api)
-
+
</th><th>
Health (dhcp)
-
+
</th><th>
vPing (ssh)
-
+
</th><th>
vPing (userdata)
-
+
</th><th>
Tempest (smoke)
-
+
</th><th>
Rally (smoke)
-
+
</th><th>
Refstack
-
+
</th><th>
SNAPS
-
+
</th><th>
Doctor
*
@@ -1251,31 +1251,31 @@ $(document).ready(function (){
<tr>
<th>
Health (connection)
-
+
</th><th>
Health (api)
-
+
</th><th>
Health (dhcp)
-
+
</th><th>
vPing (ssh)
-
+
</th><th>
vPing (userdata)
-
+
</th><th>
Tempest (smoke)
-
+
</th><th>
Rally (smoke)
-
+
</th><th>
Refstack
-
+
</th><th>
SNAPS
-
+
</th><th>
Doctor
*
@@ -1302,31 +1302,31 @@ $(document).ready(function (){
<tr>
<th>
Health (connection)
-
+
</th><th>
Health (api)
-
+
</th><th>
Health (dhcp)
-
+
</th><th>
vPing (ssh)
-
+
</th><th>
vPing (userdata)
-
+
</th><th>
Tempest (smoke)
-
+
</th><th>
Rally (smoke)
-
+
</th><th>
Refstack
-
+
</th><th>
SNAPS
-
+
</th><th>
Doctor
*
@@ -1356,31 +1356,31 @@ $(document).ready(function (){
<tr>
<th>
Health (connection)
-
+
</th><th>
Health (api)
-
+
</th><th>
Health (dhcp)
-
+
</th><th>
vPing (ssh)
-
+
</th><th>
vPing (userdata)
-
+
</th><th>
Tempest (smoke)
-
+
</th><th>
Rally (smoke)
-
+
</th><th>
Refstack
-
+
</th><th>
SNAPS
-
+
</th><th>
Doctor
*
@@ -1407,31 +1407,31 @@ $(document).ready(function (){
<tr>
<th>
Health (connection)
-
+
</th><th>
Health (api)
-
+
</th><th>
Health (dhcp)
-
+
</th><th>
vPing (ssh)
-
+
</th><th>
vPing (userdata)
-
+
</th><th>
Tempest (smoke)
-
+
</th><th>
Rally (smoke)
-
+
</th><th>
Refstack
-
+
</th><th>
SNAPS
-
+
</th><th>
Doctor
*
diff --git a/docs/results/euphrates/5.0/compass.html b/docs/results/euphrates/5.0/compass.html
index d62ba4d2e..b7f7a20ea 100644
--- a/docs/results/euphrates/5.0/compass.html
+++ b/docs/results/euphrates/5.0/compass.html
@@ -223,11 +223,11 @@ $(document).ready(function (){
<th width="10%">Iteration</th>
</tr>
<tr class="tr-ok">
-
+
</tr><tr class="tr-ok">
-
+
</tr><tr class="tr-ok">
-
+
</tr><tr class="tr-ok">
<td><a href=https://build.opnfv.org/ci/view/functest/job/functest-compass-virtual-daily-euphrates/81/console>os-odl_l3-nofeature-ha</a></td>
<td><div id="gaugeScenario4"></div></td>
@@ -247,7 +247,7 @@ $(document).ready(function (){
<td>26/30</td>
<td>9</td>
</tr><tr class="tr-ok">
-
+
</tr><tr class="tr-ok">
<td><a href=https://build.opnfv.org/ci/view/functest/job/functest-compass-virtual-daily-euphrates/72/console>os-nosdn-ovs_dpdk-ha</a></td>
<td><div id="gaugeScenario8"></div></td>
@@ -255,9 +255,9 @@ $(document).ready(function (){
<td>2/18</td>
<td>3</td>
</tr><tr class="tr-ok">
-
+
</tr><tr class="tr-ok">
-
+
</tr><tr class="tr-ok">
<td><a href=https://build.opnfv.org/ci/view/functest/job/functest-compass-baremetal-daily-euphrates/24/console>os-odl_l2-moon-ha</a></td>
<td><div id="gaugeScenario11"></div></td>
@@ -301,11 +301,11 @@ $(document).ready(function (){
<td>24/30</td>
<td>4</td>
</tr><tr class="tr-ok">
-
+
</tr><tr class="tr-ok">
-
+
</tr><tr class="tr-ok">
-
+
</tr><tr class="tr-ok">
<td><a href=https://build.opnfv.org/ci/view/functest/job/functest-compass-virtual-daily-euphrates/86/console>os-nosdn-nofeature-noha</a></td>
<td><div id="gaugeScenario7"></div></td>
@@ -313,7 +313,7 @@ $(document).ready(function (){
<td>26/27</td>
<td>6</td>
</tr><tr class="tr-ok">
-
+
</tr><tr class="tr-ok">
<td><a href=https://build.opnfv.org/ci/view/functest/job/functest-compass-virtual-daily-euphrates/82/console>os-nosdn-ovs_dpdk-noha</a></td>
<td><div id="gaugeScenario9"></div></td>
@@ -327,9 +327,9 @@ $(document).ready(function (){
<td>14/18</td>
<td>3</td>
</tr><tr class="tr-ok">
-
+
</tr><tr class="tr-ok">
-
+
</tr>
</table>
@@ -349,31 +349,31 @@ $(document).ready(function (){
<tr>
<th>
Health (connection)
-
+
</th><th>
Health (api)
-
+
</th><th>
Health (dhcp)
-
+
</th><th>
vPing (ssh)
-
+
</th><th>
vPing (userdata)
-
+
</th><th>
Tempest (smoke)
-
+
</th><th>
Rally (smoke)
-
+
</th><th>
Refstack
-
+
</th><th>
SNAPS
-
+
</th><th>
Domino
*
@@ -397,34 +397,34 @@ $(document).ready(function (){
<tr>
<th>
Health (connection)
-
+
</th><th>
Health (api)
-
+
</th><th>
Health (dhcp)
-
+
</th><th>
vPing (ssh)
-
+
</th><th>
vPing (userdata)
-
+
</th><th>
Tempest (smoke)
-
+
</th><th>
Rally (smoke)
-
+
</th><th>
Refstack
-
+
</th><th>
ODL
-
+
</th><th>
SNAPS
-
+
</th><th>
SFC
*
@@ -451,34 +451,34 @@ $(document).ready(function (){
<tr>
<th>
Health (connection)
-
+
</th><th>
Health (api)
-
+
</th><th>
Health (dhcp)
-
+
</th><th>
vPing (ssh)
-
+
</th><th>
vPing (userdata)
-
+
</th><th>
Tempest (smoke)
-
+
</th><th>
Rally (smoke)
-
+
</th><th>
Refstack
-
+
</th><th>
ODL
-
+
</th><th>
SNAPS
-
+
</th><th>
Domino
*
@@ -502,31 +502,31 @@ $(document).ready(function (){
<tr>
<th>
Health (connection)
-
+
</th><th>
Health (api)
-
+
</th><th>
Health (dhcp)
-
+
</th><th>
vPing (userdata)
-
+
</th><th>
Tempest (smoke)
-
+
</th><th>
Rally (smoke)
-
+
</th><th>
Refstack
-
+
</th><th>
ODL
-
+
</th><th>
SNAPS
-
+
</th><th>
Domino
*
@@ -550,31 +550,31 @@ $(document).ready(function (){
<tr>
<th>
Health (connection)
-
+
</th><th>
Health (api)
-
+
</th><th>
Health (dhcp)
-
+
</th><th>
vPing (ssh)
-
+
</th><th>
vPing (userdata)
-
+
</th><th>
Tempest (smoke)
-
+
</th><th>
Rally (smoke)
-
+
</th><th>
Refstack
-
+
</th><th>
SNAPS
-
+
</th><th>
Domino
*
@@ -598,34 +598,34 @@ $(document).ready(function (){
<tr>
<th>
Health (connection)
-
+
</th><th>
Health (api)
-
+
</th><th>
Health (dhcp)
-
+
</th><th>
vPing (ssh)
-
+
</th><th>
vPing (userdata)
-
+
</th><th>
Tempest (smoke)
-
+
</th><th>
Rally (smoke)
-
+
</th><th>
Refstack
-
+
</th><th>
ODL
-
+
</th><th>
SNAPS
-
+
</th><th>
SFC
*
@@ -652,31 +652,31 @@ $(document).ready(function (){
<tr>
<th>
Health (connection)
-
+
</th><th>
Health (api)
-
+
</th><th>
Health (dhcp)
-
+
</th><th>
vPing (ssh)
-
+
</th><th>
vPing (userdata)
-
+
</th><th>
Tempest (smoke)
-
+
</th><th>
Rally (smoke)
-
+
</th><th>
Refstack
-
+
</th><th>
SNAPS
-
+
</th><th>
Domino
*
@@ -700,31 +700,31 @@ $(document).ready(function (){
<tr>
<th>
Health (connection)
-
+
</th><th>
Health (api)
-
+
</th><th>
Health (dhcp)
-
+
</th><th>
vPing (ssh)
-
+
</th><th>
vPing (userdata)
-
+
</th><th>
Tempest (smoke)
-
+
</th><th>
Rally (smoke)
-
+
</th><th>
Refstack
-
+
</th><th>
SNAPS
-
+
</th>
</tr>
<tr class="tr-weather-weather">
@@ -745,31 +745,31 @@ $(document).ready(function (){
<tr>
<th>
Health (connection)
-
+
</th><th>
Health (api)
-
+
</th><th>
Health (dhcp)
-
+
</th><th>
vPing (ssh)
-
+
</th><th>
vPing (userdata)
-
+
</th><th>
Tempest (smoke)
-
+
</th><th>
Rally (smoke)
-
+
</th><th>
Refstack
-
+
</th><th>
SNAPS
-
+
</th>
</tr>
<tr class="tr-weather-weather">
@@ -790,31 +790,31 @@ $(document).ready(function (){
<tr>
<th>
Health (connection)
-
+
</th><th>
Health (api)
-
+
</th><th>
Health (dhcp)
-
+
</th><th>
vPing (userdata)
-
+
</th><th>
Tempest (smoke)
-
+
</th><th>
Rally (smoke)
-
+
</th><th>
Refstack
-
+
</th><th>
ODL
-
+
</th><th>
SNAPS
-
+
</th><th>
Domino
*
@@ -838,34 +838,34 @@ $(document).ready(function (){
<tr>
<th>
Health (connection)
-
+
</th><th>
Health (api)
-
+
</th><th>
Health (dhcp)
-
+
</th><th>
vPing (ssh)
-
+
</th><th>
vPing (userdata)
-
+
</th><th>
Tempest (smoke)
-
+
</th><th>
Rally (smoke)
-
+
</th><th>
Refstack
-
+
</th><th>
ODL
-
+
</th><th>
SNAPS
-
+
</th><th>
Domino
*
@@ -889,31 +889,31 @@ $(document).ready(function (){
<tr>
<th>
Health (connection)
-
+
</th><th>
Health (api)
-
+
</th><th>
Health (dhcp)
-
+
</th><th>
vPing (ssh)
-
+
</th><th>
vPing (userdata)
-
+
</th><th>
Tempest (smoke)
-
+
</th><th>
Rally (smoke)
-
+
</th><th>
Refstack
-
+
</th><th>
SNAPS
-
+
</th><th>
Domino
*
diff --git a/docs/results/euphrates/5.0/daisy.html b/docs/results/euphrates/5.0/daisy.html
index 6de8d0895..09580fc19 100644
--- a/docs/results/euphrates/5.0/daisy.html
+++ b/docs/results/euphrates/5.0/daisy.html
@@ -127,9 +127,9 @@ $(document).ready(function (){
<th width="10%">Iteration</th>
</tr>
<tr class="tr-ok">
-
+
</tr><tr class="tr-ok">
-
+
</tr>
</table>
@@ -149,31 +149,31 @@ $(document).ready(function (){
<tr>
<th>
Health (connection)
-
+
</th><th>
Health (api)
-
+
</th><th>
Health (dhcp)
-
+
</th><th>
vPing (ssh)
-
+
</th><th>
vPing (userdata)
-
+
</th><th>
Tempest (smoke)
-
+
</th><th>
Rally (smoke)
-
+
</th><th>
Refstack
-
+
</th><th>
SNAPS
-
+
</th><th>
Domino
*
@@ -206,34 +206,34 @@ $(document).ready(function (){
<tr>
<th>
Health (connection)
-
+
</th><th>
Health (api)
-
+
</th><th>
Health (dhcp)
-
+
</th><th>
vPing (ssh)
-
+
</th><th>
vPing (userdata)
-
+
</th><th>
Tempest (smoke)
-
+
</th><th>
Rally (smoke)
-
+
</th><th>
Refstack
-
+
</th><th>
ODL
-
+
</th><th>
SNAPS
-
+
</th><th>
Domino
*
diff --git a/docs/results/euphrates/5.0/fuel@aarch64.html b/docs/results/euphrates/5.0/fuel@aarch64.html
index c8a2f2db0..aa9f1eb66 100644
--- a/docs/results/euphrates/5.0/fuel@aarch64.html
+++ b/docs/results/euphrates/5.0/fuel@aarch64.html
@@ -115,7 +115,7 @@ $(document).ready(function (){
<th width="10%">Iteration</th>
</tr>
<tr class="tr-ok">
-
+
</tr><tr class="tr-ok">
<td><a href=https://build.opnfv.org/ci/view/functest/job/functest-fuel-armband-baremetal-arm-daily-euphrates/31/console>os-nosdn-nofeature-ha</a></td>
<td><div id="gaugeScenario2"></div></td>
@@ -147,9 +147,9 @@ $(document).ready(function (){
<td>1/9</td>
<td>1</td>
</tr><tr class="tr-ok">
-
+
</tr><tr class="tr-ok">
-
+
</tr>
</table>
@@ -169,31 +169,31 @@ $(document).ready(function (){
<tr>
<th>
Health (connection)
-
+
</th><th>
Health (api)
-
+
</th><th>
Health (dhcp)
-
+
</th><th>
vPing (ssh)
-
+
</th><th>
vPing (userdata)
-
+
</th><th>
Tempest (smoke)
-
+
</th><th>
Rally (smoke)
-
+
</th><th>
Refstack
-
+
</th><th>
SNAPS
-
+
</th><th>
Promise
*
@@ -220,31 +220,31 @@ $(document).ready(function (){
<tr>
<th>
Health (connection)
-
+
</th><th>
Health (api)
-
+
</th><th>
Health (dhcp)
-
+
</th><th>
vPing (ssh)
-
+
</th><th>
vPing (userdata)
-
+
</th><th>
Tempest (smoke)
-
+
</th><th>
Rally (smoke)
-
+
</th><th>
Refstack
-
+
</th><th>
SNAPS
-
+
</th><th>
Promise
*
@@ -283,34 +283,34 @@ $(document).ready(function (){
<tr>
<th>
Health (connection)
-
+
</th><th>
Health (api)
-
+
</th><th>
Health (dhcp)
-
+
</th><th>
vPing (ssh)
-
+
</th><th>
vPing (userdata)
-
+
</th><th>
Tempest (smoke)
-
+
</th><th>
Rally (smoke)
-
+
</th><th>
Refstack
-
+
</th><th>
ODL
-
+
</th><th>
SNAPS
-
+
</th><th>
Promise
*
diff --git a/docs/results/euphrates/5.0/fuel@x86.html b/docs/results/euphrates/5.0/fuel@x86.html
index 3b918dd74..52b67b37f 100644
--- a/docs/results/euphrates/5.0/fuel@x86.html
+++ b/docs/results/euphrates/5.0/fuel@x86.html
@@ -151,7 +151,7 @@ $(document).ready(function (){
<th width="10%">Iteration</th>
</tr>
<tr class="tr-ok">
-
+
</tr><tr class="tr-ok">
<td><a href=https://build.opnfv.org/ci/view/functest/job/functest-fuel-baremetal-daily-euphrates/40/console>os-odl-nofeature-ha</a></td>
<td><div id="gaugeScenario2"></div></td>
@@ -159,9 +159,9 @@ $(document).ready(function (){
<td>29/30</td>
<td>6</td>
</tr><tr class="tr-ok">
-
+
</tr><tr class="tr-ok">
-
+
</tr><tr class="tr-ok">
<td><a href=https://build.opnfv.org/ci/view/functest/job/functest-fuel-baremetal-daily-euphrates/38/console>os-nosdn-ovs-ha</a></td>
<td><div id="gaugeScenario5"></div></td>
@@ -193,7 +193,7 @@ $(document).ready(function (){
<td>25/27</td>
<td>10</td>
</tr><tr class="tr-ok">
-
+
</tr><tr class="tr-ok">
<td><a href=https://build.opnfv.org/ci/view/functest/job/functest-fuel-virtual-daily-euphrates/91/console>os-odl-nofeature-noha</a></td>
<td><div id="gaugeScenario3"></div></td>
@@ -207,9 +207,9 @@ $(document).ready(function (){
<td>27/27</td>
<td>9</td>
</tr><tr class="tr-ok">
-
+
</tr><tr class="tr-ok">
-
+
</tr>
</table>
@@ -229,31 +229,31 @@ $(document).ready(function (){
<tr>
<th>
Health (connection)
-
+
</th><th>
Health (api)
-
+
</th><th>
Health (dhcp)
-
+
</th><th>
vPing (ssh)
-
+
</th><th>
vPing (userdata)
-
+
</th><th>
Tempest (smoke)
-
+
</th><th>
Rally (smoke)
-
+
</th><th>
Refstack
-
+
</th><th>
SNAPS
-
+
</th><th>
Promise
*
@@ -280,34 +280,34 @@ $(document).ready(function (){
<tr>
<th>
Health (connection)
-
+
</th><th>
Health (api)
-
+
</th><th>
Health (dhcp)
-
+
</th><th>
vPing (ssh)
-
+
</th><th>
vPing (userdata)
-
+
</th><th>
Tempest (smoke)
-
+
</th><th>
Rally (smoke)
-
+
</th><th>
Refstack
-
+
</th><th>
ODL
-
+
</th><th>
SNAPS
-
+
</th><th>
Promise
*
@@ -334,34 +334,34 @@ $(document).ready(function (){
<tr>
<th>
Health (connection)
-
+
</th><th>
Health (api)
-
+
</th><th>
Health (dhcp)
-
+
</th><th>
vPing (ssh)
-
+
</th><th>
vPing (userdata)
-
+
</th><th>
Tempest (smoke)
-
+
</th><th>
Rally (smoke)
-
+
</th><th>
Refstack
-
+
</th><th>
ODL
-
+
</th><th>
SNAPS
-
+
</th><th>
Promise
*
@@ -388,31 +388,31 @@ $(document).ready(function (){
<tr>
<th>
Health (connection)
-
+
</th><th>
Health (api)
-
+
</th><th>
Health (dhcp)
-
+
</th><th>
vPing (ssh)
-
+
</th><th>
vPing (userdata)
-
+
</th><th>
Tempest (smoke)
-
+
</th><th>
Rally (smoke)
-
+
</th><th>
Refstack
-
+
</th><th>
SNAPS
-
+
</th><th>
Promise
*
@@ -439,31 +439,31 @@ $(document).ready(function (){
<tr>
<th>
Health (connection)
-
+
</th><th>
Health (api)
-
+
</th><th>
Health (dhcp)
-
+
</th><th>
vPing (ssh)
-
+
</th><th>
vPing (userdata)
-
+
</th><th>
Tempest (smoke)
-
+
</th><th>
Rally (smoke)
-
+
</th><th>
Refstack
-
+
</th><th>
SNAPS
-
+
</th><th>
Promise
*
@@ -490,31 +490,31 @@ $(document).ready(function (){
<tr>
<th>
Health (connection)
-
+
</th><th>
Health (api)
-
+
</th><th>
Health (dhcp)
-
+
</th><th>
vPing (ssh)
-
+
</th><th>
vPing (userdata)
-
+
</th><th>
Tempest (smoke)
-
+
</th><th>
Rally (smoke)
-
+
</th><th>
Refstack
-
+
</th><th>
SNAPS
-
+
</th><th>
Promise
*
diff --git a/docs/results/euphrates/5.0/joid.html b/docs/results/euphrates/5.0/joid.html
index d58efcca1..9b6d0f4d0 100644
--- a/docs/results/euphrates/5.0/joid.html
+++ b/docs/results/euphrates/5.0/joid.html
@@ -163,7 +163,7 @@ $(document).ready(function (){
<th width="10%">Iteration</th>
</tr>
<tr class="tr-ok">
-
+
</tr><tr class="tr-ok">
<td><a href=https://build.opnfv.org/ci/view/functest/job/functest-joid-baremetal-daily-euphrates/84/console>os-ocl-nofeature-ha</a></td>
<td><div id="gaugeScenario2"></div></td>
@@ -171,7 +171,7 @@ $(document).ready(function (){
<td>3/27</td>
<td>10</td>
</tr><tr class="tr-ok">
-
+
</tr><tr class="tr-ok">
<td><a href=https://build.opnfv.org/ci/view/functest/job/functest-joid-baremetal-daily-euphrates/67/console>os-nosdn-openbaton-ha</a></td>
<td><div id="gaugeScenario4"></div></td>
@@ -185,7 +185,7 @@ $(document).ready(function (){
<td>2/15</td>
<td>4</td>
</tr><tr class="tr-ok">
-
+
</tr><tr class="tr-ok">
<td><a href=https://build.opnfv.org/ci/view/functest/job/functest-joid-baremetal-daily-euphrates/81/console>os-nosdn-nofeature-ha</a></td>
<td><div id="gaugeScenario7"></div></td>
@@ -211,7 +211,7 @@ $(document).ready(function (){
<td>3/27</td>
<td>9</td>
</tr><tr class="tr-ok">
-
+
</tr><tr class="tr-ok">
<td><a href=https://build.opnfv.org/ci/view/functest/job/functest-joid-baremetal-daily-euphrates/90/console>os-nosdn-nofeature-noha</a></td>
<td><div id="gaugeScenario3"></div></td>
@@ -219,9 +219,9 @@ $(document).ready(function (){
<td>15/27</td>
<td>9</td>
</tr><tr class="tr-ok">
-
+
</tr><tr class="tr-ok">
-
+
</tr><tr class="tr-ok">
<td><a href=https://build.opnfv.org/ci/view/functest/job/functest-joid-baremetal-daily-euphrates/88/console>os-nosdn-lxd-noha</a></td>
<td><div id="gaugeScenario6"></div></td>
@@ -229,7 +229,7 @@ $(document).ready(function (){
<td>3/15</td>
<td>9</td>
</tr><tr class="tr-ok">
-
+
</tr>
</table>
@@ -249,31 +249,31 @@ $(document).ready(function (){
<tr>
<th>
Health (connection)
-
+
</th><th>
Health (api)
-
+
</th><th>
Health (dhcp)
-
+
</th><th>
vPing (ssh)
-
+
</th><th>
vPing (userdata)
-
+
</th><th>
Tempest (smoke)
-
+
</th><th>
Rally (smoke)
-
+
</th><th>
Refstack
-
+
</th><th>
SNAPS
-
+
</th>
</tr>
<tr class="tr-weather-weather">
@@ -294,31 +294,31 @@ $(document).ready(function (){
<tr>
<th>
Health (connection)
-
+
</th><th>
Health (api)
-
+
</th><th>
Health (dhcp)
-
+
</th><th>
vPing (ssh)
-
+
</th><th>
vPing (userdata)
-
+
</th><th>
Tempest (smoke)
-
+
</th><th>
Rally (smoke)
-
+
</th><th>
Refstack
-
+
</th><th>
SNAPS
-
+
</th>
</tr>
<tr class="tr-weather-weather">
@@ -339,31 +339,31 @@ $(document).ready(function (){
<tr>
<th>
Health (connection)
-
+
</th><th>
Health (api)
-
+
</th><th>
Health (dhcp)
-
+
</th><th>
vPing (ssh)
-
+
</th><th>
vPing (userdata)
-
+
</th><th>
Tempest (smoke)
-
+
</th><th>
Rally (smoke)
-
+
</th><th>
Refstack
-
+
</th><th>
SNAPS
-
+
</th><th>
Promise
*
@@ -390,31 +390,31 @@ $(document).ready(function (){
<tr>
<th>
Health (connection)
-
+
</th><th>
Health (api)
-
+
</th><th>
Health (dhcp)
-
+
</th><th>
vPing (ssh)
-
+
</th><th>
vPing (userdata)
-
+
</th><th>
Tempest (smoke)
-
+
</th><th>
Rally (smoke)
-
+
</th><th>
Refstack
-
+
</th><th>
SNAPS
-
+
</th><th>
Promise
*
@@ -441,19 +441,19 @@ $(document).ready(function (){
<tr>
<th>
Health (connection)
-
+
</th><th>
vPing (ssh)
-
+
</th><th>
Tempest (smoke)
-
+
</th><th>
Rally (smoke)
-
+
</th><th>
Refstack
-
+
</th><th>
Promise
*
@@ -480,19 +480,19 @@ $(document).ready(function (){
<tr>
<th>
Health (connection)
-
+
</th><th>
vPing (ssh)
-
+
</th><th>
Tempest (smoke)
-
+
</th><th>
Rally (smoke)
-
+
</th><th>
Refstack
-
+
</th><th>
Promise
*
@@ -519,31 +519,31 @@ $(document).ready(function (){
<tr>
<th>
Health (connection)
-
+
</th><th>
Health (api)
-
+
</th><th>
Health (dhcp)
-
+
</th><th>
vPing (ssh)
-
+
</th><th>
vPing (userdata)
-
+
</th><th>
Tempest (smoke)
-
+
</th><th>
Rally (smoke)
-
+
</th><th>
Refstack
-
+
</th><th>
SNAPS
-
+
</th><th>
Promise
*
diff --git a/docs/results/js/default.css b/docs/results/js/default.css
index e32fa5fba..cbb564326 100644
--- a/docs/results/js/default.css
+++ b/docs/results/js/default.css
@@ -55,7 +55,7 @@ td{
background-color: #0095a2;
}
-h1 {
+h1 {
display: block;
font-size: 2em;
margin-top: 0.67em;
diff --git a/docs/results/js/trend.js b/docs/results/js/trend.js
index f24213382..47ee4d906 100644
--- a/docs/results/js/trend.js
+++ b/docs/results/js/trend.js
@@ -63,13 +63,13 @@ var trend = function(container, trend_data) {
.attr("d", valueline(trend_data))
.attr("stroke", "steelblue")
.attr("fill", "none");
-
+
trend_svg.selectAll(".dot")
.data(trend_data)
.enter().append("circle")
.attr("r", 2.5)
.attr("cx", function(d) { return trend_x(d.date); })
- .attr("cy", function(d) { return trend_y(d.score); });
+ .attr("cy", function(d) { return trend_y(d.score); });
return trend;
}
diff --git a/docs/spelling_wordlist.txt b/docs/spelling_wordlist.txt
new file mode 100644
index 000000000..f4dcea507
--- /dev/null
+++ b/docs/spelling_wordlist.txt
@@ -0,0 +1,151 @@
+ABot
+admin
+adminURL
+api
+auth
+backend
+barbican
+benchmarking
+Benchmarking
+bgpvpn
+cacerts
+chan
+ci
+Clearwater
+cloudify
+Cloudify
+cnf
+cntt
+conf
+config
+dashboarding
+defcore
+Defcore
+Deliverables
+dhcp
+dockerhub
+enduser
+env
+EnvironmentVariable
+epc
+fds
+frontend
+functest
+Functest
+functionalities
+guestbook
+Guestbook
+healthcheck
+Healthcheck
+http
+https
+ims
+ini
+init
+interop
+Interop
+interoperability
+intra
+iptables
+jenkins
+Joid
+juju
+Juju
+jumphost
+Jumphost
+kube
+kubernetes
+Kubernetes
+kvm
+linux
+login
+metadata
+Metadata
+middleware
+nfv
+nofeature
+noha
+nosdn
+octavia
+odl
+onboarding
+ons
+Opendaylight
+openstack
+Openstack
+opnfv
+orchestrator
+Orchestrator
+organised
+os
+ovs
+patrole
+Patrole
+plugin
+pre
+proxified
+Reachability
+reconnection
+redis
+refactored
+refactoring
+refstack
+Refstack
+repo
+resolv
+restapi
+Restconf
+runnable
+screenshot
+sdn
+sfc
+signalling
+singlevm
+src
+su
+subfolder
+subnet
+Subnet
+subnets
+sudo
+systemctl
+Telco
+tenantnetwork
+testcase
+testcases
+TLS
+txt
+un
+url
+userdata
+userid
+username
+usr
+util
+utils
+UUID
+vdb
+vEPC
+verifier
+versioned
+vIMS
+vims
+Virtualised
+Virtualized
+vm
+VM
+vmready
+vmtp
+vnf
+Vnf
+vping
+vPing
+vrouter
+vRouter
+vyos
+wconsole
+wiki
+Workflow
+xrally
+xtesting
+yaml
diff --git a/docs/testing/developer/devguide/conf.py b/docs/testing/developer/devguide/conf.py
deleted file mode 100644
index 28255a69e..000000000
--- a/docs/testing/developer/devguide/conf.py
+++ /dev/null
@@ -1,185 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Functest Developer Guide documentation build configuration file, created by
-# sphinx-quickstart on Wed Apr 4 05:36:49 2018.
-#
-# This file is execfile()d with the current directory set to its
-# containing dir.
-#
-# Note that not all possible configuration values are present in this
-# autogenerated file.
-#
-# All configuration values have a default; values that are commented out
-# serve to show the default.
-
-# If extensions (or modules to document with autodoc) are in another directory,
-# add these directories to sys.path here. If the directory is relative to the
-# documentation root, use os.path.abspath to make it absolute, like shown here.
-#
-# import os
-# import sys
-# sys.path.insert(0, os.path.abspath('.'))
-import sphinx_opnfv_theme
-
-
-# -- General configuration ------------------------------------------------
-
-# If your documentation needs a minimal Sphinx version, state it here.
-#
-# needs_sphinx = '1.0'
-
-# Add any Sphinx extension module names here, as strings. They can be
-# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
-# ones.
-extensions = []
-
-# Add any paths that contain templates here, relative to this directory.
-templates_path = ['_templates']
-
-# The suffix(es) of source filenames.
-# You can specify multiple suffix as a list of string:
-#
-# source_suffix = ['.rst', '.md']
-source_suffix = '.rst'
-
-# The master toctree document.
-master_doc = 'index'
-
-# General information about the project.
-project = u'Functest Developer Guide'
-copyright = u'2018, Functest <opnfv-tech-discuss@lists.opnfv.org>'
-author = u'Functest <opnfv-tech-discuss@lists.opnfv.org>'
-
-# The version info for the project you're documenting, acts as replacement for
-# |version| and |release|, also used in various other places throughout the
-# built documents.
-#
-# The short X.Y version.
-version = u'master'
-# The full version, including alpha/beta/rc tags.
-release = u'master'
-
-# The language for content autogenerated by Sphinx. Refer to documentation
-# for a list of supported languages.
-#
-# This is also used if you do content translation via gettext catalogs.
-# Usually you set "language" from the command line for these cases.
-language = None
-
-# List of patterns, relative to source directory, that match files and
-# directories to ignore when looking for source files.
-# This patterns also effect to html_static_path and html_extra_path
-exclude_patterns = []
-
-# The name of the Pygments (syntax highlighting) style to use.
-pygments_style = 'sphinx'
-
-# If true, `todo` and `todoList` produce output, else they produce nothing.
-todo_include_todos = False
-
-
-# -- Options for HTML output ----------------------------------------------
-
-# The theme to use for HTML and HTML Help pages. See the documentation for
-# a list of builtin themes.
-#
-html_theme = 'opnfv'
-
-# Theme options are theme-specific and customize the look and feel of a theme
-# further. For a list of options available for each theme, see the
-# documentation.
-#
-# html_theme_options = {}
-html_theme_options = {
- 'bootswatch_theme': 'journal',
- 'navbar_sidebarrel': False,
- 'navbar_title': '',
-}
-
-# Add any paths that contain custom themes here, relative to this directory.
-# html_theme_path = []
-html_theme_path = sphinx_opnfv_theme.get_html_theme_path()
-
-# Add any paths that contain custom static files (such as style sheets) here,
-# relative to this directory. They are copied after the builtin static files,
-# so a file named "default.css" will overwrite the builtin "default.css".
-# html_static_path = []
-
-# Custom sidebar templates, must be a dictionary that maps document names
-# to template names.
-#
-# This is required for the alabaster theme
-# refs: http://alabaster.readthedocs.io/en/latest/installation.html#sidebars
-html_sidebars = {
- '**': [
- 'relations.html', # needs 'show_related': True theme option to display
- 'searchbox.html',
- ]
-}
-
-
-# -- Options for HTMLHelp output ------------------------------------------
-
-# Output file base name for HTML help builder.
-htmlhelp_basename = 'FunctestDeveloperGuidedoc'
-
-
-# -- Options for LaTeX output ---------------------------------------------
-
-latex_elements = {
- # The paper size ('letterpaper' or 'a4paper').
- #
- # 'papersize': 'letterpaper',
-
- # The font size ('10pt', '11pt' or '12pt').
- #
- # 'pointsize': '10pt',
-
- # Additional stuff for the LaTeX preamble.
- #
- # 'preamble': '',
-
- # Latex figure (float) alignment
- #
- # 'figure_align': 'htbp',
-}
-
-# Grouping the document tree into LaTeX files. List of tuples
-# (source start file, target name, title,
-# author, documentclass [howto, manual, or own class]).
-latex_documents = [
- (master_doc,
- 'FunctestDeveloperGuide.tex',
- u'Functest Developer Guide Documentation',
- u'Functest \\textless{}opnfv-tech-discuss@lists.opnfv.org\\textgreater{}',
- 'manual'),
-]
-
-
-# -- Options for manual page output ---------------------------------------
-
-# One entry per manual page. List of tuples
-# (source start file, name, description, authors, manual section).
-man_pages = [
- (master_doc,
- 'functestdeveloperguide',
- u'Functest Developer Guide Documentation',
- [author],
- 1)
-]
-
-
-# -- Options for Texinfo output -------------------------------------------
-
-# Grouping the document tree into Texinfo files. List of tuples
-# (source start file, target name, title, author,
-# dir menu entry, description, category)
-texinfo_documents = [
- (master_doc,
- 'FunctestDeveloperGuide',
- u'Functest Developer Guide Documentation',
- author,
- 'FunctestDeveloperGuide',
- 'One line description of project.',
- 'Miscellaneous'),
-]
diff --git a/docs/testing/developer/devguide/index.rst b/docs/testing/developer/devguide/index.rst
index d700ac1fe..da5485ef0 100644
--- a/docs/testing/developer/devguide/index.rst
+++ b/docs/testing/developer/devguide/index.rst
@@ -5,7 +5,6 @@ Functest Developer Guide
************************
.. toctree::
- :numbered:
:maxdepth: 2
============
@@ -53,10 +52,7 @@ to the different tiers:
* functest-core: https://hub.docker.com/r/opnfv/functest-core/
* functest-healthcheck: https://hub.docker.com/r/opnfv/functest-healthcheck/
* functest-smoke: https://hub.docker.com/r/opnfv/functest-smoke/
- * functest-features: https://hub.docker.com/r/opnfv/functest-features/
- * functest-components: https://hub.docker.com/r/opnfv/functest-components/
* functest-vnf: https://hub.docker.com/r/opnfv/functest-vnf/
- * functest-parser: https://hub.docker.com/r/opnfv/functest-parser/
* functest-restapi: https://hub.docker.com/r/opnfv/functest-restapi/
Standalone functest dockers are maintained for Euphrates but Alpine containers
@@ -83,16 +79,14 @@ Functest internal test cases
The internal test cases in Euphrates are:
- * api_check
* connection_check
- * snaps_health_check
* vping_ssh
* vping_userdata
* odl
* rally_full
* rally_sanity
- * tempest_smoke_serial
- * tempest_full_parallel
+ * tempest_smoke
+ * tempest_full
* cloudify_ims
By internal, we mean that this particular test cases have been developed and/or
@@ -107,50 +101,12 @@ The main internal test cases are in the opnfv_tests subfolder of the
repository, the internal test cases can be grouped by domain:
* sdn: odl, odl_fds
- * openstack: api_check, connection_check, snaps_health_check, vping_ssh,
- vping_userdata, tempest_*, rally_*
+ * openstack: connection_check, vping_ssh, vping_userdata, tempest_*, rally_*
* vnf: cloudify_ims
If you want to create a new test case you will have to create a new folder
under the testcases directory (See next section for details).
-Functest external test cases
-============================
-The external test cases are inherited from other OPNFV projects, especially the
-feature projects.
-
-The external test cases are:
-
- * barometer
- * bgpvpn
- * doctor
- * domino
- * fds
- * parser
- * promise
- * refstack_defcore
- * snaps_smoke
- * functest-odl-sfc
- * orchestra_clearwaterims
- * orchestra_openims
- * vyos_vrouter
- * juju_vepc
-
-External test cases integrated in previous versions but not released in
-Euphrates:
-
- * copper
- * moon
- * netready
- * security_scan
-
-
-The code to run these test cases is hosted in the repository of the project.
-Please note that orchestra test cases are hosted in Functest repository and not
-in orchestra repository. Vyos_vrouter and juju_vepc code is also hosted in
-functest as there are no dedicated projects.
-
-
Functest framework
==================
@@ -170,8 +126,8 @@ The definition of the tiers has been agreed by the testing working group.
The tiers are:
* healthcheck
* smoke
+ * benchmarking
* features
- * components
* vnf
Functest abstraction classes
@@ -213,35 +169,6 @@ Feature, unit and vnf_base inherit from testcase::
+--------------------+ +---------+ +------------------------+ +-----------------+
-Testcase
---------
-.. raw:: html
- :url: http://artifacts.opnfv.org/functest/docs/apidoc/functest.core.testcase.html
-
-Feature
--------
-.. raw:: html
- :url: http://artifacts.opnfv.org/functest/docs/apidoc/functest.core.feature.html
-
-Unit
-----
-.. raw:: html
- :url: http://artifacts.opnfv.org/functest/docs/apidoc/functest.core.unit.html
-
-VNF
----
-.. raw:: html
- :url: http://artifacts.opnfv.org/functest/docs/apidoc/functest.core.vnf.html
-
-Robotframework
---------------
-.. raw:: html
- :url: http://artifacts.opnfv.org/functest/docs/apidoc/functest.core.robotframework.html
-
-
-see `[5]`_ to get code samples
-
-
Functest util classes
=====================
@@ -261,14 +188,11 @@ as follows::
|-- openstack_tacker.py
`-- openstack_utils.py
-It is recommended to use the SNAPS-OO library for deploying OpenStack
-instances. SNAPS `[4]`_ is an OPNFV project providing OpenStack utils.
-
TestAPI
=======
Functest is using the Test collection framework and the TestAPI developed by
-the OPNFV community. See `[6]`_ for details.
+the OPNFV community. See `[4]`_ for details.
Reporting
@@ -280,17 +204,10 @@ jinja2 templates `[3]`_.
Dashboard
=========
-Additional dashboarding is managed at the testing group level, see `[7]`_ for
+Additional dashboarding is managed at the testing group level, see `[5]`_ for
details.
-=======
-How TOs
-=======
-
-See How to section on Functest wiki `[8]`_
-
-
==========
References
==========
@@ -299,16 +216,10 @@ _`[1]`: http://artifacts.opnfv.org/functest/docs/configguide/index.html Functest
_`[2]`: http://artifacts.opnfv.org/functest/docs/userguide/index.html functest user guide
-_`[3]`: https://git.opnfv.org/cgit/releng/tree/utils/test/reporting
-
-_`[4]`: https://git.opnfv.org/snaps/
-
-_`[5]` : http://testresults.opnfv.org/functest/framework/index.html
-
-_`[6]`: http://docs.opnfv.org/en/latest/testing/testing-dev.html
+_`[3]`: https://github.com/opnfv/releng-testresults/tree/master/reporting
-_`[7]`: https://opnfv.biterg.io/goto/283dba93ca18e95964f852c63af1d1ba
+_`[4]`: https://wiki.opnfv.org/display/functest/2017+Beijing?preview=%2F11699623%2F11700523%2FTestAPI+-+test+results+collection+service.pptx
-_`[8]`: https://wiki.opnfv.org/pages/viewpage.action?pageId=7768932
+_`[5]`: https://lfanalytics.io/projects/lfn%2Fopnfv/dashboard
IRC support chan: #opnfv-functest
diff --git a/docs/testing/developer/internship/security_group/conf.py b/docs/testing/developer/internship/security_group/conf.py
deleted file mode 100644
index 46080c6d6..000000000
--- a/docs/testing/developer/internship/security_group/conf.py
+++ /dev/null
@@ -1,185 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Functest Security group test cases documentation build configuration file,
-# created by sphinx-quickstart on Wed Apr 4 05:56:19 2018.
-#
-# This file is execfile()d with the current directory set to its
-# containing dir.
-#
-# Note that not all possible configuration values are present in this
-# autogenerated file.
-#
-# All configuration values have a default; values that are commented out
-# serve to show the default.
-
-# If extensions (or modules to document with autodoc) are in another directory,
-# add these directories to sys.path here. If the directory is relative to the
-# documentation root, use os.path.abspath to make it absolute, like shown here.
-#
-# import os
-# import sys
-# sys.path.insert(0, os.path.abspath('.'))
-import sphinx_opnfv_theme
-
-
-# -- General configuration ------------------------------------------------
-
-# If your documentation needs a minimal Sphinx version, state it here.
-#
-# needs_sphinx = '1.0'
-
-# Add any Sphinx extension module names here, as strings. They can be
-# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
-# ones.
-extensions = []
-
-# Add any paths that contain templates here, relative to this directory.
-templates_path = ['_templates']
-
-# The suffix(es) of source filenames.
-# You can specify multiple suffix as a list of string:
-#
-# source_suffix = ['.rst', '.md']
-source_suffix = '.rst'
-
-# The master toctree document.
-master_doc = 'index'
-
-# General information about the project.
-project = u'Functest Security group test cases'
-copyright = u'2018, Functest <opnfv-tech-discuss@lists.opnfv.org>'
-author = u'Functest <opnfv-tech-discuss@lists.opnfv.org>'
-
-# The version info for the project you're documenting, acts as replacement for
-# |version| and |release|, also used in various other places throughout the
-# built documents.
-#
-# The short X.Y version.
-version = u'master'
-# The full version, including alpha/beta/rc tags.
-release = u'master'
-
-# The language for content autogenerated by Sphinx. Refer to documentation
-# for a list of supported languages.
-#
-# This is also used if you do content translation via gettext catalogs.
-# Usually you set "language" from the command line for these cases.
-language = None
-
-# List of patterns, relative to source directory, that match files and
-# directories to ignore when looking for source files.
-# This patterns also effect to html_static_path and html_extra_path
-exclude_patterns = []
-
-# The name of the Pygments (syntax highlighting) style to use.
-pygments_style = 'sphinx'
-
-# If true, `todo` and `todoList` produce output, else they produce nothing.
-todo_include_todos = False
-
-
-# -- Options for HTML output ----------------------------------------------
-
-# The theme to use for HTML and HTML Help pages. See the documentation for
-# a list of builtin themes.
-#
-html_theme = 'opnfv'
-
-# Theme options are theme-specific and customize the look and feel of a theme
-# further. For a list of options available for each theme, see the
-# documentation.
-#
-# html_theme_options = {}
-html_theme_options = {
- 'bootswatch_theme': 'journal',
- 'navbar_sidebarrel': False,
- 'navbar_title': '',
-}
-
-# Add any paths that contain custom themes here, relative to this directory.
-# html_theme_path = []
-html_theme_path = sphinx_opnfv_theme.get_html_theme_path()
-
-# Add any paths that contain custom static files (such as style sheets) here,
-# relative to this directory. They are copied after the builtin static files,
-# so a file named "default.css" will overwrite the builtin "default.css".
-# html_static_path = []
-
-# Custom sidebar templates, must be a dictionary that maps document names
-# to template names.
-#
-# This is required for the alabaster theme
-# refs: http://alabaster.readthedocs.io/en/latest/installation.html#sidebars
-html_sidebars = {
- '**': [
- 'relations.html', # needs 'show_related': True theme option to display
- 'searchbox.html',
- ]
-}
-
-
-# -- Options for HTMLHelp output ------------------------------------------
-
-# Output file base name for HTML help builder.
-htmlhelp_basename = 'FunctestSecuritygrouptestcasesdoc'
-
-
-# -- Options for LaTeX output ---------------------------------------------
-
-latex_elements = {
- # The paper size ('letterpaper' or 'a4paper').
- #
- # 'papersize': 'letterpaper',
-
- # The font size ('10pt', '11pt' or '12pt').
- #
- # 'pointsize': '10pt',
-
- # Additional stuff for the LaTeX preamble.
- #
- # 'preamble': '',
-
- # Latex figure (float) alignment
- #
- # 'figure_align': 'htbp',
-}
-
-# Grouping the document tree into LaTeX files. List of tuples
-# (source start file, target name, title,
-# author, documentclass [howto, manual, or own class]).
-latex_documents = [
- (master_doc,
- 'FunctestSecuritygrouptestcases.tex',
- u'Functest Security group test cases Documentation',
- u'Functest \\textless{}opnfv-tech-discuss@lists.opnfv.org\\textgreater{}',
- 'manual'),
-]
-
-
-# -- Options for manual page output ---------------------------------------
-
-# One entry per manual page. List of tuples
-# (source start file, name, description, authors, manual section).
-man_pages = [
- (master_doc,
- 'functestsecuritygrouptestcases',
- u'Functest Security group test cases Documentation',
- [author],
- 1)
-]
-
-
-# -- Options for Texinfo output -------------------------------------------
-
-# Grouping the document tree into Texinfo files. List of tuples
-# (source start file, target name, title, author,
-# dir menu entry, description, category)
-texinfo_documents = [
- (master_doc,
- 'FunctestSecuritygrouptestcases',
- u'Functest Security group test cases Documentation',
- author,
- 'FunctestSecuritygrouptestcases',
- 'One line description of project.',
- 'Miscellaneous'),
-]
diff --git a/docs/testing/developer/internship/security_group/index.rst b/docs/testing/developer/internship/security_group/index.rst
deleted file mode 100644
index 87bcd90e5..000000000
--- a/docs/testing/developer/internship/security_group/index.rst
+++ /dev/null
@@ -1,62 +0,0 @@
-.. SPDX-License-Identifier: CC-BY-4.0
-
-==================================
-Functest Security group test cases
-==================================
-
-Author: Girish Sukhatankar
-mentors: D.Blaisonneau, J.Lausuch, M.Richomme
-
-Abstract
-========
-
-
-Version history
-===============
-
-+------------+----------+------------------+------------------------+
-| **Date** | **Ver.** | **Author** | **Comment** |
-| | | | |
-+------------+----------+------------------+------------------------+
-| 2016-??-?? | 0.0.1 | Morgan Richomme | Beginning of the |
-| | | (Orange) | Internship |
-+------------+----------+------------------+------------------------+
-
-
-Overview:
-=========
-
-
-
-
-Problem Statement:
-------------------
-
-
-
-Curation Phase
---------------
-
-
-
-
-
-Schedule:
-=========
-
-
-
-+--------------------------+------------------------------------------+
-| **Date** | **Comment** |
-| | |
-+--------------------------+------------------------------------------+
-| December - January | '........' |
-+--------------------------+------------------------------------------+
-| January - february | '........' |
-+--------------------------+------------------------------------------+
-
-
-References:
-===========
-
-.. _`[1]` : https://wiki.opnfv.org/display/DEV/Intern+Project%3A+Security+groups+test+case+in+Functest
diff --git a/docs/testing/developer/internship/testapi_evolution/index.rst b/docs/testing/developer/internship/testapi_evolution/index.rst
deleted file mode 100644
index d2704de53..000000000
--- a/docs/testing/developer/internship/testapi_evolution/index.rst
+++ /dev/null
@@ -1,230 +0,0 @@
-.. SPDX-License-Identifier: CC-BY-4.0
-
-=================
-TestAPI evolution
-=================
-
-Author: Sakala Venkata Krishna Rohit
-Mentors: S. Feng, J.Lausuch, M.Richomme
-
-Abstract
-========
-
-The TestAPI is used by all the test opnfv projects to report results.
-It is also used to declare projects, test cases and labs. A major refactoring
-has been done in Colorado with the introduction of swagger. The TestAPI is defined in Functest
-developer guide. The purpose of this project is to add more features to the TestAPI that automate
-the tasks that are done manually now, though there are tasks other than automation.
-
-Version history
-===============
-
-+------------+----------+------------------+------------------------+
-| **Date** | **Ver.** | **Author** | **Comment** |
-| | | | |
-+------------+----------+------------------+------------------------+
-| 2016-11-14 | 0.0.1 | Morgan Richomme | Beginning of the |
-| | | (Orange) | Internship |
-+------------+----------+------------------+------------------------+
-| 2017-02-17 | 0.0.2 | S.V.K Rohit | End of the Internship |
-| | | (IIIT Hyderabad) | |
-+------------+----------+------------------+------------------------+
-
-Overview:
-=========
-
-The internhip time period was from Nov 14th to Feb 17th. The project prosposal page is here `[1]`_.
-The intern project was assigned to Svk Rohit and was mentored by S. Feng, J.Lausuch, M.Richomme.
-The link to the patches submitted is `[2]`_. The internship was successfully completed and the
-documentation is as follows.
-
-Problem Statement:
-------------------
-
-The problem statement could be divided into pending features that needed to be added into TestAPI
-repo. The following were to be accomplished within the internship time frame.
-
-* **Add verification jenkins job for the TestAPI code**
- The purpose of this job is to verify whehter the unit tests are successful or not with the
- inclusion of the patchset submitted.
-
-* **Automatic update of opnfv/testapi docker image**
- The docker image of TestAPI is hosted in the opnfv docker hub. To ensure that the TestAPI image
- is always updated with the repository, automatic updation of the image is necessary and a job
- is triggered whenever a new patch gets merged.
-
-* **Automation deployment of testresults.opnfv.org/test/ website**
- In the same manner as the docker image of TestAPI is updated, the TestAPI website needs to be
- in sync with the repository code. So, a job has been added to the opnfv jenkins ci for the
- updation of the testresults website.
-
-* **Generate static documentation of TestAPI calls**
- The purpose of this is to give an static/offline view of TestAPI. If someone wants to have a
- look at the Restful APIs of TestAPI, he/she does't need to go to the website, he can download
- a html page and view it anytime.
-
-* **Backup MongoDB of TestAPI**
- The mongoDB needs to be backed up every week. Till now it was done manually, but due to this
- internship, it is now automated using a jenkins job.
-
-* **Add token based authorization to the TestAPI calls**
- The token based authorization was implemented to ensure that only ci_pods could access the
- database. Authentication has been added to only delete/put/post requests.
-
-Curation Phase:
----------------
-
-The curation phase was the first 3 to 4 weeks of the internship. This phase was to get familiar
-with the TestAPI code and functionality and propose the solutions/tools for the tasks mentioned
-above. Swagger codegen was choosen out of the four tools proposed `[3]`_ for generating static
-documentaion.
-
-Also, specific amount of time was spent on the script flow of the jenkins jobs. The automatic
-deployment task involves accessing a remote server from inside the jenkins build. The deployment
-had to be done only after the docker image update is done. For these constraints to satisfy, a
-multijob jenkins job was choosen instead of a freestyle job.
-
-Important Links:
-----------------
-
-* MongoDB Backup Link - `[4]`_
-* Static Documentation - `[5]`_
-* TestAPI Token addition to ci_pods - `[6]`_
-
-Schedule:
-=========
-
-The progress and completion of the tasks is described in the below table.
-
-+--------------------------+------------------------------------------+
-| **Date** | **Comment** |
-| | |
-+--------------------------+------------------------------------------+
-| Nov 14th - Dec 31st | Understand TestAPI code and the |
-| | requirements. |
-+--------------------------+------------------------------------------+
-| Jan 1st - Jan 7th | Add jenkins job to create static |
-| | documentation and write build scripts. |
-+--------------------------+------------------------------------------+
-| Jan 8th - Jan 21st | Add verification jenkins job for unit |
-| | tests. |
-+--------------------------+------------------------------------------+
-| Jan 22nd - Jan 28th | Add jenkins job for mongodb backup |
-| | |
-+--------------------------+------------------------------------------+
-| Jan 29th - Feb 11th | Enable automatic deployment of |
-| | testresults.opnfv.org/test/ |
-+--------------------------+------------------------------------------+
-| Feb 12th - Feb 17th | Add token based authentication |
-| | |
-+--------------------------+------------------------------------------+
-
-FAQ's
-=====
-
-This section lists the problems that I have faced and the understanding that I have acquired during
-the internship. This section may help other developers in solving any errors casused because of the
-code written as a part of this internship.
-
-
-TestAPI
--------
-
-What is the difference between defining data_file as "/etc/.." and "etc/.." in setup.cfg ?
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-If in the setup.cfg, it is defined as
-
-[files]
-data_files =
-etc/a.conf = etc/a.conf.sample
-
-then it ends up installed in the /usr/etc/. With this configuration, it would be installed
-correctly within a venv. but when it is defined as
-
-[files]
-data_files =
-/etc/a.conf = etc/a.conf.sample
-
-then it ends up installed on the root of the filesystem instead of properly be installed within the
-venv.
-
-Which attribute does swagger-codegen uses as the title in the generation of document generation ?
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-It uses the nickname of the api call in swagger as the title in the generation of the document
-generation.
-
-Does swagger-codegen take more than one yaml file as input ?
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-No, swagger-codegen only takes one yaml file as input to its jar file. If there more than one yaml
-file, one needs to merge them and give it as an input keeping mind the swagger specs.
-
-
-Jenkins & JJB
--------------
-
-Which scm macro is used for verification jenkins jobs ?
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-There are two macros for scm one is git-scm and other git-scm-gerrit. git-scm-gerrit is used for
-verification jenkins job.
-
-Does the virtualenv created in one build script exists in other build scripts too ?
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-No, the virtualenv created in one build script only exists in that build script/shell.
-
-What parameters are needed for the scm macros ?
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-Project and Branch are the two parameters needed for scm macros.
-
-What is the directory inside the jenkins build ?
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-The directory of the jenkins build is the directory of the repo. `ls $WORKSPACE` command will give
-you all the contents of the directory.
-
-How to include a bash script in jenkins job yaml file ?
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-An example might be apt here as an answer.
-
-builders:
- - shell:
- !include-raw: include-raw001-hello-world.sh
-
-
-How do you make a build server run on a specific machine ?
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-It can be done by defining a label parameter 'SLAVE_LABEL' or in OPNFV , there are macros for each
-server, one can use those parameter macros.
-Ex: opnfv-build-defaults. Note, if we use macro, then no need to define GIT_BASE, but if one uses
-SLAVE_LABEL, one needs to define a parameter GIT_BASE. This is because macro already has GIT_BASE
-defined.
-
-What job style should be used when there is a situation like one build should trigger other builds
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-or when different build scripts need to be run on different machines ?
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-MultiJob style should be used as it has phases where each phase can be taken as a build scipt and
-can have its own parameters by which one can define the SLAVE_LABEL parameter.
-
-References:
-===========
-
-_`[1]` : https://wiki.opnfv.org/display/DEV/Intern+Project%3A+testapi+evolution
-
-_`[2]` : https://gerrit.opnfv.org/gerrit/#/q/status:merged+owner:%22Rohit+Sakala+%253Crohitsakala%2540gmail.com%253E%22
-
-_`[3]` : https://docs.google.com/document/d/1jWwVZ1ZpKgKcOS_zSz2KzX1nwg4BXxzBxcwkesl7krw/edit?usp=sharing
-
-_`[4]` : http://artifacts.opnfv.org/testapibackup.html
-
-_`[5]` : http://artifacts.opnfv.org/releng/docs/testapi.html
-
-_`[6]` : http://artifacts.opnfv.org/functest/docs/devguide/index.html#test-api-authorization
diff --git a/docs/testing/developer/internship/unit_tests/conf.py b/docs/testing/developer/internship/unit_tests/conf.py
deleted file mode 100644
index 00dec3c82..000000000
--- a/docs/testing/developer/internship/unit_tests/conf.py
+++ /dev/null
@@ -1,185 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Functest Unit tests documentation build configuration file, created by
-# sphinx-quickstart on Wed Apr 4 06:04:23 2018.
-#
-# This file is execfile()d with the current directory set to its
-# containing dir.
-#
-# Note that not all possible configuration values are present in this
-# autogenerated file.
-#
-# All configuration values have a default; values that are commented out
-# serve to show the default.
-
-# If extensions (or modules to document with autodoc) are in another directory,
-# add these directories to sys.path here. If the directory is relative to the
-# documentation root, use os.path.abspath to make it absolute, like shown here.
-#
-# import os
-# import sys
-# sys.path.insert(0, os.path.abspath('.'))
-import sphinx_opnfv_theme
-
-
-# -- General configuration ------------------------------------------------
-
-# If your documentation needs a minimal Sphinx version, state it here.
-#
-# needs_sphinx = '1.0'
-
-# Add any Sphinx extension module names here, as strings. They can be
-# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
-# ones.
-extensions = []
-
-# Add any paths that contain templates here, relative to this directory.
-templates_path = ['_templates']
-
-# The suffix(es) of source filenames.
-# You can specify multiple suffix as a list of string:
-#
-# source_suffix = ['.rst', '.md']
-source_suffix = '.rst'
-
-# The master toctree document.
-master_doc = 'index'
-
-# General information about the project.
-project = u'Functest Unit tests'
-copyright = u'2018, Functest <opnfv-tech-discuss@lists.opnfv.org>'
-author = u'Functest <opnfv-tech-discuss@lists.opnfv.org>'
-
-# The version info for the project you're documenting, acts as replacement for
-# |version| and |release|, also used in various other places throughout the
-# built documents.
-#
-# The short X.Y version.
-version = u'master'
-# The full version, including alpha/beta/rc tags.
-release = u'master'
-
-# The language for content autogenerated by Sphinx. Refer to documentation
-# for a list of supported languages.
-#
-# This is also used if you do content translation via gettext catalogs.
-# Usually you set "language" from the command line for these cases.
-language = None
-
-# List of patterns, relative to source directory, that match files and
-# directories to ignore when looking for source files.
-# This patterns also effect to html_static_path and html_extra_path
-exclude_patterns = []
-
-# The name of the Pygments (syntax highlighting) style to use.
-pygments_style = 'sphinx'
-
-# If true, `todo` and `todoList` produce output, else they produce nothing.
-todo_include_todos = False
-
-
-# -- Options for HTML output ----------------------------------------------
-
-# The theme to use for HTML and HTML Help pages. See the documentation for
-# a list of builtin themes.
-#
-html_theme = 'opnfv'
-
-# Theme options are theme-specific and customize the look and feel of a theme
-# further. For a list of options available for each theme, see the
-# documentation.
-#
-# html_theme_options = {}
-html_theme_options = {
- 'bootswatch_theme': 'journal',
- 'navbar_sidebarrel': False,
- 'navbar_title': '',
-}
-
-# Add any paths that contain custom themes here, relative to this directory.
-# html_theme_path = []
-html_theme_path = sphinx_opnfv_theme.get_html_theme_path()
-
-# Add any paths that contain custom static files (such as style sheets) here,
-# relative to this directory. They are copied after the builtin static files,
-# so a file named "default.css" will overwrite the builtin "default.css".
-# html_static_path = []
-
-# Custom sidebar templates, must be a dictionary that maps document names
-# to template names.
-#
-# This is required for the alabaster theme
-# refs: http://alabaster.readthedocs.io/en/latest/installation.html#sidebars
-html_sidebars = {
- '**': [
- 'relations.html', # needs 'show_related': True theme option to display
- 'searchbox.html',
- ]
-}
-
-
-# -- Options for HTMLHelp output ------------------------------------------
-
-# Output file base name for HTML help builder.
-htmlhelp_basename = 'FunctestUnittestsdoc'
-
-
-# -- Options for LaTeX output ---------------------------------------------
-
-latex_elements = {
- # The paper size ('letterpaper' or 'a4paper').
- #
- # 'papersize': 'letterpaper',
-
- # The font size ('10pt', '11pt' or '12pt').
- #
- # 'pointsize': '10pt',
-
- # Additional stuff for the LaTeX preamble.
- #
- # 'preamble': '',
-
- # Latex figure (float) alignment
- #
- # 'figure_align': 'htbp',
-}
-
-# Grouping the document tree into LaTeX files. List of tuples
-# (source start file, target name, title,
-# author, documentclass [howto, manual, or own class]).
-latex_documents = [
- (master_doc,
- 'FunctestUnittests.tex',
- u'Functest Unit tests Documentation',
- u'Functest \\textless{}opnfv-tech-discuss@lists.opnfv.org\\textgreater{}',
- 'manual'),
-]
-
-
-# -- Options for manual page output ---------------------------------------
-
-# One entry per manual page. List of tuples
-# (source start file, name, description, authors, manual section).
-man_pages = [
- (master_doc,
- 'functestunittests',
- u'Functest Unit tests Documentation',
- [author],
- 1)
-]
-
-
-# -- Options for Texinfo output -------------------------------------------
-
-# Grouping the document tree into Texinfo files. List of tuples
-# (source start file, target name, title, author,
-# dir menu entry, description, category)
-texinfo_documents = [
- (master_doc,
- 'FunctestUnittests',
- u'Functest Unit tests Documentation',
- author,
- 'FunctestUnittests',
- 'One line description of project.',
- 'Miscellaneous'),
-]
diff --git a/docs/testing/developer/internship/unit_tests/index.rst b/docs/testing/developer/internship/unit_tests/index.rst
deleted file mode 100644
index f79e9e296..000000000
--- a/docs/testing/developer/internship/unit_tests/index.rst
+++ /dev/null
@@ -1,123 +0,0 @@
-.. SPDX-License-Identifier: CC-BY-4.0
-
-===================
-Functest Unit tests
-===================
-
-Author: Ashish Kumar
-Mentors: H.Yao, J.Lausuch, M.Richomme
-
-Abstract
-========
-
-
-Version history
-===============
-
-+------------+----------+------------------+------------------------+
-| **Date** | **Ver.** | **Author** | **Comment** |
-| | | | |
-+------------+----------+------------------+------------------------+
-| 2016-11-14 | 0.0.1 | Morgan Richomme | Beginning of the |
-| | | (Orange) | Internship |
-+------------+----------+------------------+------------------------+
-| 2017-03-31 | 0.0.2 | Ashish Kumar | During the |
-| | | (IIIT Hyderabad) | Internship |
-+------------+----------+------------------+------------------------+
-
-
-Overview:
-=========
-Functest project is developing and integrating functional test cases for OPNFV
-and it is part of OPNFV since the beginning. Functest develops its own
-testcases and framework. This framework includes several utility libraries. The
-Project is growing rapidly with more features, tests added as per requirement.
-It becomes the responsibility of every developer to maintain the integrity of
-code i.e. new patch should not break the previous functionality of the project.
-To automate this process of software development, we should write unit tests
-and add them to CI so that when a new patch is ready to merge, we shouldn't
-allow those which are breaking previous unit tests or decreasing the coverage.
-
-
-
-Problem Statement:
-------------------
-The goal of the intership consists in creating unit test suites on Functest
-code with good code coverage (>80%) and integrate it in continuous integration
-in order to consolidate existing code.
-
-
-Curation Phase
---------------
-The curation phase was the first 3 to 4 weeks of the internship. This phase was
-to get familiar with the functest code and functionality and explore the
-solutions for unit testing in other projects and come up with the strategy for
-writing unit tests in functest.
-
-In this phase we decided,
-
- - Coverage should be 80%. There are some functions like __init__, getter,
- setter and other private methods for which writing unit test is a tedious
- job, so we are leaving these methods for now.
- - Do method wise testing for every module.
- - Use mock for external or third party services, system calls and other
- external library calls which could impact the behaviour of system during the
- run of unit test.
- - Add it in jenkins as passing criteria for patches.
- - Write tests in modular way so that it can help to serve as a form of
- documentation.
-
-
-
-Schedule:
-=========
-+--------------------------+------------------------------------------+
-| **Date** | **Comment** |
-| | |
-+--------------------------+------------------------------------------+
-| Nov 14th - Nov 28th | 1. Learn Functest Project Business |
-| | 2. Set up the development environment |
-| | 3. Run Functest code |
-+--------------------------+------------------------------------------+
-| Nov 28th - Dec.9th | 1. Explore Unit Testing Strategy, |
-| | 2. Learn about Mock in python |
-+--------------------------+------------------------------------------+
-| Dec 12th - Dec 23rd | Implement Unit Tests for CLI |
-| | |
-+--------------------------+------------------------------------------+
-| Dec 26th - Jan 6th | Implement Unit Tests for Utils |
-| | |
-+--------------------------+------------------------------------------+
-| Jan 9th - Jan 20th | Implement Unit Tests for CI |
-| | |
-+--------------------------+------------------------------------------+
-| Jan 23rd - Feb 3rd | Implement Unit Tests for Core |
-| | |
-+--------------------------+------------------------------------------+
-| Feb 6th - Feb 17th | Implement Unit Tests for |
-| | opnfv_tests/openstack/tempest |
-+--------------------------+------------------------------------------+
-| Feb 20th - Mar 3rd | Implement Unit Tests for |
-| | opnfv_tests/openstack/rally |
-+--------------------------+------------------------------------------+
-| Mar 6th - Mar 17th | Implement Unit Tests for |
-| | opnfv_tests/vnf/ims |
-+--------------------------+------------------------------------------+
-| Mar 20th - Mar 31st | Recheck and Increase Coverage for all |
-| | modules > 80% |
-+--------------------------+------------------------------------------+
-| Apr 3rd - Apr 14th | Add CI Gating for unit tests |
-| | |
-+--------------------------+------------------------------------------+
-| Apr 17th - Apr 28th | Use Tox Utility, Documentation |
-| | |
-+--------------------------+------------------------------------------+
-| Apr 28th - End | Bug Fixing |
-| | |
-+--------------------------+------------------------------------------+
-
-
-References:
-===========
-
-.. _`[1]` : https://wiki.opnfv.org/display/DEV/Intern+Project%3A+Functest+unit+tests
diff --git a/docs/testing/developer/internship/vnf_catalog/conf.py b/docs/testing/developer/internship/vnf_catalog/conf.py
deleted file mode 100644
index de8336225..000000000
--- a/docs/testing/developer/internship/vnf_catalog/conf.py
+++ /dev/null
@@ -1,185 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Open Source VNF Catalog documentation build configuration file, created by
-# sphinx-quickstart on Wed Apr 4 06:07:56 2018.
-#
-# This file is execfile()d with the current directory set to its
-# containing dir.
-#
-# Note that not all possible configuration values are present in this
-# autogenerated file.
-#
-# All configuration values have a default; values that are commented out
-# serve to show the default.
-
-# If extensions (or modules to document with autodoc) are in another directory,
-# add these directories to sys.path here. If the directory is relative to the
-# documentation root, use os.path.abspath to make it absolute, like shown here.
-#
-# import os
-# import sys
-# sys.path.insert(0, os.path.abspath('.'))
-import sphinx_opnfv_theme
-
-
-# -- General configuration ------------------------------------------------
-
-# If your documentation needs a minimal Sphinx version, state it here.
-#
-# needs_sphinx = '1.0'
-
-# Add any Sphinx extension module names here, as strings. They can be
-# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
-# ones.
-extensions = []
-
-# Add any paths that contain templates here, relative to this directory.
-templates_path = ['_templates']
-
-# The suffix(es) of source filenames.
-# You can specify multiple suffix as a list of string:
-#
-# source_suffix = ['.rst', '.md']
-source_suffix = '.rst'
-
-# The master toctree document.
-master_doc = 'index'
-
-# General information about the project.
-project = u'Open Source VNF Catalog'
-copyright = u'2018, Functest <opnfv-tech-discuss@lists.opnfv.org>'
-author = u'Functest <opnfv-tech-discuss@lists.opnfv.org>'
-
-# The version info for the project you're documenting, acts as replacement for
-# |version| and |release|, also used in various other places throughout the
-# built documents.
-#
-# The short X.Y version.
-version = u'master'
-# The full version, including alpha/beta/rc tags.
-release = u'master'
-
-# The language for content autogenerated by Sphinx. Refer to documentation
-# for a list of supported languages.
-#
-# This is also used if you do content translation via gettext catalogs.
-# Usually you set "language" from the command line for these cases.
-language = None
-
-# List of patterns, relative to source directory, that match files and
-# directories to ignore when looking for source files.
-# This patterns also effect to html_static_path and html_extra_path
-exclude_patterns = []
-
-# The name of the Pygments (syntax highlighting) style to use.
-pygments_style = 'sphinx'
-
-# If true, `todo` and `todoList` produce output, else they produce nothing.
-todo_include_todos = False
-
-
-# -- Options for HTML output ----------------------------------------------
-
-# The theme to use for HTML and HTML Help pages. See the documentation for
-# a list of builtin themes.
-#
-html_theme = 'opnfv'
-
-# Theme options are theme-specific and customize the look and feel of a theme
-# further. For a list of options available for each theme, see the
-# documentation.
-#
-# html_theme_options = {}
-html_theme_options = {
- 'bootswatch_theme': 'journal',
- 'navbar_sidebarrel': False,
- 'navbar_title': '',
-}
-
-# Add any paths that contain custom themes here, relative to this directory.
-# html_theme_path = []
-html_theme_path = sphinx_opnfv_theme.get_html_theme_path()
-
-# Add any paths that contain custom static files (such as style sheets) here,
-# relative to this directory. They are copied after the builtin static files,
-# so a file named "default.css" will overwrite the builtin "default.css".
-# html_static_path = []
-
-# Custom sidebar templates, must be a dictionary that maps document names
-# to template names.
-#
-# This is required for the alabaster theme
-# refs: http://alabaster.readthedocs.io/en/latest/installation.html#sidebars
-html_sidebars = {
- '**': [
- 'relations.html', # needs 'show_related': True theme option to display
- 'searchbox.html',
- ]
-}
-
-
-# -- Options for HTMLHelp output ------------------------------------------
-
-# Output file base name for HTML help builder.
-htmlhelp_basename = 'OpenSourceVNFCatalogdoc'
-
-
-# -- Options for LaTeX output ---------------------------------------------
-
-latex_elements = {
- # The paper size ('letterpaper' or 'a4paper').
- #
- # 'papersize': 'letterpaper',
-
- # The font size ('10pt', '11pt' or '12pt').
- #
- # 'pointsize': '10pt',
-
- # Additional stuff for the LaTeX preamble.
- #
- # 'preamble': '',
-
- # Latex figure (float) alignment
- #
- # 'figure_align': 'htbp',
-}
-
-# Grouping the document tree into LaTeX files. List of tuples
-# (source start file, target name, title,
-# author, documentclass [howto, manual, or own class]).
-latex_documents = [
- (master_doc,
- 'OpenSourceVNFCatalog.tex',
- u'Open Source VNF Catalog Documentation',
- u'Functest \\textless{}opnfv-tech-discuss@lists.opnfv.org\\textgreater{}',
- 'manual'),
-]
-
-
-# -- Options for manual page output ---------------------------------------
-
-# One entry per manual page. List of tuples
-# (source start file, name, description, authors, manual section).
-man_pages = [
- (master_doc,
- 'opensourcevnfcatalog',
- u'Open Source VNF Catalog Documentation',
- [author],
- 1)
-]
-
-
-# -- Options for Texinfo output -------------------------------------------
-
-# Grouping the document tree into Texinfo files. List of tuples
-# (source start file, target name, title, author,
-# dir menu entry, description, category)
-texinfo_documents = [
- (master_doc,
- 'OpenSourceVNFCatalog',
- u'Open Source VNF Catalog Documentation',
- author,
- 'OpenSourceVNFCatalog',
- 'One line description of project.',
- 'Miscellaneous'),
-]
diff --git a/docs/testing/developer/internship/vnf_catalog/index.rst b/docs/testing/developer/internship/vnf_catalog/index.rst
deleted file mode 100644
index 634b728bd..000000000
--- a/docs/testing/developer/internship/vnf_catalog/index.rst
+++ /dev/null
@@ -1,160 +0,0 @@
-.. SPDX-License-Identifier: CC-BY-4.0
-
-=======================
-Open Source VNF Catalog
-=======================
-
-Author: Kumar Rishabh
-Mentors: B.Souville, M.Richomme, J.Lausuch
-
-Abstract
-========
-
-
-
-Version hissory
-===============
-
-+------------+----------+------------------+------------------------+
-| **Date** | **Ver.** | **Author** | **Comment** |
-| | | | |
-+------------+----------+------------------+------------------------+
-| 2016-12-12 | 0.0.1 | Morgan Richomme | Beginning of the |
-| | | (Orange) | Internship |
-+------------+----------+------------------+------------------------+
-
-
-Overview:
-=========
-
-
-This project aims to create an Open Source catalog for reference and
-classification of Virtual Network Functions (VNFs)s available on
-Internet. The classification method proposed will be in sync with the
-requirements of Telcos active in NFV landscape. The project aims to have
-running web platform similar to [1] by the mid of internship (2nd week
-of March). By the penultimate month of internship I aim to have fully
-functional implementation of an Open Source VNF in functest.
-
-
-Problem Statement:
-------------------
-
-OPNFV aims to be the reference platform for development,
-standardization and integration of Open Source NFV components across
-various Open Source Platforms. It mainly deals with the infrastructure
-through the Network Function Virtualization Infrastructure (NFVI) and
-Virtual Infrastructure manager (VIM). The MANO (Management and
-orchestration) stacks have been introduced recently. VNFs are not
-directly in OPNFV scope, however VNFs are needed to test and qualify the
-infrastructure. In this regard having a common curated Open Source
-Reference VNF catalog would be of immense importance to community.
-
-Since major focus of OPNFV is Telcos, a curated platform targeted from
-industry point of view would be very useful. We plan to divide the
-entire project into three major phases(with some iterative improvements
-and overlaps)
-
-
-Curation Phase
---------------
-This phase pertains to studying various Open Source VNFs available and
-classification of them based on certain parameters. The parameters that
-I currently have in mind are:
-
- * Developer Metrics: These pertain to repo characteristics of VNF under
- study
- * Usage Statistics - Activity, Number of Commits, stars
- * Maturity Statistics - For instance if an NFV community decides code
- coverage is important for them, it shows the NFV community is serious
- about taking the project forward
- * Technical Tagging: These are the tags that pertain to technical
- characteristics of a VNF
- * Broad Use Cases - Whether the VNF fits strictly in IaaS, PaaS or
- SaaS layer or is an hybrid of two/all.
- * Generic Use Cases - This in my opinion is the broadest
- classification category. For instance a VNF could be built with a
- broad idea of powering IOT devices at home or from usage perspective
- of Telco Operators (vFW, vEPC, vIMS, vCDN, vAAA, vCPE,...).`[2]`_
- * Fields of Application
- * Library Status - Whether APIs are standardized, support RESTful
- services.
- * Dependency Forwarding Graph - This is pretty complex tagging
- mechanism. It essentially tries to establish a graph relationship
- between the VNFs (elementary VNFs are used in Service Function
- Chaining chains such as Firewall, DPI, content enrichment,..). In my
- opinion this is useful immensely. This will allow users to go to
- platform and ask a question like - “I have this X tech stack to
- support, Y and Z are my use cases, which NFVs should I use to support
- this.
- * Visitor Score - Based on `[1]`_ I plan to evolve a visitor score for
- the platform. This will allow users to score an NFV on certain
- parameters, may be post comments.
-
-**I plan to use the above three scores and evolve cumulative score which
-will be displayed next to each of the NFV on the platform.**
-
- * Platform building phase - This will involve erecting a Web Platform
- which will be similar to this `[1]`_. I am decently familiar with
- Django and hence I will write the platform in Django. There are two
- action plans that I have in mind right now. Either I can start writing
- the platform simultaneously which will help keep track of my progress
- or I can write the platform after 1.5 - 2 months into the internship.
- Either way I aim to have the Web Platform ready by March 12.
- * Functest VNF implementation phase - This is the last phase that will
- involve writing a fully functional implementation of an Open Source VNF
- into Functest. I will undertake this after I am 3 months into the
- internship. I have a decent familiarity with python and hence I think
- it shouldn’t be too difficult. I need to decide how complex the VNFI
- should undertake this exercise for (e.g. AAA such as free radius sounds
- relatively easy, vCDN is much more challenging).
- This will be decided in consent with my mentors.
-
-Schedule:
-=========
-I plan to take this project in 6 months time frame as I want to use it
-as a chance to read more about NFVs in particular and SDN in general
-
-
-+--------------------------+------------------------------------------+
-| **Date** | **Comment** |
-| | |
-+--------------------------+------------------------------------------+
-| December 12 - January 12 | Study the above mentioned metrics |
-| | Decide which of them are important for |
-| | community (and which are not). |
-+--------------------------+------------------------------------------+
-| January 12 - January 27 | Make a database for the above studied |
-| | metrics and evolve it further based on |
-| | Mentors’ input. + associated API |
-+--------------------------+------------------------------------------+
-| January 27 - February 5 | Compile the data collected above and make|
-| | it public. Although I can keep everything|
-| | public from the beginning too. My |
-| | rationale of not making the entire data |
-| | public in initial stage as the errors |
-| | caused by me could be misleading for |
-| | developers. |
-+--------------------------+------------------------------------------+
-| February 5 - March 5 | Erect the Web Platform and release it |
-| | for restricted group for alpha testing. |
-+--------------------------+------------------------------------------+
-| March 5 - March 12 | Make it public. Release it to public for |
-| | beta testing. Fix Bugs. |
-+--------------------------+------------------------------------------+
-| March 12 - April 12 | Start working on implementation of an |
-| | Open Source VNF in Functest. |
-+--------------------------+------------------------------------------+
-| April 12 - May 12 | I will decided what to do here based on |
-| | discussion with mentors. |
-+--------------------------+------------------------------------------+
-
-
-References:
-===========
-
-.. _`[1]` : Openhub: https://www.openhub.net/explore/projects
-
-.. _`[2]` : ETSI NFV White Paper: https://portal.etsi.org/Portals/0/TBpages/NFV/Docs/NFV_White_Paper3.pdf
-
-.. _`[3]` : https://wiki.opnfv.org/display/DEV/Intern+Project%3A+Open+Source+VNF+catalog
diff --git a/docs/testing/user/configguide/ci.rst b/docs/testing/user/configguide/ci.rst
deleted file mode 100644
index e4fec51dc..000000000
--- a/docs/testing/user/configguide/ci.rst
+++ /dev/null
@@ -1,16 +0,0 @@
-.. SPDX-License-Identifier: CC-BY-4.0
-
-Integration in CI
-=================
-In CI we use the Docker images and execute the appropriate commands within the
-container from Jenkins.
-
-4 steps have been defined::
- * functest-cleanup: clean existing functest dockers on the jumphost
- * functest-daily: run dockers opnfv/functest-* (healthcheck, smoke, features,
- vnf)
- * functest-store-results: push logs to artifacts
-
-See `[3]`_ for details.
-
-.. _`[3]`: https://git.opnfv.org/releng/tree/jjb/functest/functest-daily-jobs.yml
diff --git a/docs/testing/user/configguide/conf.py b/docs/testing/user/configguide/conf.py
deleted file mode 100644
index c0dc12599..000000000
--- a/docs/testing/user/configguide/conf.py
+++ /dev/null
@@ -1,185 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Functest Installation Guide documentation build configuration file, created
-# by sphinx-quickstart on Tue Apr 3 03:51:57 2018.
-#
-# This file is execfile()d with the current directory set to its
-# containing dir.
-#
-# Note that not all possible configuration values are present in this
-# autogenerated file.
-#
-# All configuration values have a default; values that are commented out
-# serve to show the default.
-
-# If extensions (or modules to document with autodoc) are in another directory,
-# add these directories to sys.path here. If the directory is relative to the
-# documentation root, use os.path.abspath to make it absolute, like shown here.
-#
-# import os
-# import sys
-# sys.path.insert(0, os.path.abspath('.'))
-import sphinx_opnfv_theme
-
-
-# -- General configuration ------------------------------------------------
-
-# If your documentation needs a minimal Sphinx version, state it here.
-#
-# needs_sphinx = '1.0'
-
-# Add any Sphinx extension module names here, as strings. They can be
-# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
-# ones.
-extensions = []
-
-# Add any paths that contain templates here, relative to this directory.
-templates_path = ['_templates']
-
-# The suffix(es) of source filenames.
-# You can specify multiple suffix as a list of string:
-#
-# source_suffix = ['.rst', '.md']
-source_suffix = '.rst'
-
-# The master toctree document.
-master_doc = 'index'
-
-# General information about the project.
-project = u'Functest Installation Guide'
-copyright = u'2018, Functest <opnfv-tech-discuss@lists.opnfv.org>'
-author = u'Functest <opnfv-tech-discuss@lists.opnfv.org>'
-
-# The version info for the project you're documenting, acts as replacement for
-# |version| and |release|, also used in various other places throughout the
-# built documents.
-#
-# The short X.Y version.
-version = u'master'
-# The full version, including alpha/beta/rc tags.
-release = u'master'
-
-# The language for content autogenerated by Sphinx. Refer to documentation
-# for a list of supported languages.
-#
-# This is also used if you do content translation via gettext catalogs.
-# Usually you set "language" from the command line for these cases.
-language = None
-
-# List of patterns, relative to source directory, that match files and
-# directories to ignore when looking for source files.
-# This patterns also effect to html_static_path and html_extra_path
-exclude_patterns = []
-
-# The name of the Pygments (syntax highlighting) style to use.
-pygments_style = 'sphinx'
-
-# If true, `todo` and `todoList` produce output, else they produce nothing.
-todo_include_todos = False
-
-
-# -- Options for HTML output ----------------------------------------------
-
-# The theme to use for HTML and HTML Help pages. See the documentation for
-# a list of builtin themes.
-#
-html_theme = 'opnfv'
-
-# Theme options are theme-specific and customize the look and feel of a theme
-# further. For a list of options available for each theme, see the
-# documentation.
-#
-# html_theme_options = {}
-html_theme_options = {
- 'bootswatch_theme': 'journal',
- 'navbar_sidebarrel': False,
- 'navbar_title': '',
-}
-
-# Add any paths that contain custom themes here, relative to this directory.
-# html_theme_path = []
-html_theme_path = sphinx_opnfv_theme.get_html_theme_path()
-
-# Add any paths that contain custom static files (such as style sheets) here,
-# relative to this directory. They are copied after the builtin static files,
-# so a file named "default.css" will overwrite the builtin "default.css".
-# html_static_path = []
-
-# Custom sidebar templates, must be a dictionary that maps document names
-# to template names.
-#
-# This is required for the alabaster theme
-# refs: http://alabaster.readthedocs.io/en/latest/installation.html#sidebars
-html_sidebars = {
- '**': [
- 'relations.html', # needs 'show_related': True theme option to display
- 'searchbox.html',
- ]
-}
-
-
-# -- Options for HTMLHelp output ------------------------------------------
-
-# Output file base name for HTML help builder.
-htmlhelp_basename = 'FunctestInstallationGuidedoc'
-
-
-# -- Options for LaTeX output ---------------------------------------------
-
-latex_elements = {
- # The paper size ('letterpaper' or 'a4paper').
- #
- # 'papersize': 'letterpaper',
-
- # The font size ('10pt', '11pt' or '12pt').
- #
- # 'pointsize': '10pt',
-
- # Additional stuff for the LaTeX preamble.
- #
- # 'preamble': '',
-
- # Latex figure (float) alignment
- #
- # 'figure_align': 'htbp',
-}
-
-# Grouping the document tree into LaTeX files. List of tuples
-# (source start file, target name, title,
-# author, documentclass [howto, manual, or own class]).
-latex_documents = [
- (master_doc,
- 'FunctestInstallationGuide.tex',
- u'Functest Installation Guide Documentation',
- u'Functest \\textless{}opnfv-tech-discuss@lists.opnfv.org\\textgreater{}',
- 'manual'),
-]
-
-
-# -- Options for manual page output ---------------------------------------
-
-# One entry per manual page. List of tuples
-# (source start file, name, description, authors, manual section).
-man_pages = [
- (master_doc,
- 'functestinstallationguide',
- u'Functest Installation Guide Documentation',
- [author],
- 1)
-]
-
-
-# -- Options for Texinfo output -------------------------------------------
-
-# Grouping the document tree into Texinfo files. List of tuples
-# (source start file, target name, title, author,
-# dir menu entry, description, category)
-texinfo_documents = [
- (master_doc,
- 'FunctestInstallationGuide',
- u'Functest Installation Guide Documentation',
- author,
- 'FunctestInstallationGuide',
- 'One line description of project.',
- 'Miscellaneous'),
-]
diff --git a/docs/testing/user/configguide/configguide.rst b/docs/testing/user/configguide/configguide.rst
index 378aa2ee9..47c25adb1 100644
--- a/docs/testing/user/configguide/configguide.rst
+++ b/docs/testing/user/configguide/configguide.rst
@@ -13,22 +13,12 @@ Functest Dockers for OpenStack deployment
-----------------------------------------
Docker images are available on the dockerhub:
- * opnfv/functest-core
* opnfv/functest-healthcheck
* opnfv/functest-smoke
- * opnfv/functest-features
- * opnfv/functest-components
+ * opnfv/functest-smoke-cntt
+ * opnfv/functest-benchmarking
+ * opnfv/functest-benchmarking-cntt
* opnfv/functest-vnf
- * opnfv/functest-parser
-
-The tag "opnfv-6.0.0" is the official release image in Fraser, but you can
-also pull "fraser" tag as it is being maintained by Functest team and might
-include bugfixes.
-
-The Functest docker container environment can -in principle- be also
-used with non-OPNFV official installers (e.g. 'devstack'), with the
-**disclaimer** that support for such environments is outside of the
-scope and responsibility of the OPNFV project.
Preparing your environment
@@ -36,9 +26,14 @@ Preparing your environment
cat env::
- EXTERNAL_NETWORK=XXX
DEPLOY_SCENARIO=XXX # if not os-nosdn-nofeature-noha scenario
NAMESERVER=XXX # if not 8.8.8.8
+ EXTERNAL_NETWORK=XXX # if not first network with router:external=True
+ DASHBOARD_URL=XXX # else tempest_horizon will be skipped
+ NEW_USER_ROLE=XXX # if not member
+ SDN_CONTROLLER_IP=XXX # if odl scenario
+ VOLUME_DEVICE_NAME=XXX # if not vdb
+ FLAVOR_EXTRA_SPECS=hw:mem_page_size:large # if fdio scenarios
See section on environment variables for details.
@@ -51,26 +46,23 @@ cat env_file::
export OS_PROJECT_NAME=XXX
export OS_PASSWORD=XXX
export OS_IDENTITY_API_VERSION=3
+ export OS_REGION_NAME=XXX
See section on OpenStack credentials for details.
Create a directory for the different images (attached as a Docker volume)::
- mkdir -p images && wget -q -O- https://git.opnfv.org/functest/plain/functest/ci/download_images.sh?h=stable/fraser | bash -s -- images && ls -1 images/*
-
- images/CentOS-7-aarch64-GenericCloud.qcow2
- images/CentOS-7-aarch64-GenericCloud.qcow2.xz
- images/CentOS-7-x86_64-GenericCloud.qcow2
- images/cirros-0.4.0-x86_64-disk.img
- images/cirros-0.4.0-x86_64-lxc.tar.gz
- images/cirros-d161201-aarch64-disk.img
- images/cirros-d161201-aarch64-initramfs
- images/cirros-d161201-aarch64-kernel
- images/cloudify-manager-premium-4.0.1.qcow2
+ mkdir -p images && wget -q -O- https://git.opnfv.org/functest/plain/functest/ci/download_images.sh | sh -s -- images && ls -1 images/*
+
+ images/cirros-0.5.1-aarch64-disk.img
+ images/cirros-0.5.1-x86_64-disk.img
+ images/cloudify-docker-manager-community-19.01.24.tar
+ images/Fedora-Cloud-Base-30-1.2.x86_64.qcow2
+ images/shaker-image-1.3.0+stretch.qcow2
images/ubuntu-14.04-server-cloudimg-amd64-disk1.img
images/ubuntu-14.04-server-cloudimg-arm64-uefi1.img
images/ubuntu-16.04-server-cloudimg-amd64-disk1.img
- images/vyos-1.1.7.img
+ images/vyos-1.1.8-amd64.qcow2
Testing healthcheck suite
^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -84,14 +76,25 @@ Run healthcheck suite::
Results shall be displayed as follows::
- +----------------------------+------------------+---------------------+------------------+----------------+
- | TEST CASE | PROJECT | TIER | DURATION | RESULT |
- +----------------------------+------------------+---------------------+------------------+----------------+
- | connection_check | functest | healthcheck | 00:07 | PASS |
- | api_check | functest | healthcheck | 07:46 | PASS |
- | snaps_health_check | functest | healthcheck | 00:36 | PASS |
- +----------------------------+------------------+---------------------+------------------+----------------+
- NOTE: the duration is a reference and it might vary depending on your SUT.
+ +--------------------------+------------------+---------------------+------------------+----------------+
+ | TEST CASE | PROJECT | TIER | DURATION | RESULT |
+ +--------------------------+------------------+---------------------+------------------+----------------+
+ | connection_check | functest | healthcheck | 00:03 | PASS |
+ | tenantnetwork1 | functest | healthcheck | 00:05 | PASS |
+ | tenantnetwork2 | functest | healthcheck | 00:06 | PASS |
+ | vmready1 | functest | healthcheck | 00:06 | PASS |
+ | vmready2 | functest | healthcheck | 00:08 | PASS |
+ | singlevm1 | functest | healthcheck | 00:32 | PASS |
+ | singlevm2 | functest | healthcheck | 00:37 | PASS |
+ | vping_ssh | functest | healthcheck | 00:46 | PASS |
+ | vping_userdata | functest | healthcheck | 00:39 | PASS |
+ | cinder_test | functest | healthcheck | 01:05 | PASS |
+ | tempest_smoke | functest | healthcheck | 05:39 | PASS |
+ | tempest_horizon | functest | healthcheck | 01:05 | PASS |
+ | odl | functest | healthcheck | 00:00 | SKIP |
+ +--------------------------+------------------+---------------------+------------------+----------------+
+
+NOTE: the duration is a reference and it might vary depending on your SUT.
Testing smoke suite
^^^^^^^^^^^^^^^^^^^
@@ -105,64 +108,101 @@ Run smoke suite::
Results shall be displayed as follows::
- +------------------------------+------------------+---------------+------------------+----------------+
- | TEST CASE | PROJECT | TIER | DURATION | RESULT |
- +------------------------------+------------------+---------------+------------------+----------------+
- | vping_ssh | functest | smoke | 00:57 | PASS |
- | vping_userdata | functest | smoke | 00:33 | PASS |
- | tempest_smoke_serial | functest | smoke | 13:22 | PASS |
- | rally_sanity | functest | smoke | 24:07 | PASS |
- | refstack_defcore | functest | smoke | 05:21 | PASS |
- | patrole | functest | smoke | 04:29 | PASS |
- | snaps_smoke | functest | smoke | 46:54 | PASS |
- | odl | functest | smoke | 00:00 | SKIP |
- | neutron_trunk | functest | smoke | 00:00 | SKIP |
- +------------------------------+------------------+---------------+------------------+----------------+
- Note: if the scenario does not support some tests, they are indicated as SKIP.
- See User guide for details.
-
-Testing features suite
-^^^^^^^^^^^^^^^^^^^^^^
+ +---------------------------+------------------+---------------+------------------+----------------+
+ | TEST CASE | PROJECT | TIER | DURATION | RESULT |
+ +---------------------------+------------------+---------------+------------------+----------------+
+ | tempest_neutron | functest | smoke | 15:30 | PASS |
+ | tempest_cinder | functest | smoke | 02:01 | PASS |
+ | tempest_keystone | functest | smoke | 01:17 | PASS |
+ | tempest_heat | functest | smoke | 22:14 | PASS |
+ | tempest_telemetry | functest | smoke | 00:00 | SKIP |
+ | rally_sanity | functest | smoke | 17:24 | PASS |
+ | refstack_compute | functest | smoke | 07:03 | PASS |
+ | refstack_object | functest | smoke | 02:09 | PASS |
+ | refstack_platform | functest | smoke | 07:31 | PASS |
+ | tempest_full | functest | smoke | 41:52 | PASS |
+ | tempest_scenario | functest | smoke | 08:42 | PASS |
+ | tempest_slow | functest | smoke | 43:42 | PASS |
+ | patrole_admin | functest | smoke | 21:06 | PASS |
+ | patrole_member | functest | smoke | 21:23 | PASS |
+ | patrole_reader | functest | smoke | 21:56 | PASS |
+ | tempest_barbican | functest | smoke | 02:30 | PASS |
+ | tempest_octavia | functest | smoke | 00:00 | SKIP |
+ | tempest_cyborg | functest | smoke | 00:00 | SKIP |
+ +---------------------------+------------------+---------------+------------------+----------------+
+
+Note: if the scenario does not support some tests, they are indicated as SKIP.
+See User guide for details.
+
+Testing smoke CNTT suite
+^^^^^^^^^^^^^^^^^^^^^^^^
-Run features suite::
+Run smoke-cntt suite::
sudo docker run --env-file env \
-v $(pwd)/openstack.creds:/home/opnfv/functest/conf/env_file \
-v $(pwd)/images:/home/opnfv/functest/images \
- opnfv/functest-features
+ opnfv/functest-smoke-cntt
Results shall be displayed as follows::
- +-----------------------------+------------------------+------------------+------------------+----------------+
- | TEST CASE | PROJECT | TIER | DURATION | RESULT |
- +-----------------------------+------------------------+------------------+------------------+----------------+
- | doctor-notification | doctor | features | 00:00 | SKIP |
- | bgpvpn | sdnvpn | features | 00:00 | SKIP |
- | functest-odl-sfc | sfc | features | 00:00 | SKIP |
- | barometercollectd | barometer | features | 00:00 | SKIP |
- | fds | fastdatastacks | features | 00:00 | SKIP |
- +-----------------------------+------------------------+------------------+------------------+----------------+
- Note: if the scenario does not support some tests, they are indicated as SKIP.
- See User guide for details.
-
-Testing components suite
-^^^^^^^^^^^^^^^^^^^^^^^^
+ +-------------------------------+------------------+---------------+------------------+----------------+
+ | TEST CASE | PROJECT | TIER | DURATION | RESULT |
+ +-------------------------------+------------------+---------------+------------------+----------------+
+ | tempest_neutron_cntt | functest | smoke | 11:35 | PASS |
+ | tempest_cinder_cntt | functest | smoke | 01:58 | PASS |
+ | tempest_keystone_cntt | functest | smoke | 01:13 | PASS |
+ | tempest_heat_cntt | functest | smoke | 22:32 | PASS |
+ | rally_sanity_cntt | functest | smoke | 17:16 | PASS |
+ | tempest_full_cntt | functest | smoke | 41:13 | PASS |
+ | tempest_scenario_cntt | functest | smoke | 08:57 | PASS |
+ | tempest_slow_cntt | functest | smoke | 35:58 | PASS |
+ +-------------------------------+------------------+---------------+------------------+----------------+
+
+Testing benchmarking suite
+^^^^^^^^^^^^^^^^^^^^^^^^^^
-Run components suite::
+Run benchmarking suite::
sudo docker run --env-file env \
-v $(pwd)/openstack.creds:/home/opnfv/functest/conf/env_file \
-v $(pwd)/images:/home/opnfv/functest/images \
- opnfv/functest-components
+ opnfv/functest-benchmarking
Results shall be displayed as follows::
- +-------------------------------+------------------+--------------------+------------------+----------------+
- | TEST CASE | PROJECT | TIER | DURATION | RESULT |
- +-------------------------------+------------------+--------------------+------------------+----------------+
- | tempest_full_parallel | functest | components | 48:28 | PASS |
- | rally_full | functest | components | 126:02 | PASS |
- +-------------------------------+------------------+--------------------+------------------+----------------+
+ +--------------------+------------------+----------------------+------------------+----------------+
+ | TEST CASE | PROJECT | TIER | DURATION | RESULT |
+ +--------------------+------------------+----------------------+------------------+----------------+
+ | rally_full | functest | benchmarking | 93:03 | PASS |
+ | rally_jobs | functest | benchmarking | 27:05 | PASS |
+ | vmtp | functest | benchmarking | 17:56 | PASS |
+ | shaker | functest | benchmarking | 24:02 | PASS |
+ +--------------------+------------------+----------------------+------------------+----------------+
+
+Note: if the scenario does not support some tests, they are indicated as SKIP.
+See User guide for details.
+
+Testing benchmarking CNTT suite
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Run benchmarking-cntt suite::
+
+ sudo docker run --env-file env \
+ -v $(pwd)/openstack.creds:/home/opnfv/functest/conf/env_file \
+ -v $(pwd)/images:/home/opnfv/functest/images \
+ opnfv/functest-benchmarking-cntt
+
+Results shall be displayed as follows::
+
+ +-------------------------+------------------+----------------------+------------------+----------------+
+ | TEST CASE | PROJECT | TIER | DURATION | RESULT |
+ +-------------------------+------------------+----------------------+------------------+----------------+
+ | rally_full_cntt | functest | benchmarking | 89:52 | PASS |
+ | rally_jobs_cntt | functest | benchmarking | 19:39 | PASS |
+ | vmtp | functest | benchmarking | 16:59 | PASS |
+ | shaker | functest | benchmarking | 23:43 | PASS |
+ +-------------------------+------------------+----------------------+------------------+----------------+
Testing vnf suite
^^^^^^^^^^^^^^^^^
@@ -179,34 +219,29 @@ Results shall be displayed as follows::
+----------------------+------------------+--------------+------------------+----------------+
| TEST CASE | PROJECT | TIER | DURATION | RESULT |
+----------------------+------------------+--------------+------------------+----------------+
- | cloudify_ims | functest | vnf | 28:15 | PASS |
- | vyos_vrouter | functest | vnf | 17:59 | PASS |
- | juju_epc | functest | vnf | 46:44 | PASS |
+ | cloudify | functest | vnf | 05:08 | PASS |
+ | cloudify_ims | functest | vnf | 24:46 | PASS |
+ | heat_ims | functest | vnf | 33:12 | PASS |
+ | vyos_vrouter | functest | vnf | 15:53 | PASS |
+ | juju_epc | functest | vnf | 27:52 | PASS |
+----------------------+------------------+--------------+------------------+----------------+
-
Functest Dockers for Kubernetes deployment
------------------------------------------
Docker images are available on the dockerhub:
- * opnfv/functest-kubernetes-core
- * opnfv/functest-kubernetest-healthcheck
- * opnfv/functest-kubernetest-smoke
- * opnfv/functest-kubernetest-features
+ * opnfv/functest-kubernetes-healthcheck
+ * opnfv/functest-kubernetes-smoke
+ * opnfv/functest-kubernetes-security
+ * opnfv/functest-kubernetes-benchmarking
+ * opnfv/functest-kubernetes-cnf
Preparing your environment
^^^^^^^^^^^^^^^^^^^^^^^^^^
cat env::
- INSTALLER_TYPE=XXX
- DEPLOY_SCENARIO=XXX
-
-cat k8s.creds::
-
- export KUBERNETES_PROVIDER=local
- export KUBE_MASTER_URL=XXX
- export KUBE_MASTER_IP=XXX
+ DEPLOY_SCENARIO=k8s-XXX
Testing healthcheck suite
^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -214,7 +249,6 @@ Testing healthcheck suite
Run healthcheck suite::
sudo docker run -it --env-file env \
- -v $(pwd)/k8s.creds:/home/opnfv/functest/conf/env_file \
-v $(pwd)/config:/root/.kube/config \
opnfv/functest-kubernetes-healthcheck
@@ -223,11 +257,12 @@ volume mapped to ~/.kube/config inside kubernetes container.
Results shall be displayed as follows::
- +-------------------------+------------------+-----------------+------------------+----------------+
- | TEST CASE | PROJECT | TIER | DURATION | RESULT |
- +-------------------------+------------------+-----------------+------------------+----------------+
- | k8s_smoke | functest | healthcheck | 01:54 | PASS |
- +-------------------------+------------------+-----------------+------------------+----------------+
+ +-------------------+------------------+---------------------+------------------+----------------+
+ | TEST CASE | PROJECT | TIER | DURATION | RESULT |
+ +-------------------+------------------+---------------------+------------------+----------------+
+ | k8s_quick | functest | healthcheck | 00:18 | PASS |
+ | k8s_smoke | functest | healthcheck | 01:14 | PASS |
+ +-------------------+------------------+---------------------+------------------+----------------+
Testing smoke suite
^^^^^^^^^^^^^^^^^^^
@@ -235,45 +270,84 @@ Testing smoke suite
Run smoke suite::
sudo docker run -it --env-file env \
- -v $(pwd)/k8s.creds:/home/opnfv/functest/conf/env_file \
-v $(pwd)/config:/root/.kube/config \
opnfv/functest-kubernetes-smoke
Results shall be displayed as follows::
- +-------------------------+------------------+---------------+------------------+----------------+
- | TEST CASE | PROJECT | TIER | DURATION | RESULT |
- +-------------------------+------------------+---------------+------------------+----------------+
- | k8s_conformance | functest | smoke | 57:47 | PASS |
- +-------------------------+------------------+---------------+------------------+----------------+
+ +---------------------------+------------------+---------------+------------------+----------------+
+ | TEST CASE | PROJECT | TIER | DURATION | RESULT |
+ +---------------------------+------------------+---------------+------------------+----------------+
+ | k8s_conformance | functest | smoke | 94:26 | PASS |
+ | xrally_kubernetes | functest | smoke | 13:05 | PASS |
+ +---------------------------+------------------+---------------+------------------+----------------+
-Testing features suite
+Testing security suite
^^^^^^^^^^^^^^^^^^^^^^
-Run features suite::
+Run smoke suite::
sudo docker run -it --env-file env \
- -v $(pwd)/k8s.creds:/home/opnfv/functest/conf/env_file \
-v $(pwd)/config:/root/.kube/config \
- opnfv/functest-kubernetes-features
+ opnfv/functest-kubernetes-security
Results shall be displayed as follows::
- +----------------------+------------------+------------------+------------------+----------------+
- | TEST CASE | PROJECT | TIER | DURATION | RESULT |
- +----------------------+------------------+------------------+------------------+----------------+
- | stor4nfv_k8s | stor4nfv | stor4nfv | 00:00 | SKIP |
- | clover_k8s | clover | clover | 00:00 | SKIP |
- +----------------------+------------------+------------------+------------------+----------------+
+ +---------------------------+------------------+------------------+------------------+----------------+
+ | TEST CASE | PROJECT | TIER | DURATION | RESULT |
+ +---------------------------+------------------+------------------+------------------+----------------+
+ | kube_hunter | functest | security | 00:19 | PASS |
+ | kube_bench_master | functest | security | 00:02 | PASS |
+ | kube_bench_node | functest | security | 00:01 | PASS |
+ +---------------------------+------------------+------------------+------------------+----------------+
+
+Testing benchmarking suite
+^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Run benchmarking suite::
+
+ sudo docker run -it --env-file env \
+ -v $(pwd)/config:/root/.kube/config \
+ opnfv/functest-kubernetes-benchmarking
+
+Results shall be displayed as follows::
+
+ +--------------------------------+------------------+----------------------+------------------+----------------+
+ | TEST CASE | PROJECT | TIER | DURATION | RESULT |
+ +--------------------------------+------------------+----------------------+------------------+----------------+
+ | xrally_kubernetes_full | functest | benchmarking | 34:16 | PASS |
+ +--------------------------------+------------------+----------------------+------------------+----------------+
+
+Testing cnf suite
+^^^^^^^^^^^^^^^^^
+
+Run cnf suite::
+
+ sudo docker run -it --env-file env \
+ -v $(pwd)/config:/root/.kube/config \
+ opnfv/functest-kubernetes-cnf
+
+Results shall be displayed as follows::
+
+ +-------------------------+------------------+--------------+------------------+----------------+
+ | TEST CASE | PROJECT | TIER | DURATION | RESULT |
+ +-------------------------+------------------+--------------+------------------+----------------+
+ | k8s_vims | functest | cnf | 09:06 | PASS |
+ | helm_vims | functest | cnf | 08:54 | PASS |
+ | cnf_conformance | functest | cnf | 02:00 | PASS |
+ +-------------------------+------------------+--------------+------------------+----------------+
Environment variables
=====================
-Several environement variables may be specified:
- * INSTALLER_TYPE=(apex|compass|daisy|fuel|joid)
+Several environment variables may be specified:
+
* INSTALLER_IP=<Specific IP Address>
* DEPLOY_SCENARIO=<vim>-<controller>-<nfv_feature>-<ha_mode>
-
+ * NAMESERVER=XXX # if not 8.8.8.8
+ * VOLUME_DEVICE_NAME=XXX # if not vdb
+ * EXTERNAL_NETWORK=XXX # if not first network with router:external=True
+ * NEW_USER_ROLE=XXX # if not member
INSTALLER_IP is required by Barometer in order to access the installer node and
the deployment.
@@ -306,8 +380,9 @@ to the Functest Docker Container, using the -e
only relevant to Jenkins CI invoked testing and **should not be used**
when performing manual test scenarios:
- * NODE_NAME = <Test POD Name>
- * BUILD_TAG = <Jenkins Build Tag>
+ * INSTALLER_TYPE=(apex|compass|daisy|fuel)
+ * NODE_NAME=<Test POD Name>
+ * BUILD_TAG=<Jenkins Build Tag>
where:
@@ -390,7 +465,7 @@ By default all the logs are put un /home/opnfv/functest/results/functest.log.
If you want to have more logs in console, you may edit the logging.ini file
manually.
Connect on the docker then edit the file located in
-/usr/lib/python2.7/site-packages/xtesting/ci/logging.ini
+/usr/lib/python3.8/site-packages/xtesting/ci/logging.ini
Change wconsole to console in the desired module to get more traces.
@@ -400,8 +475,8 @@ Configuration
You may also directly modify the python code or the configuration file (e.g.
testcases.yaml used to declare test constraints) under
-/usr/lib/python2.7/site-packages/xtesting and
-/usr/lib/python2.7/site-packages/functest
+/usr/lib/python3.8/site-packages/xtesting and
+/usr/lib/python3.8/site-packages/functest
Tips
@@ -550,7 +625,7 @@ docker container::
Note: In a Jumphost node based on the CentOS family OS, the **nc**
commands might not work. You can use the **curl** command instead.
- curl http://www.opnfv.org:80
+ curl https://www.opnfv.org/
<HTML><HEAD><meta http-equiv="content-type"
.
@@ -608,11 +683,10 @@ and install the **docker-engine**. The instructions conclude with a
work with the above pre-requisite actions.
-.. _`[4]`: http://docs.opnfv.org/en/latest/submodules/functest/docs/testing/user/configguide/index.html
.. _`dockerdocs`: https://docs.docker.com/
.. _`Proxy`: https://docs.docker.com/engine/admin/systemd/#http-proxy
.. _`Install Docker on CentOS`: https://docs.docker.com/engine/installation/linux/centos/
.. _`Functest User Guide`: http://docs.opnfv.org/en/stable-danube/submodules/functest/docs/testing/user/userguide/index.html
.. _`images/CentOS-7-x86_64-GenericCloud.qcow2`: https://cloud.centos.org/centos/7/images/CentOS-7-x86_64-GenericCloud.qcow2
-.. _`images/cirros-0.4.0-x86_64-disk.img`: http://download.cirros-cloud.net/0.4.0/cirros-0.4.0-x86_64-disk.img
+.. _`images/cirros-0.5.1-x86_64-disk.img`: http://download.cirros-cloud.net/0.5.1/cirros-0.5.1-x86_64-disk.img
.. _`images/ubuntu-14.04-server-cloudimg-amd64-disk1.img`: https://cloud-images.ubuntu.com/releases/14.04/release/ubuntu-14.04-server-cloudimg-amd64-disk1.img
diff --git a/docs/testing/user/configguide/index.rst b/docs/testing/user/configguide/index.rst
index 5d7eeb6e4..e5963435e 100644
--- a/docs/testing/user/configguide/index.rst
+++ b/docs/testing/user/configguide/index.rst
@@ -1,38 +1,22 @@
.. SPDX-License-Identifier: CC-BY-4.0
+.. _functest-install-guide:
***************************
Functest Installation Guide
***************************
.. toctree::
- :numbered:
:maxdepth: 2
intro.rst
prerequisites.rst
configguide.rst
- ci.rst
References
==========
-`[1]`_ : Keystone and public end point constraint
-
-`[2]`_ : Functest User guide
-
-`[3]`_ : Functest Jenkins jobs
-
-`[4]`_ : Functest Configuration guide
-
-`[5]`_ : OPNFV main site
-
-`[6]`_ : Functest wiki page
+`[1]`_ : Functest Jenkins jobs
IRC support channel: #opnfv-functest
-.. _`[1]`: https://ask.openstack.org/en/question/68144/keystone-unable-to-use-the-public-endpoint/
-.. _`[2]`: http://docs.opnfv.org/en/latest/submodules/functest/docs/testing/user/userguide/index.html
-.. _`[3]`: https://git.opnfv.org/releng/tree/jjb/functest/functest-daily-jobs.yml
-.. _`[4]`: http://docs.opnfv.org/en/latest/submodules/functest/docs/testing/user/configguide/index.html
-.. _`[5]`: http://www.opnfv.org
-.. _`[6]`: https://wiki.opnfv.org/functest
+.. _`[1]`: https://github.com/opnfv/releng/blob/master/jjb/functest/functest.yaml
diff --git a/docs/testing/user/configguide/intro.rst b/docs/testing/user/configguide/intro.rst
index 72730b253..02329995c 100644
--- a/docs/testing/user/configguide/intro.rst
+++ b/docs/testing/user/configguide/intro.rst
@@ -64,9 +64,6 @@ follows::
+ + + + + +
SUT = System Under Test
-Note connectivity to management network is not needed for most of the
-testcases. But it may be needed for some specific snaps tests.
-
All the libraries and dependencies needed by all of the Functest tools are
pre-installed into the Docker images. This allows running Functest on any
platform.
@@ -86,6 +83,4 @@ however, it would be possible to adapt them to any OpenStack based VIM +
controller environment, since most of the test cases are integrated from
upstream communities.
-The functional test cases are described in the Functest User `[2]`_
-
-.. _`[2]`: http://docs.opnfv.org/en/latest/submodules/functest/docs/testing/user/userguide/index.html
+The functional test cases are described in the :ref:`functest-userguide`
diff --git a/docs/testing/user/configguide/prerequisites.rst b/docs/testing/user/configguide/prerequisites.rst
index 60be1b93b..dab4a9e6b 100644
--- a/docs/testing/user/configguide/prerequisites.rst
+++ b/docs/testing/user/configguide/prerequisites.rst
@@ -3,7 +3,7 @@
Prerequisites
=============
The OPNFV deployment is out of the scope of this document but it can be
-found in http://docs.opnfv.org.
+found in https://docs.opnfv.org/en/stable-hunter/.
The OPNFV platform is considered as the SUT in this document.
Several prerequisites are needed for Functest:
@@ -14,13 +14,6 @@ Several prerequisites are needed for Functest:
#. An admin/management network created on the SUT
#. Connectivity from the Jumphost to the SUT public/external network
-Some specific SNAPS tests may require a connectivity from the Jumphost to the
-SUT admin/management network but most of the test cases do not. This
-requirement can be changed by overriding the 'interface' attribute
-(OS_INTERFACE) value to 'public' in the credentials file. Another means to
-circumvent this issue would be to change the 'snaps.use_keystone' value from
-True to False.
-
WARNING: Connectivity from Jumphost is essential and it is of paramount
importance to make sure it is working before even considering to install
and run Functest. Make also sure you understand how your networking is
@@ -99,7 +92,4 @@ should thus be known. Ensure you can reach each node in the SUT, from the
Jumphost using the 'ping' command using the respective IP address on the
public/external network for each node in the SUT. The details of how to
determine the needed IP addresses for each node in the SUT may vary according
-to the used installer and are therefore ommitted here.
-
-.. _`[1]`: https://ask.openstack.org/en/question/68144/keystone-unable-to-use-the-public-endpoint/
-.. _`[4]`: http://docs.opnfv.org/en/latest/submodules/functest/docs/testing/user/configguide/index.html
+to the used installer and are therefore omitted here.
diff --git a/docs/testing/user/userguide/conf.py b/docs/testing/user/userguide/conf.py
deleted file mode 100644
index 716d3b3d2..000000000
--- a/docs/testing/user/userguide/conf.py
+++ /dev/null
@@ -1,185 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Functest User Guide documentation build configuration file, created by
-# sphinx-quickstart on Wed Apr 4 04:05:42 2018.
-#
-# This file is execfile()d with the current directory set to its
-# containing dir.
-#
-# Note that not all possible configuration values are present in this
-# autogenerated file.
-#
-# All configuration values have a default; values that are commented out
-# serve to show the default.
-
-# If extensions (or modules to document with autodoc) are in another directory,
-# add these directories to sys.path here. If the directory is relative to the
-# documentation root, use os.path.abspath to make it absolute, like shown here.
-#
-# import os
-# import sys
-# sys.path.insert(0, os.path.abspath('.'))
-import sphinx_opnfv_theme
-
-
-# -- General configuration ------------------------------------------------
-
-# If your documentation needs a minimal Sphinx version, state it here.
-#
-# needs_sphinx = '1.0'
-
-# Add any Sphinx extension module names here, as strings. They can be
-# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
-# ones.
-extensions = []
-
-# Add any paths that contain templates here, relative to this directory.
-templates_path = ['_templates']
-
-# The suffix(es) of source filenames.
-# You can specify multiple suffix as a list of string:
-#
-# source_suffix = ['.rst', '.md']
-source_suffix = '.rst'
-
-# The master toctree document.
-master_doc = 'index'
-
-# General information about the project.
-project = u'Functest User Guide'
-copyright = u'2018, Functest <opnfv-tech-discuss@lists.opnfv.org>'
-author = u'Functest <opnfv-tech-discuss@lists.opnfv.org>'
-
-# The version info for the project you're documenting, acts as replacement for
-# |version| and |release|, also used in various other places throughout the
-# built documents.
-#
-# The short X.Y version.
-version = u'master'
-# The full version, including alpha/beta/rc tags.
-release = u'master'
-
-# The language for content autogenerated by Sphinx. Refer to documentation
-# for a list of supported languages.
-#
-# This is also used if you do content translation via gettext catalogs.
-# Usually you set "language" from the command line for these cases.
-language = None
-
-# List of patterns, relative to source directory, that match files and
-# directories to ignore when looking for source files.
-# This patterns also effect to html_static_path and html_extra_path
-exclude_patterns = []
-
-# The name of the Pygments (syntax highlighting) style to use.
-pygments_style = 'sphinx'
-
-# If true, `todo` and `todoList` produce output, else they produce nothing.
-todo_include_todos = False
-
-
-# -- Options for HTML output ----------------------------------------------
-
-# The theme to use for HTML and HTML Help pages. See the documentation for
-# a list of builtin themes.
-#
-html_theme = 'opnfv'
-
-# Theme options are theme-specific and customize the look and feel of a theme
-# further. For a list of options available for each theme, see the
-# documentation.
-#
-# html_theme_options = {}
-html_theme_options = {
- 'bootswatch_theme': 'journal',
- 'navbar_sidebarrel': False,
- 'navbar_title': '',
-}
-
-# Add any paths that contain custom themes here, relative to this directory.
-# html_theme_path = []
-html_theme_path = sphinx_opnfv_theme.get_html_theme_path()
-
-# Add any paths that contain custom static files (such as style sheets) here,
-# relative to this directory. They are copied after the builtin static files,
-# so a file named "default.css" will overwrite the builtin "default.css".
-# html_static_path = []
-
-# Custom sidebar templates, must be a dictionary that maps document names
-# to template names.
-#
-# This is required for the alabaster theme
-# refs: http://alabaster.readthedocs.io/en/latest/installation.html#sidebars
-html_sidebars = {
- '**': [
- 'relations.html', # needs 'show_related': True theme option to display
- 'searchbox.html',
- ]
-}
-
-
-# -- Options for HTMLHelp output ------------------------------------------
-
-# Output file base name for HTML help builder.
-htmlhelp_basename = 'FunctestUserGuidedoc'
-
-
-# -- Options for LaTeX output ---------------------------------------------
-
-latex_elements = {
- # The paper size ('letterpaper' or 'a4paper').
- #
- # 'papersize': 'letterpaper',
-
- # The font size ('10pt', '11pt' or '12pt').
- #
- # 'pointsize': '10pt',
-
- # Additional stuff for the LaTeX preamble.
- #
- # 'preamble': '',
-
- # Latex figure (float) alignment
- #
- # 'figure_align': 'htbp',
-}
-
-# Grouping the document tree into LaTeX files. List of tuples
-# (source start file, target name, title,
-# author, documentclass [howto, manual, or own class]).
-latex_documents = [
- (master_doc,
- 'FunctestUserGuide.tex',
- u'Functest User Guide Documentation',
- u'Functest \\textless{}opnfv-tech-discuss@lists.opnfv.org\\textgreater{}',
- 'manual'),
-]
-
-
-# -- Options for manual page output ---------------------------------------
-
-# One entry per manual page. List of tuples
-# (source start file, name, description, authors, manual section).
-man_pages = [
- (master_doc,
- 'functestuserguide',
- u'Functest User Guide Documentation',
- [author],
- 1)
-]
-
-
-# -- Options for Texinfo output -------------------------------------------
-
-# Grouping the document tree into Texinfo files. List of tuples
-# (source start file, target name, title, author,
-# dir menu entry, description, category)
-texinfo_documents = [
- (master_doc,
- 'FunctestUserGuide',
- u'Functest User Guide Documentation',
- author,
- 'FunctestUserGuide',
- 'One line description of project.',
- 'Miscellaneous'),
-]
diff --git a/docs/testing/user/userguide/index.rst b/docs/testing/user/userguide/index.rst
index 36951fc66..1e73cd622 100644
--- a/docs/testing/user/userguide/index.rst
+++ b/docs/testing/user/userguide/index.rst
@@ -12,7 +12,6 @@ Functest User Guide
intro.rst
test_overview.rst
test_details.rst
- runfunctest.rst
test_results.rst
reporting.rst
troubleshooting.rst
@@ -21,8 +20,6 @@ Functest User Guide
References
==========
-`[1]`_: Functest configuration guide
-
`[2]`_: OpenStack Tempest documentation
`[3]`_: Rally documentation
@@ -31,7 +28,7 @@ References
`[5]`_: Clearwater vIMS blueprint
-`[6]`_: NIST web site
+`[6]`_: Security Content Automation Protocol
`[7]`_: OpenSCAP web site
@@ -43,17 +40,13 @@ References
`[11]`_: Robot Framework web site
-`[12]`_: Functest User guide
-
-`[13]`_: SNAPS wiki
+`[13]`_: SNAPS
`[14]`_: vRouter
`[15]`_: Testing OpenStack Tempest part 1
-`[16]`_: Running Functest through internal REST API
-
-`[17]`_: OPNFV Test API
+`[16]`_: OPNFV Test API
`OPNFV main site`_: OPNFV official web site
@@ -61,26 +54,23 @@ References
IRC support chan: #opnfv-functest
-.. _`[1]`: http://docs.opnfv.org/en/latest/submodules/functest/docs/testing/user/configguide/index.html
-.. _`[2]`: http://docs.openstack.org/developer/tempest/overview.html
-.. _`[3]`: https://rally.readthedocs.org/en/latest/index.html
-.. _`[4]`: http://events.linuxfoundation.org/sites/events/files/slides/Functest%20in%20Depth_0.pdf
+.. _`[2]`: https://docs.openstack.org/tempest/latest/
+.. _`[3]`: https://rally.readthedocs.io/en/latest/index.html
+.. _`[4]`: https://events.static.linuxfound.org/sites/events/files/slides/Functest%20in%20Depth_0.pdf
.. _`[5]`: https://github.com/Orange-OpenSource/opnfv-cloudify-clearwater/blob/master/openstack-blueprint.yaml
-.. _`[6]`: https://scap.nist.gov/
+.. _`[6]`: https://en.wikipedia.org/wiki/Security_Content_Automation_Protocol
.. _`[7]`: https://github.com/OpenSCAP/openscap
.. _`[8]`: https://github.com/openstack/refstack-client
-.. _`[9]`: https://github.com/openstack/defcore
+.. _`[9]`: https://github.com/openstack/interop
.. _`[10]`: https://github.com/openstack/interop/blob/master/2016.08/procedure.rst
-.. _`[11]`: http://robotframework.org/
-.. _`[12]`: http://docs.opnfv.org/en/latest/submodules/functest/docs/testing/user/userguide/index.html
-.. _`[13]`: https://wiki.opnfv.org/display/PROJ/SNAPS-OO
+.. _`[11]`: https://robotframework.org/
+.. _`[13]`: https://git.opnfv.org/snaps/
.. _`[14]`: https://github.com/oolorg/opnfv-functest-vrouter
.. _`[15]`: https://aptira.com/testing-openstack-tempest-part-1/
-.. _`[16]`: https://wiki.opnfv.org/display/functest/Running+test+cases+via+new+Functest+REST+API
-.. _`[17]`: http://docs.opnfv.org/en/latest/testing/testing-dev.html
-.. _`OPNFV main site`: http://www.opnfv.org
-.. _`Functest page`: https://wiki.opnfv.org/functest
+.. _`[16]`: http://testresults.opnfv.org/test/
+.. _`OPNFV main site`: https://www.opnfv.org/
+.. _`Functest page`: https://github.com/opnfv/functest/
.. _`OpenRC`: http://docs.openstack.org/user-guide/common/cli_set_environment_variables_using_openstack_rc.html
.. _`Rally installation procedure`: https://rally.readthedocs.org/en/latest/tutorial/step_0_installation.html
-.. _`config_functest.yaml` : https://git.opnfv.org/cgit/functest/tree/functest/ci/config_functest.yaml
+.. _`config_functest.yaml` : https://github.com/opnfv/functest/blob/master/functest/ci/config_functest.yaml
.. _`Functest reporting`: http://testresults.opnfv.org/reporting/master/functest/status-apex.html
diff --git a/docs/testing/user/userguide/intro.rst b/docs/testing/user/userguide/intro.rst
index 0c36cd8c7..c001afb2f 100644
--- a/docs/testing/user/userguide/intro.rst
+++ b/docs/testing/user/userguide/intro.rst
@@ -7,6 +7,4 @@ The goal of this document is to describe the OPNFV Functest test cases and to
provide a procedure to execute them.
**IMPORTANT**: It is assumed here that Functest has been properly deployed
-following the installation guide procedure `[1]`_.
-
-.. _`[1]`: http://docs.opnfv.org/en/latest/submodules/functest/docs/testing/user/configguide/index.html
+following the installation guide procedure :ref:`functest-install-guide`.
diff --git a/docs/testing/user/userguide/reporting.rst b/docs/testing/user/userguide/reporting.rst
index 337c203db..8fad55d33 100644
--- a/docs/testing/user/userguide/reporting.rst
+++ b/docs/testing/user/userguide/reporting.rst
@@ -25,7 +25,7 @@ and features) corresponding to this scenario.
+---------------------+---------+---------+---------+---------+
| vPing_userdata | X | X | X | X |
+---------------------+---------+---------+---------+---------+
- | tempest_smoke_serial| X | X | X | X |
+ | tempest_smoke | X | X | X | X |
+---------------------+---------+---------+---------+---------+
| rally_sanity | X | X | X | X |
+---------------------+---------+---------+---------+---------+
@@ -48,7 +48,7 @@ and features) corresponding to this scenario.
All the testcases (X) listed in the table are runnable on os-odl_l2-nofeature
scenarios.
Please note that other test cases (e.g. sfc_odl, bgpvpn) need ODL configuration
-addons and, as a consequence, specific scenario.
+add-ons and, as a consequence, specific scenario.
There are not considered as runnable on the generic odl_l2 scenario.
@@ -82,7 +82,7 @@ Therefore the scoring provides 3 types of indicators:
* the maturity: if the percentage (scoring/target scoring * 100) is high, it
means that all the tests are PASS
* the stability: as the number of iteration is included in the calculation,
- the pecentage can be high only if the scenario is run regularly (at least
+ the percentage can be high only if the scenario is run regularly (at least
more than 4 iterations over the last 10 days in CI)
In any case, the scoring is used to give feedback to the other projects and
diff --git a/docs/testing/user/userguide/runfunctest.rst b/docs/testing/user/userguide/runfunctest.rst
deleted file mode 100644
index a8f5a4694..000000000
--- a/docs/testing/user/userguide/runfunctest.rst
+++ /dev/null
@@ -1,138 +0,0 @@
-.. SPDX-License-Identifier: CC-BY-4.0
-
-Executing Functest suites
-=========================
-
-As mentioned in the configuration guide `[1]`_, Alpine docker containers have
-been introduced in Euphrates.
-Tier containers have been created.
-Assuming that you pulled the container and your environement is ready, you can
-simply run the tiers by typing (e.g. with functest-healthcheck)::
-
- sudo docker run --env-file env \
- -v $(pwd)/openstack.creds:/home/opnfv/functest/conf/env_file \
- -v $(pwd)/images:/home/opnfv/functest/images \
- opnfv/functest-healthcheck
-
-You should get::
-
- +----------------------------+------------------+---------------------+------------------+----------------+
- | TEST CASE | PROJECT | TIER | DURATION | RESULT |
- +----------------------------+------------------+---------------------+------------------+----------------+
- | connection_check | functest | healthcheck | 00:02 | PASS |
- | api_check | functest | healthcheck | 03:19 | PASS |
- | snaps_health_check | functest | healthcheck | 00:46 | PASS |
- +----------------------------+------------------+---------------------+------------------+----------------+
-
-You can run functest-healcheck, functest-smoke, functest-features,
-functest-components and functest-vnf.
-
-The result tables show the results by test case, it can be::
-
- * PASS
- * FAIL
- * SKIP: if the scenario/installer does not support the test case
-
-
-Manual run
-==========
-If you want to run the test step by step, you may add docker option then run
-the different commands within the docker.
-
-Considering the healthcheck example, running functest manaully means::
-
- sudo docker run -ti --env-file env \
- -v $(pwd)/openstack.creds:/home/opnfv/functest/conf/env_file \
- -v $(pwd)/images:/home/opnfv/functest/images \
- opnfv/functest-healthcheck /bin/bash
-
-The docker prompt shall be returned. Then within the docker run the following
-commands::
-
- $ source /home/opnfv/functest/conf/env_file
-
-Tier
-----
-Each Alpine container provided on the docker hub matches with a tier.
-The following commands are available::
-
- # functest tier list
- - 0. healthcheck:
- ['connection_check', 'api_check', 'snaps_health_check']
- # functest tier show healthcheck
- +---------------------+---------------+--------------------------+-------------------------------------------------+------------------------------------+
- | TIERS | ORDER | CI LOOP | DESCRIPTION | TESTCASES |
- +---------------------+---------------+--------------------------+-------------------------------------------------+------------------------------------+
- | healthcheck | 0 | (daily)|(weekly) | First tier to be executed to verify the | connection_check api_check |
- | | | | basic operations in the VIM. | snaps_health_check |
- +---------------------+---------------+--------------------------+-------------------------------------------------+------------------------------------+
-
-To run all the cases of the tier, type::
-
- # functest tier run healthcheck
-
-Testcase
---------
-Testcases can be listed, shown and run though the CLI::
-
- # functest testcase list
- connection_check
- api_check
- snaps_health_check
- # functest testcase show api_check
- +-------------------+--------------------------------------------------+------------------+---------------------------+
- | TEST CASE | DESCRIPTION | CRITERIA | DEPENDENCY |
- +-------------------+--------------------------------------------------+------------------+---------------------------+
- | api_check | This test case verifies the retrieval of | 100 | ^((?!lxd).)*$ |
- | | 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. | | |
- +-------------------+--------------------------------------------------+------------------+---------------------------+
- # functest testcase run connection_check
- ...
- # functest run all
-
-You can also type run_tests -t all to run all the tests.
-
-Note the list of test cases depend on the installer and the scenario.
-
-
-Reporting results to the test Database
-======================================
-In OPNFV CI we collect all the results from CI. A test API shall be available
-as well as a test database `[17]`_.
-
-Functest internal API
-=====================
-
-An internal API has been introduced in Euphrates. The goal is to trigger
-Functest operations through an API in addition of the CLI.
-This could be considered as a first step towards a pseudo micro services
-approach where the different test projects could expose and consume APIs to the
-other test projects.
-
-In Euphrates the main method of the APIs are:
-
- * Show credentials
- * Update openrc file
- * Show environment
- * Update hosts info for domain name
- * Prepare environment
- * List all testcases
- * Show a testcase
- * Run a testcase
- * List all tiers
- * Show a tier
- * List all testcases within given tier
- * Get the result of the specified task
- * Get the log of the specified task
-
-See `[16]`_ to get examples on how to use the API.
-
-
-.. _`[1]`: http://docs.opnfv.org/en/latest/submodules/functest/docs/testing/user/configguide/index.html
-.. _`[16]`: https://wiki.opnfv.org/display/functest/Running+test+cases+via+new+Functest+REST+API
-.. _`[17]`: http://docs.opnfv.org/en/latest/testing/testing-dev.html
diff --git a/docs/testing/user/userguide/test_details.rst b/docs/testing/user/userguide/test_details.rst
index 002b3b7e6..98247d488 100644
--- a/docs/testing/user/userguide/test_details.rst
+++ b/docs/testing/user/userguide/test_details.rst
@@ -24,20 +24,10 @@ The tests are:
* *connection_check*
- * *api_check*
- * *snaps_health_check*
-Connection_check consists in 9 test cases (test duration < 5s) checking the
+Connection_check consists in test cases (test duration < 5s) checking the
connectivity with Glance, Keystone, Neutron, Nova and the external network.
-Api_check 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. This suite consists in 49 tests (test duration < 2 minutes).
-
-Snaps_health_check creates a VM with a single port with an IPv4 address that
-is assigned by DHCP and then validates the expected IP with the actual.
-
Self-obviously, successful completion of the 'healthcheck' testcase is a
necessary pre-requisite for the execution of all other test Tiers.
@@ -161,17 +151,14 @@ console output is stored to a *log* file for further analysis.
The Tempest testcases are distributed across three
Tiers:
- * Smoke Tier - Test Case 'tempest_smoke_serial'
- * Components Tier - Test case 'tempest_full_parallel'
+ * Smoke Tier - Test Case 'tempest_smoke'
+ * Components Tier - Test case 'tempest_full'
* Neutron Trunk Port - Test case 'neutron_trunk'
* OpenStack interop testcases - Test case 'refstack_defcore'
* Testing and verifying RBAC policy enforcement - Test case 'patrole'
-NOTE: Test case 'tempest_smoke_serial' executes a defined set of tempest smoke
-tests with a single thread (i.e. serial mode). Test case
-'tempest_full_parallel' executes all defined Tempest tests using several
-concurrent threads (i.e. parallel mode). The number of threads activated
-corresponds to the number of available logical CPUs.
+NOTE: Test case 'tempest_smoke' executes a defined set of tempest smoke
+tests. Test case 'tempest_full' executes all defined Tempest tests.
NOTE: The 'neutron_trunk' test set allows to connect a VM to multiple VLAN
separated networks using a single NIC. The feature neutron trunk ports have
@@ -226,17 +213,6 @@ NOTE: Test case 'rally_sanity' executes a limited number of Rally smoke test
cases. Test case 'rally_full' executes the full defined set of Rally tests.
-snaps_smoke
-------------
-
-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.
-Please note that When the configuration value of snaps.use_keystone is True,
-Functest must have access the cloud's private network.
-This suite consists in 120 tests (test duration ~= 50 minutes)
-
-
SDN Controllers
---------------
@@ -296,53 +272,6 @@ Note: the checks in OpenDaylight are based on the returned HTTP status
code returned by OpenDaylight.
-Features
---------
-
-Functest has been supporting several feature projects since Brahmaputra:
-
-
-+-----------------+---------+----------+--------+-----------+-----------+
-| Test | Brahma | Colorado | Danube | Euphrates | Fraser |
-+=================+=========+==========+========+===========+===========+
-| barometer | | | X | X | X |
-+-----------------+---------+----------+--------+-----------+-----------+
-| bgpvpn | | X | X | X | X |
-+-----------------+---------+----------+--------+-----------+-----------+
-| copper | | X | | | |
-+-----------------+---------+----------+--------+-----------+-----------+
-| doctor | X | X | X | X | X |
-+-----------------+---------+----------+--------+-----------+-----------+
-| domino | | X | X | X | |
-+-----------------+---------+----------+--------+-----------+-----------+
-| fds | | | X | X | X |
-+-----------------+---------+----------+--------+-----------+-----------+
-| moon | | X | | | |
-+-----------------+---------+----------+--------+-----------+-----------+
-| multisite | | X | X | | |
-+-----------------+---------+----------+--------+-----------+-----------+
-| netready | | | X | | |
-+-----------------+---------+----------+--------+-----------+-----------+
-| odl_sfc | | X | X | X | X |
-+-----------------+---------+----------+--------+-----------+-----------+
-| opera | | | X | | |
-+-----------------+---------+----------+--------+-----------+-----------+
-| orchestra | | | X | X | X |
-+-----------------+---------+----------+--------+-----------+-----------+
-| parser | | | X | X | X |
-+-----------------+---------+----------+--------+-----------+-----------+
-| promise | X | X | X | X | X |
-+-----------------+---------+----------+--------+-----------+-----------+
-| security_scan | | X | X | | |
-+-----------------+---------+----------+--------+-----------+-----------+
-| clover | | | | | X |
-+-----------------+---------+----------+--------+-----------+-----------+
-| stor4nfv | | | | | X |
-+-----------------+---------+----------+--------+-----------+-----------+
-
-Please refer to the dedicated feature user guides for details.
-
-
VNF
---
@@ -366,40 +295,31 @@ The goal of this test suite consists of:
The Clearwater architecture is described as follows:
-.. figure:: ../../../images/clearwater-architecture.png
+.. figure:: ../../../images/clearwater-architecture-v2.png
:align: center
:alt: vIMS architecture
+heat_ims
+^^^^^^^^
+The IP Multimedia Subsystem or IP Multimedia Core Network Subsystem (IMS) is an
+architectural framework for delivering IP multimedia services.
-cloudify_ims_perf
-^^^^^^^^^^^^^^^^^
-This testcase extends the cloudify_ims test case.
-The first part is similar but the testing part is different.
-The testing part consists in automating a realistic signaling load on the vIMS
-using an Ixia loader (proprietary tools)
-
- - You need to have access to an Ixia licence server defined in the
- configuration file and have ixia image locally.
-
-This test case is available but not declared in testcases.yaml. The declaration
-of the testcase is simple, connect to your functest-vnf docker, add the
-following section in
-/usr/lib/python2.7/site-packacges/functest/ci/testcases.yaml::
-
- -
- case_name: cloudify_ims_perf
- project_name: functest
- criteria: 80
- blocking: false
- description: >-
- Stress tests based on Cloudify. Ixia loader images and access to Ixia
- server license.
- dependencies:
- installer: ''
- scenario: 'os-nosdn-nofeature-ha'
- run:
- module: 'functest.opnfv_tests.vnf.ims.cloudify_ims_perf'
- class: 'CloudifyImsPerf'
+vIMS has been integrated in Functest to demonstrate the capability to deploy a
+relatively complex NFV scenario on the OPNFV platform. The deployment of a
+complete functional VNF allows the test of most of the essential functions
+needed for a NFV platform.
+
+The goal of this test suite consists of:
+
+* deploy a Clearwater vIMS (IP Multimedia Subsystem) VNF using
+ OpenStack Heat orchestrator based on a HOT template defined in `[17]`_
+* run suite of signaling tests on top of this VNF
+
+The Clearwater architecture is described as follows:
+
+.. figure:: ../../../images/clearwater-architecture-v2.png
+ :align: center
+ :alt: vIMS architecture
vyos-vrouter
^^^^^^^^^^^^
@@ -422,13 +342,41 @@ The vyos-vrouter architecture is described in `[14]`_
juju_epc
^^^^^^^^
+The Evolved Packet Core (EPC) is the main component of the System Architecture
+Evolution (SAE) which forms the core of the 3GPP LTE specification.
+
+vEPC has been integrated in Functest to demonstrate the capability to deploy a
+complex mobility-specific NFV scenario on the OPNFV platform. The OAI EPC
+supports most of the essential functions defined by the 3GPP Technical Specs;
+hence the successful execution of functional tests on the OAI EPC provides a
+good endorsement of the underlying NFV platform.
+
+This integration also includes ABot, a Test Orchestration system that enables
+test scenarios to be defined in high-level DSL. ABot is also deployed as a
+VM on the OPNFV platform; and this provides an example of the automation
+driver and the Test VNF being both deployed as separate VNFs on the underlying
+OPNFV platform.
+
+The Workflow is as follows:
+ * Deploy Orchestrator
+ Deploy Juju controller using Bootstrap command.
+ * Deploy VNF
+ Deploy ABot orchestrator and OAI EPC as Juju charms.
+ Configuration of ABot and OAI EPC components is handled through
+ built-in Juju relations.
+ * Test VNF
+ Execution of ABot feature files triggered by Juju actions.
+ This executes a suite of LTE signalling tests on the OAI EPC.
+ * Reporting
+ ABot test results are parsed accordingly and pushed to Functest Db.
+Details of the ABot test orchestration tool may be found in `[15]`_
Kubernetes (K8s)
----------------
Kubernetes testing relies on sets of tests, which are part of the Kubernetes
-source tree, such as the Kubernetes End-to-End (e2e) tests `[15]`_.
+source tree, such as the Kubernetes End-to-End (e2e) tests `[16]`_.
The kubernetes testcases are distributed across various Tiers:
@@ -450,14 +398,15 @@ The kubernetes testcases are distributed across various Tiers:
designed to be run with no cloud provider configured.
-.. _`[2]`: http://docs.openstack.org/developer/tempest/overview.html
-.. _`[3]`: https://rally.readthedocs.org/en/latest/index.html
+.. _`[2]`: https://docs.openstack.org/tempest/latest/
+.. _`[3]`: https://rally.readthedocs.io/en/latest/index.html
.. _`[5]`: https://github.com/Orange-OpenSource/opnfv-cloudify-clearwater/blob/master/openstack-blueprint.yaml
.. _`[8]`: https://github.com/openstack/refstack-client
-.. _`[9]`: https://github.com/openstack/defcore
+.. _`[9]`: https://github.com/openstack/interop
.. _`[10]`: https://github.com/openstack/interop/blob/master/2016.08/procedure.rst
-.. _`[11]`: http://robotframework.org/
-.. _`[12]`: http://docs.opnfv.org/en/latest/submodules/functest/docs/testing/user/userguide/index.html
-.. _`[13]`: https://wiki.opnfv.org/display/PROJ/SNAPS-OO
+.. _`[11]`: https://robotframework.org/
+.. _`[13]`: https://git.opnfv.org/snaps/
.. _`[14]`: https://github.com/oolorg/opnfv-functest-vrouter
-.. _`[15]`: https://github.com/kubernetes/community/blob/master/contributors/devel/e2e-tests.md
+.. _`[15]`: https://github.com/RebacaInc/abot_charm
+.. _`[16]`: https://github.com/kubernetes/community/blob/master/contributors/devel/sig-testing/e2e-tests.md
+.. _`[17]`: https://github.com/Metaswitch/clearwater-heat/blob/release-129/clearwater.yaml
diff --git a/docs/testing/user/userguide/test_overview.rst b/docs/testing/user/userguide/test_overview.rst
index e40982320..bc3e79dcb 100644
--- a/docs/testing/user/userguide/test_overview.rst
+++ b/docs/testing/user/userguide/test_overview.rst
@@ -11,27 +11,19 @@ infrastructure.
The current list of test suites can be distributed over 5 main domains:
* VIM (Virtualised Infrastructure Manager)
* Controllers (i.e. SDN Controllers)
- * Features
* VNF (Virtual Network Functions)
* Kubernetes
Functest test suites are also distributed in the OPNFV testing categories:
-healthcheck, smoke, features, components, performance, VNF, Stress tests.
+healthcheck, smoke, benchmarking, VNF, Stress tests.
-All the Healthcheck and smoke tests of a given scenario must be succesful to
+All the Healthcheck and smoke tests of a given scenario must be successful to
validate the scenario for the release.
+-------------+---------------+------------+----------------------------------+
| Domain | Tier | Test case | Comments |
+=============+===============+============+==================================+
| VIM | healthcheck | connection | Check OpenStack connectivity |
-| | | \_check | through SNAPS framework |
-| | +------------+----------------------------------+
-| | | api_check | Check OpenStack API through |
-| | | | SNAPS framework |
-| | +------------+----------------------------------+
-| | | snaps | basic instance creation, check |
-| | | \_health | DHCP |
| | | \_check | |
| +---------------+------------+----------------------------------+
| | smoke | vping_ssh | NFV "Hello World" using an SSH |
@@ -55,16 +47,13 @@ validate the scenario for the release.
| | +------------+----------------------------------+
| | | tempest | Generate and run a relevant |
| |               | \_smoke | Tempest Test Suite in smoke mode.|
-| | | \_serial | The generated test set is |
+| | | | The generated test set is |
| | | | dependent on the OpenStack |
| | | | deployment environment |
| | +------------+----------------------------------+
| | | rally | Run a subset of the OpenStack |
| |  | \_sanity | Rally Test Suite in smoke mode |
| | +------------+----------------------------------+
-| | | snaps\ | Run the SNAPS-OO integration |
-| |  | \_smoke | tests |
-| | +------------+----------------------------------+
| | | refstack | Reference RefStack suite |
| | | \_defcore | tempest selection for NFV |
| | +------------+----------------------------------+
@@ -98,48 +87,10 @@ validate the scenario for the release.
| | | | upstream testcases. See below |
| | | | for details |
+-------------+---------------+------------+----------------------------------+
-| Features | features | bgpvpn | Implementation of the OpenStack |
-| | | | bgpvpn API from the SDNVPN |
-| | | | feature project. It allows for |
-| | | | the creation of BGP VPNs. |
-| | | | See `SDNVPN User Guide`_ for |
-| | | | details |
-| | +------------+----------------------------------+
-| | | doctor | Doctor platform, as of Colorado |
-| | | | release, provides the three |
-| | | | features: |
-| | | | * Immediate Notification |
-| | | | * Consistent resource state |
-| | | | awareness for compute host down |
-| | | | * Valid compute host status |
-| | | | given to VM owner |
-| | | | See `Doctor User Guide`_ for |
-| | | | details |
-| | +------------+----------------------------------+
-| | | odl-sfc | SFC testing for odl scenarios |
-| | | | See `SFC User Guide`_ for details|
-| | +------------+----------------------------------+
-| | | parser | Parser is an integration project |
-| | | | which aims to provide |
-| | | | placement/deployment templates |
-| | | | translation for OPNFV platform, |
-| | | | including TOSCA -> HOT, POLICY ->|
-| | | | TOSCA and YANG -> TOSCA. it |
-| | | | deals with a fake vRNC. |
-| | | | See `Parser User Guide`_ for |
-| | | | details |
-| | +------------+----------------------------------+
-| | | fds | Test Suite for the OpenDaylight |
-| | | | SDN Controller when the GBP |
-| | | | features are installed. It |
-| | | | integrates some test suites from |
-| | | | upstream using Robot as the test |
-| | | | framework |
-+-------------+---------------+------------+----------------------------------+
| VNF | vnf | cloudify | Example of a real VNF deployment |
| | | \_ims | to show the NFV capabilities of |
| | | | the platform. The IP Multimedia |
-| | | | Subsytem is a typical Telco test |
+| | | | Subsystem is a typical Telco test|
| | | | case, referenced by ETSI. |
| | | | It provides a fully functional |
| | | | VoIP System |
@@ -147,23 +98,15 @@ validate the scenario for the release.
| | | vyos | vRouter testing |
| | | \_vrouter | |
| | +------------+----------------------------------+
-| | | juju_epc | vEPC validation with Juju as VNF |
-| | | | manager and ABoT as test executor|
-| | +------------+----------------------------------+
-| | | cloudify | Based on cloudify_ims test case |
-| | | \_ims_perf | cloudify_ims_perf substitutes |
-| | | | the signaling test suite by an |
-| | | | automatic deployment of an Ixia |
-| | | | loader and generic SIP stress |
-| | | | tests. |
-| | | | This work has been initiated |
-| | | | during the plugfest and allows |
-| | | | realistic load tests on top of |
-| | | | cloudify_ims. Please note that |
-| | | | this test is available but not |
-| | | | declared in testcases.yaml as it |
-| | | | requires access to proprietary |
-| | | | resources (Ixia loader) |
+| | | juju_epc | Validates deployment of a complex|
+| | | | mobility VNF on OPNFV Platform. |
+| | | | Uses Juju for deploying the OAI |
+| | | | EPC and ABot for defining test |
+| | | | scenarios using high-level DSL. |
+| | | | VNF tests reference 3GPP |
+| | | | Technical Specs and are executed |
+| | | | through protocol drivers provided|
+| | | | by ABot. |
+-------------+---------------+------------+----------------------------------+
| Kubernetes | healthcheck | k8s_smoke | Test a running Kubernetes |
| | | | cluster and ensure it satisfies |
@@ -172,13 +115,6 @@ validate the scenario for the release.
| | smoke | k8s\_ | Run a subset of Kubernetes |
| | | conformance| End-to-End tests, expected to |
| | | | pass on any Kubernetes cluster |
-| +---------------+------------+----------------------------------+
-| | stor4nfv | stor4nfv | Run tests necessary to |
-| | | \_k8s | demonstrate conformance of the |
-| | | | K8s+Stor4NFV deployment |
-| +---------------+------------+----------------------------------+
-| | clover | clover_k8s | Test functionality of |
-| | | | K8s+Istio+Clover deployment. |
+-------------+---------------+------------+----------------------------------+
@@ -195,13 +131,13 @@ In Danube, we merged smoke and sdn controller tiers in smoke tier.
An overview of the Functest Structural Concept is depicted graphically below:
-.. figure:: ../../../images/concepts_mapping_final.png
+.. figure:: ../../../images/concepts_mapping_fraser.png
:align: center
:alt: Functest Concepts Structure
Some of the test cases are developed by Functest team members, whereas others
are integrated from upstream communities or other OPNFV projects. For example,
-`Tempest <http://docs.openstack.org/developer/tempest/overview.html>`_ is the
+`Tempest <https://docs.openstack.org/tempest/latest/>`_ is the
OpenStack integration test suite and Functest is in charge of the selection,
integration and automation of those tests that fit suitably to OPNFV.
@@ -237,12 +173,11 @@ combinations (which may change from one version to another):
Most of the tests are runnable by any combination, but some tests might have
restrictions imposed by the utilized installers or due to the available
-deployed features. The system uses the environment variables (INSTALLER_TYPE
-and DEPLOY_SCENARIO) to automatically determine the valid test cases, for each
-given environment.
+deployed services. The system uses the environment variables to automatically
+determine the valid test cases, for each given environment.
A convenience Functest CLI utility is also available to simplify setting up the
-Functest evironment, management of the OpenStack environment (e.g. resource
+Functest environment, management of the OpenStack environment (e.g. resource
clean-up) and for executing tests.
The Functest CLI organised the testcase into logical Tiers, which contain in
turn one or more testcases. The CLI allows execution of a single specified
@@ -250,10 +185,6 @@ testcase, all test cases in a specified Tier, or the special case of execution
of **ALL** testcases. The Functest CLI is introduced in more details in next
section.
-.. _`[2]`: http://docs.openstack.org/developer/tempest/overview.html
-.. _`[3]`: https://rally.readthedocs.org/en/latest/index.html
-.. _`Doctor User Guide`: http://artifacts.opnfv.org/doctor/colorado/userguide/index.html
-.. _`SDNVPN User Guide`: http://artifacts.opnfv.org/sdnvpn/colorado/docs/userguide/index.html
-.. _`Parser User Guide`: http://artifacts.opnfv.org/parser/colorado/docs/userguide/index.html
-.. _`Functest Dashboard`: http://testresults.opnfv.org/kibana_dashboards/
-.. _`SFC User Guide`: http://artifacts.opnfv.org/sfc/colorado/userguide/index.html
+.. _`[2]`: https://docs.openstack.org/tempest/latest/
+.. _`[3]`: https://rally.readthedocs.io/en/latest/index.html
+.. _`Functest Dashboard`: http://testresults.opnfv.org/
diff --git a/docs/testing/user/userguide/test_results.rst b/docs/testing/user/userguide/test_results.rst
index bb28989ae..10f87d8ec 100644
--- a/docs/testing/user/userguide/test_results.rst
+++ b/docs/testing/user/userguide/test_results.rst
@@ -10,7 +10,7 @@ In manual mode test results are displayed in the console and result files
are put in /home/opnfv/functest/results.
If you want additional logs, you may configure the logging.ini under
-/usr/lib/python2.7/site-packages/xtesting/ci.
+/usr/lib/python3.8/site-packages/xtesting/ci.
Automated testing
-----------------
@@ -21,104 +21,143 @@ end of each suite and can be described as follow.
Healthcheck suite::
- +----------------------------+------------------+---------------------+------------------+----------------+
- | TEST CASE | PROJECT | TIER | DURATION | RESULT |
- +----------------------------+------------------+---------------------+------------------+----------------+
- | connection_check | functest | healthcheck | 00:07 | PASS |
- | api_check | functest | healthcheck | 07:46 | PASS |
- | snaps_health_check | functest | healthcheck | 00:36 | PASS |
- +----------------------------+------------------+---------------------+------------------+----------------+
+ +--------------------------+------------------+---------------------+------------------+----------------+
+ | TEST CASE | PROJECT | TIER | DURATION | RESULT |
+ +--------------------------+------------------+---------------------+------------------+----------------+
+ | connection_check | functest | healthcheck | 00:03 | PASS |
+ | tenantnetwork1 | functest | healthcheck | 00:05 | PASS |
+ | tenantnetwork2 | functest | healthcheck | 00:06 | PASS |
+ | vmready1 | functest | healthcheck | 00:06 | PASS |
+ | vmready2 | functest | healthcheck | 00:08 | PASS |
+ | singlevm1 | functest | healthcheck | 00:32 | PASS |
+ | singlevm2 | functest | healthcheck | 00:37 | PASS |
+ | vping_ssh | functest | healthcheck | 00:46 | PASS |
+ | vping_userdata | functest | healthcheck | 00:39 | PASS |
+ | cinder_test | functest | healthcheck | 01:05 | PASS |
+ | tempest_smoke | functest | healthcheck | 05:39 | PASS |
+ | tempest_horizon | functest | healthcheck | 01:05 | PASS |
+ | odl | functest | healthcheck | 00:00 | SKIP |
+ +--------------------------+------------------+---------------------+------------------+----------------+
Smoke suite::
- +------------------------------+------------------+---------------+------------------+----------------+
- | TEST CASE | PROJECT | TIER | DURATION | RESULT |
- +------------------------------+------------------+---------------+------------------+----------------+
- | vping_ssh | functest | smoke | 00:57 | PASS |
- | vping_userdata | functest | smoke | 00:33 | PASS |
- | tempest_smoke_serial | functest | smoke | 13:22 | PASS |
- | rally_sanity | functest | smoke | 24:07 | PASS |
- | refstack_defcore | functest | smoke | 05:21 | PASS |
- | patrole | functest | smoke | 04:29 | PASS |
- | snaps_smoke | functest | smoke | 46:54 | PASS |
- | odl | functest | smoke | 00:00 | SKIP |
- | neutron_trunk | functest | smoke | 00:00 | SKIP |
- +------------------------------+------------------+---------------+------------------+----------------+
-
-Features suite::
-
- +-----------------------------+------------------------+------------------+------------------+----------------+
- | TEST CASE | PROJECT | TIER | DURATION | RESULT |
- +-----------------------------+------------------------+------------------+------------------+----------------+
- | doctor-notification | doctor | features | 00:00 | SKIP |
- | bgpvpn | sdnvpn | features | 00:00 | SKIP |
- | functest-odl-sfc | sfc | features | 00:00 | SKIP |
- | barometercollectd | barometer | features | 00:00 | SKIP |
- | fds | fastdatastacks | features | 00:00 | SKIP |
- +-----------------------------+------------------------+------------------+------------------+----------------+
-
-Components suite::
-
- +-------------------------------+------------------+--------------------+------------------+----------------+
- | TEST CASE | PROJECT | TIER | DURATION | RESULT |
- +-------------------------------+------------------+--------------------+------------------+----------------+
- | tempest_full_parallel | functest | components | 48:28 | PASS |
- | rally_full | functest | components | 126:02 | PASS |
- +-------------------------------+------------------+--------------------+------------------+----------------+
+ +---------------------------+------------------+---------------+------------------+----------------+
+ | TEST CASE | PROJECT | TIER | DURATION | RESULT |
+ +---------------------------+------------------+---------------+------------------+----------------+
+ | tempest_neutron | functest | smoke | 15:30 | PASS |
+ | tempest_cinder | functest | smoke | 02:01 | PASS |
+ | tempest_keystone | functest | smoke | 01:17 | PASS |
+ | tempest_heat | functest | smoke | 22:14 | PASS |
+ | tempest_telemetry | functest | smoke | 00:00 | SKIP |
+ | rally_sanity | functest | smoke | 17:24 | PASS |
+ | refstack_compute | functest | smoke | 07:03 | PASS |
+ | refstack_object | functest | smoke | 02:09 | PASS |
+ | refstack_platform | functest | smoke | 07:31 | PASS |
+ | tempest_full | functest | smoke | 41:52 | PASS |
+ | tempest_scenario | functest | smoke | 08:42 | PASS |
+ | tempest_slow | functest | smoke | 43:42 | PASS |
+ | patrole_admin | functest | smoke | 21:06 | PASS |
+ | patrole_member | functest | smoke | 21:23 | PASS |
+ | patrole_reader | functest | smoke | 21:56 | PASS |
+ | tempest_barbican | functest | smoke | 02:30 | PASS |
+ | tempest_octavia | functest | smoke | 00:00 | SKIP |
+ | tempest_cyborg | functest | smoke | 00:00 | SKIP |
+ +---------------------------+------------------+---------------+------------------+----------------+
+
+Smoke CNTT suite::
+
+ +-------------------------------+------------------+---------------+------------------+----------------+
+ | TEST CASE | PROJECT | TIER | DURATION | RESULT |
+ +-------------------------------+------------------+---------------+------------------+----------------+
+ | tempest_neutron_cntt | functest | smoke | 11:35 | PASS |
+ | tempest_cinder_cntt | functest | smoke | 01:58 | PASS |
+ | tempest_keystone_cntt | functest | smoke | 01:13 | PASS |
+ | tempest_heat_cntt | functest | smoke | 22:32 | PASS |
+ | rally_sanity_cntt | functest | smoke | 17:16 | PASS |
+ | tempest_full_cntt | functest | smoke | 41:13 | PASS |
+ | tempest_scenario_cntt | functest | smoke | 08:57 | PASS |
+ | tempest_slow_cntt | functest | smoke | 35:58 | PASS |
+ +-------------------------------+------------------+---------------+------------------+----------------+
+
+Benchmarking suite::
+
+ +--------------------+------------------+----------------------+------------------+----------------+
+ | TEST CASE | PROJECT | TIER | DURATION | RESULT |
+ +--------------------+------------------+----------------------+------------------+----------------+
+ | rally_full | functest | benchmarking | 93:03 | PASS |
+ | rally_jobs | functest | benchmarking | 27:05 | PASS |
+ | vmtp | functest | benchmarking | 17:56 | PASS |
+ | shaker | functest | benchmarking | 24:02 | PASS |
+ +--------------------+------------------+----------------------+------------------+----------------+
+
+Benchmarking CNTT suite::
+
+ +-------------------------+------------------+----------------------+------------------+----------------+
+ | TEST CASE | PROJECT | TIER | DURATION | RESULT |
+ +-------------------------+------------------+----------------------+------------------+----------------+
+ | rally_full_cntt | functest | benchmarking | 89:52 | PASS |
+ | rally_jobs_cntt | functest | benchmarking | 19:39 | PASS |
+ | vmtp | functest | benchmarking | 16:59 | PASS |
+ | shaker | functest | benchmarking | 23:43 | PASS |
+ +-------------------------+------------------+----------------------+------------------+----------------+
Vnf suite::
- +----------------------+------------------+--------------+------------------+----------------+
- | TEST CASE | PROJECT | TIER | DURATION | RESULT |
- +----------------------+------------------+--------------+------------------+----------------+
- | cloudify_ims | functest | vnf | 28:15 | PASS |
- | vyos_vrouter | functest | vnf | 17:59 | PASS |
- | juju_epc | functest | vnf | 46:44 | PASS |
- +----------------------+------------------+--------------+------------------+----------------+
-
-Parser testcase::
-
- +-----------------------+-----------------+------------------+------------------+----------------+
- | TEST CASE | PROJECT | TIER | DURATION | RESULT |
- +-----------------------+-----------------+------------------+------------------+----------------+
- | parser-basics | parser | features | 00:00 | SKIP |
- +-----------------------+-----------------+------------------+------------------+----------------+
-
-Functest Kubernetes test result::
-
- +--------------------------------------+------------------------------------------------------------+
- | ENV VAR | VALUE |
- +--------------------------------------+------------------------------------------------------------+
- | INSTALLER_TYPE | compass |
- | DEPLOY_SCENARIO | k8-nosdn-nofeature-ha |
- | BUILD_TAG | jenkins-functest-compass-baremetal-daily-master-75 |
- | CI_LOOP | daily |
- +--------------------------------------+------------------------------------------------------------+
+ +----------------------+------------------+--------------+------------------+----------------+
+ | TEST CASE | PROJECT | TIER | DURATION | RESULT |
+ +----------------------+------------------+--------------+------------------+----------------+
+ | cloudify | functest | vnf | 05:08 | PASS |
+ | cloudify_ims | functest | vnf | 24:46 | PASS |
+ | heat_ims | functest | vnf | 33:12 | PASS |
+ | vyos_vrouter | functest | vnf | 15:53 | PASS |
+ | juju_epc | functest | vnf | 27:52 | PASS |
+ +----------------------+------------------+--------------+------------------+----------------+
Kubernetes healthcheck suite::
- +-------------------+------------------+---------------------+------------------+----------------+
- | TEST CASE | PROJECT | TIER | DURATION | RESULT |
- +-------------------+------------------+---------------------+------------------+----------------+
- | k8s_smoke | functest | healthcheck | 01:54 | PASS |
- +-------------------+------------------+---------------------+------------------+----------------+
+ +-------------------+------------------+---------------------+------------------+----------------+
+ | TEST CASE | PROJECT | TIER | DURATION | RESULT |
+ +-------------------+------------------+---------------------+------------------+----------------+
+ | k8s_quick | functest | healthcheck | 00:18 | PASS |
+ | k8s_smoke | functest | healthcheck | 01:14 | PASS |
+ +-------------------+------------------+---------------------+------------------+----------------+
Kubernetes smoke suite::
- +-------------------------+------------------+---------------+------------------+----------------+
- | TEST CASE | PROJECT | TIER | DURATION | RESULT |
- +-------------------------+------------------+---------------+------------------+----------------+
- | k8s_conformance | functest | smoke | 57:47 | PASS |
- +-------------------------+------------------+---------------+------------------+----------------+
-
-Kubernetes features suite::
-
- +----------------------+------------------+------------------+------------------+----------------+
- | TEST CASE | PROJECT | TIER | DURATION | RESULT |
- +----------------------+------------------+------------------+------------------+----------------+
- | stor4nfv_k8s | stor4nfv | stor4nfv | 00:00 | SKIP |
- | clover_k8s | clover | clover | 00:00 | SKIP |
- +----------------------+------------------+------------------+------------------+----------------+
+ +---------------------------+------------------+---------------+------------------+----------------+
+ | TEST CASE | PROJECT | TIER | DURATION | RESULT |
+ +---------------------------+------------------+---------------+------------------+----------------+
+ | k8s_conformance | functest | smoke | 94:26 | PASS |
+ | xrally_kubernetes | functest | smoke | 13:05 | PASS |
+ +---------------------------+------------------+---------------+------------------+----------------+
+
+Kubernetes security suite::
+
+ +---------------------------+------------------+------------------+------------------+----------------+
+ | TEST CASE | PROJECT | TIER | DURATION | RESULT |
+ +---------------------------+------------------+------------------+------------------+----------------+
+ | kube_hunter | functest | security | 00:19 | PASS |
+ | kube_bench_master | functest | security | 00:02 | PASS |
+ | kube_bench_node | functest | security | 00:01 | PASS |
+ +---------------------------+------------------+------------------+------------------+----------------+
+
+Kubernetes benchmarking suite::
+
+ +--------------------------------+------------------+----------------------+------------------+----------------+
+ | TEST CASE | PROJECT | TIER | DURATION | RESULT |
+ +--------------------------------+------------------+----------------------+------------------+----------------+
+ | xrally_kubernetes_full | functest | benchmarking | 34:16 | PASS |
+ +--------------------------------+------------------+----------------------+------------------+----------------+
+
+Kubernetes cnf suite::
+
+ +-------------------------+------------------+--------------+------------------+----------------+
+ | TEST CASE | PROJECT | TIER | DURATION | RESULT |
+ +-------------------------+------------------+--------------+------------------+----------------+
+ | k8s_vims | functest | cnf | 09:06 | PASS |
+ | helm_vims | functest | cnf | 08:54 | PASS |
+ | cnf_conformance | functest | cnf | 02:00 | PASS |
+ +-------------------------+------------------+--------------+------------------+----------------+
Results are automatically pushed to the test results database, some additional
result files are pushed to OPNFV artifact web sites.
diff --git a/docs/testing/user/userguide/troubleshooting.rst b/docs/testing/user/userguide/troubleshooting.rst
index cce9d009d..d857ed4c4 100644
--- a/docs/testing/user/userguide/troubleshooting.rst
+++ b/docs/testing/user/userguide/troubleshooting.rst
@@ -20,8 +20,7 @@ VIM
---
This section covers the test cases related to the VIM (healthcheck, vping_ssh,
-vping_userdata, tempest_smoke_serial, tempest_full_parallel, rally_sanity,
-rally_full).
+vping_userdata, tempest_smoke, tempest_full, rally_sanity, rally_full).
vPing common
^^^^^^^^^^^^
@@ -39,14 +38,14 @@ respective section.
These test cases can be run inside the container, using new Functest CLI as
follows::
- $ functest testcase run vping_ssh
- $ functest testcase run vping_userdata
+ $ run_tests -t vping_ssh
+ $ run_tests -t vping_userdata
The Functest CLI is designed to route a call to the corresponding internal
python scripts, located in paths::
- /usr/lib/python2.7/site-packages/functest/opnfv_tests/openstack/vping/vping_ssh.py
- /usr/lib/python2.7/site-packages/functest/opnfv_tests/openstack/vping/vping_userdata.py
+ /usr/lib/python3.8/site-packages/functest/opnfv_tests/openstack/vping/vping_ssh.py
+ /usr/lib/python3.8/site-packages/functest/opnfv_tests/openstack/vping/vping_userdata.py
Notes:
@@ -103,7 +102,7 @@ In this case, proceed to create it manually. These are some hints::
--protocol tcp --port-range-min 80 --port-range-max 80 --remote-ip-prefix 0.0.0.0/0
The next step is to create the instances. The image used is located in
-*/home/opnfv/functest/data/cirros-0.4.0-x86_64-disk.img* and a Glance image is
+*/home/opnfv/functest/data/cirros-0.5.1-x86_64-disk.img* and a Glance image is
created with the name **functest-vping**. If booting the instances fails (i.e.
the status is not **ACTIVE**), you can check why it failed by doing::
@@ -126,7 +125,7 @@ This test case creates a floating IP on the external network and assigns it to
the second instance **opnfv-vping-2**. The purpose of this is to establish
a SSH connection to that instance and SCP a script that will ping the first
instance. This script is located in the repository under
-/usr/lib/python2.7/site-packages/functest/opnfv_tests/openstack/vping/ping.sh
+/usr/lib/python3.8/site-packages/functest/opnfv_tests/openstack/vping/ping.sh
and takes an IP as a parameter. When the SCP is completed, the test will do a
SSH call to that script inside the second instance. Some problems can happen
here::
@@ -134,8 +133,8 @@ here::
vPing_ssh- ERROR - Cannot establish connection to IP xxx.xxx.xxx.xxx. Aborting
If this is displayed, stop the test or wait for it to finish, if you have used
-the special method of test invocation with specific supression of OpenStack
-resource clean-up, as explained earler. It means that the Container can not
+the special method of test invocation with specific suppression of OpenStack
+resource clean-up, as explained earlier. It means that the Container can not
reach the Public/External IP assigned to the instance **opnfv-vping-2**. There
are many possible reasons, and they really depend on the chosen scenario. For
most of the ODL-L3 and ONOS scenarios this has been noticed and it is a known
@@ -159,7 +158,7 @@ container::
ping <public IP>
If the ping does not return anything, try to ping from the Host where the
-Docker container is running. If that solves the problem, check the iptable
+Docker container is running. If that solves the problem, check the iptables
rules because there might be some rules rejecting ICMP or TCP traffic
coming/going from/to the container.
@@ -259,42 +258,30 @@ debug information can be found from tempest.log file stored into related Rally
deployment folder.
Functest offers a possibility to test a customized list of Tempest test cases.
-To enable that, add a new entry in docker/components/testcases.yaml on the
-"components" container with the following content::
-
- -
- case_name: tempest_custom
- project_name: functest
- criteria: 100
- blocking: false
- description: >-
- The test case allows running a customized list of tempest
- test cases
- dependencies:
- installer: ''
- scenario: ''
- run:
- module: 'functest.opnfv_tests.openstack.tempest.tempest'
- class: 'TempestCustom'
-
-Also, a list of the Tempest test cases must be provided to the container or
-modify the existing one in
-/usr/lib/python2.7/site-packages/functest/opnfv_tests/openstack/tempest/custom_tests/test_list.txt
-
-Example of custom list of tests 'my-custom-tempest-tests.txt'::
-
- tempest.scenario.test_server_basic_ops.TestServerBasicOps.test_server_basic_ops[compute,id-7fff3fb3-91d8-4fd0-bd7d-0204f1f180ba,network,smoke]
- tempest.scenario.test_network_basic_ops.TestNetworkBasicOps.test_network_basic_ops[compute,id-f323b3ba-82f8-4db7-8ea6-6a895869ec49,network,smoke]
+To enable that, add a new entry in docker/smoke/testcases.yaml on the
+"smoke" container with the following content::
+
+ -
+ case_name: tempest_custom
+ project_name: functest
+ criteria: 100
+ blocking: false
+ description: >-
+ The test case allows running a customized list of tempest
+ test cases
+ run:
+ name: tempest_common
+ args:
+ mode: "tempest.scenario.test_server_basic_ops.TestServerBasicOps.test_server_basic_ops|\
+ tempest.scenario.test_network_basic_ops.TestNetworkBasicOps.test_network_basic_ops"
This is an example of running a customized list of Tempest tests in Functest::
sudo docker run --env-file env \
-v $(pwd)/openstack.creds:/home/opnfv/functest/conf/env_file \
-v $(pwd)/images:/home/opnfv/functest/images \
- -v $(pwd)/my-custom-testcases.yaml:/usr/lib/python2.7/site-packages/functest/ci/testcases.yaml \
- -v $(pwd)/my-custom-tempest-tests.txt:/usr/lib/python2.7/site-packages/functest/opnfv_tests/openstack/tempest/custom_tests/test_list.txt \
- opnfv/functest-components run_tests -t tempest_custom
-
+ -v $(pwd)/my-custom-testcases.yaml:/usr/lib/python3.8/site-packages/xtesting/ci/testcases.yaml \
+ opnfv/functest-smoke run_tests -t tempest_custom
Rally
^^^^^
@@ -315,14 +302,14 @@ Possible scenarios are:
To know more about what those scenarios are doing, they are defined in
directory:
-/usr/lib/python2.7/site-packages/functest/opnfv_tests/openstack/rally/scenario
+/usr/lib/python3.8/site-packages/functest/opnfv_tests/openstack/rally/scenario
For more info about Rally scenario definition please refer to the Rally
official documentation. `[3]`_
To check any possible problems with Rally, the logs are stored under
*/home/opnfv/functest/results/rally/* in the Functest Docker container.
-.. _`[3]`: https://rally.readthedocs.org/en/latest/index.html
+.. _`[3]`: https://rally.readthedocs.io/en/latest/index.html
Controllers
-----------
diff --git a/elements/functest/element-deps b/elements/functest/element-deps
new file mode 100644
index 000000000..d06e3d771
--- /dev/null
+++ b/elements/functest/element-deps
@@ -0,0 +1 @@
+xtestingci
diff --git a/elements/functest/install.d/16-functest b/elements/functest/install.d/16-functest
new file mode 100755
index 000000000..97d37e499
--- /dev/null
+++ b/elements/functest/install.d/16-functest
@@ -0,0 +1,14 @@
+#!/bin/bash
+
+download-frozen-image-v2.sh /data/docker/functest \
+ opnfv/functest-healthcheck:latest \
+ opnfv/functest-smoke:latest \
+ opnfv/functest-smoke-cntt:latest \
+ opnfv/functest-benchmarking:latest \
+ opnfv/functest-benchmarking-cntt:latest \
+ opnfv/functest-vnf:latest
+mkdir -p /data/images && wget -q -O- https://git.opnfv.org/functest/plain/functest/ci/download_images.sh | sh -s -- /data/images && ls -1 /data/images/*
+git clone https://git.opnfv.org/functest /home/debian/functest
+chown -R 1000:1000 /home/debian/functest
+
+exit 0
diff --git a/functest/api/base.py b/functest/api/base.py
deleted file mode 100644
index b10482931..000000000
--- a/functest/api/base.py
+++ /dev/null
@@ -1,68 +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 _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 ce83edd88..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 socket
-
-from flask import jsonify
-from flasgger.utils import swag_from
-import pkg_resources
-from xtesting.ci import run_tests
-
-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 constants
-
-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 """
- run_tests.Runner.source_envfile(constants.ENV_FILE)
- 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 = constants.ENV_FILE
- with open(rc_file, 'w') as creds_file:
- creds_file.writelines(lines)
-
- LOGGER.info("Sourcing the OpenStack RC file...")
- try:
- run_tests.Runner.source_envfile(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 d808ae3c9..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 socket
-
-import IPy
-from flask import jsonify
-from flasgger.utils import swag_from
-import pkg_resources
-
-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 30501adf7..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 uuid
-
-from flask import jsonify
-from flasgger.utils import swag_from
-import pkg_resources
-
-from functest.api.base import ApiResource
-from functest.api.common import api_utils
-from functest.api.database.v1.handlers import TasksHandler
-from functest.utils import config
-
-
-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 = getattr(config.CONF, '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 43340625b..000000000
--- a/functest/api/resources/v1/testcases.py
+++ /dev/null
@@ -1,157 +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 ConfigParser
-import logging
-import os
-import re
-import socket
-import uuid
-
-from flask import jsonify
-from flasgger.utils import swag_from
-import pkg_resources
-
-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 import config
-from functest.utils import env
-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': env.get('INSTALLER_TYPE'),
- 'scenario': env.get('DEPLOY_SCENARIO'),
- 'build_tag': env.get('BUILD_TAG'),
- 'ci_loop': env.get('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"""
- rconfig = ConfigParser.RawConfigParser()
- rconfig.read(
- pkg_resources.resource_filename('xtesting', 'ci/logging.ini'))
- log_path = os.path.join(getattr(config.CONF, 'dir_results'),
- '{}.log'.format(task_id))
- rconfig.set('handler_file', 'args', '("{}",)'.format(log_path))
-
- with open(
- pkg_resources.resource_filename(
- 'xtesting', 'ci/logging.ini'), 'wb') as configfile:
- rconfig.write(configfile)
diff --git a/functest/api/resources/v1/tiers.py b/functest/api/resources/v1/tiers.py
deleted file mode 100644
index 58540425b..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 re
-
-from flask import jsonify
-from flasgger.utils import swag_from
-import pkg_resources
-
-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 2a6b228ff..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-option-value,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 a475491a1..000000000
--- a/functest/ci/check_deployment.py
+++ /dev/null
@@ -1,188 +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 socket
-
-import pkg_resources
-from six.moves import urllib
-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
-
-from functest.utils import constants
-from functest.opnfv_tests.openstack.snaps import snaps_utils
-
-__author__ = "Jose Lausuch <jose.lausuch@ericsson.com>"
-
-LOGGER = logging.getLogger(__name__)
-
-
-def verify_connectivity(endpoint):
- """ Returns true if an hostname/port is reachable"""
- try:
- connection = socket.socket()
- connection.settimeout(10)
- url = urllib.parse.urlparse(endpoint)
- port = url.port
- if not port:
- port = 443 if url.scheme == "https" else 80
- connection.connect((url.hostname, port))
- LOGGER.debug('%s:%s is reachable!', url.hostname, port)
- return True
- except socket.error:
- LOGGER.error('%s:%s is not reachable.', url.hostname, port)
- except Exception: # pylint: disable=broad-except
- LOGGER.exception(
- 'Errors when verifying connectivity to %s:%s', url.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=constants.ENV_FILE):
- 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 172153059..647301ab4 100644
--- a/functest/ci/config_functest.yaml
+++ b/functest/ci/config_functest.yaml
@@ -11,17 +11,17 @@ general:
functest_conf: /home/opnfv/functest/conf
functest_data: /home/opnfv/functest/data
ims_data: /home/opnfv/functest/data/ims/
+ rally_data: /home/opnfv/functest/data/rally
refstack_data: /home/opnfv/functest/data/refstack
- router_data: /home/opnfv/functest/data/router/
+ router_data: /home/opnfv/functest/data/router/opnfv-vnf-data
functest_images: /home/opnfv/functest/images
rally_inst: /root/.rally
openstack:
- 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
@@ -42,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
@@ -94,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
@@ -104,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
@@ -112,35 +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'
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:
@@ -155,10 +108,8 @@ vnf:
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
diff --git a/functest/ci/config_patch.yaml b/functest/ci/config_patch.yaml
index dfd441b57..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'}
- openstack:
- flavor_ram: 1024
+ 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'}
- openstack:
- flavor_ram: 1024
+ 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 d0b302d94..a56c02b60 100644
--- a/functest/ci/download_images.sh
+++ b/functest/ci/download_images.sh
@@ -1,22 +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://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
+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 d01472507..dde079493 100644
--- a/functest/ci/logging.ini
+++ b/functest/ci/logging.ini
@@ -1,5 +1,5 @@
[loggers]
-keys=root,functest,api,ci,core,cli,opnfv_tests,utils,xtesting,xci,xcore,energy,xutils
+keys=root,functest,api,ci,core,cli,opnfv_tests,utils,xtesting,xci,xcore,xutils,sfc,baro,warnings
[handlers]
keys=console,wconsole,file,null
@@ -61,16 +61,26 @@ level=NOTSET
handlers=console
qualname=xtesting.core
-[logger_energy]
-level=NOTSET
-handlers=wconsole
-qualname=xtesting.energy
-
[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
@@ -91,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/testcases.yaml b/functest/ci/testcases.yaml
index f5c568d98..acf5a7199 100644
--- a/functest/ci/testcases.yaml
+++ b/functest/ci/testcases.yaml
@@ -2,8 +2,6 @@
tiers:
-
name: healthcheck
- order: 0
- ci_loop: '(merge)|(verify)|(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: ''
- 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: ''
- 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: '^((?!lxd).)*$'
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: ''
- 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,220 +279,632 @@ tiers:
description: >-
This test case runs a sub group of tests of the OpenStack
Rally suite in smoke mode.
+ run:
+ name: rally_sanity
+ args:
+ optional:
+ - 'gnocchi'
+ - 'barbican'
+
+ -
+ case_name: refstack_compute
+ project_name: functest
+ criteria: 100
+ blocking: false
+ description: >-
+ This test case runs a sub group of tests of the OpenStack
+ Compute testcases.
dependencies:
- installer: ''
- scenario: ''
+ - NO_TENANT_NETWORK: '^(?![tT]rue$)'
run:
- module: 'functest.opnfv_tests.openstack.rally.rally'
- class: 'RallySanity'
+ name: refstack
+ args:
+ target: compute
+ option:
+ - '--concurrency=4'
-
- case_name: refstack_defcore
+ case_name: refstack_object
project_name: functest
- enabled: false
criteria: 100
blocking: false
description: >-
This test case runs a sub group of tests of the OpenStack
- Defcore testcases.
+ Object testcases.
+ run:
+ name: refstack
+ args:
+ target: object
+ option:
+ - '--concurrency=4'
+
+ -
+ case_name: refstack_platform
+ project_name: functest
+ criteria: 100
+ blocking: false
+ description: >-
+ This test case runs a sub group of tests of the OpenStack
+ Platform testcases.
dependencies:
- installer: ''
- scenario: ''
+ - NO_TENANT_NETWORK: '^(?![tT]rue$)'
+ run:
+ name: refstack
+ args:
+ target: platform
+ option:
+ - '--concurrency=4'
+
+ -
+ case_name: tempest_full
+ 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#L83
run:
- module:
- 'functest.opnfv_tests.openstack.refstack.refstack'
- class: 'Refstack'
+ name: tempest_common
+ args:
+ mode: '(?!.*\[.*\bslow\b.*\])(^tempest\.api)'
+ option:
+ - '--concurrency=4'
+
+ -
+ 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:
+ name: tempest_common
+ args:
+ mode: '(?!.*\[.*\bslow\b.*\])(^tempest\.scenario)'
+ option:
+ - '--concurrency=1'
-
- case_name: patrole
+ case_name: tempest_slow
+ 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:
+ name: tempest_common
+ args:
+ mode: '(?=.*\[.*\bslow\b.*\])(^tempest\.)'
+ option:
+ - '--concurrency=1'
+
+ -
+ case_name: patrole_admin
project_name: functest
criteria: 100
blocking: false
description: >-
Test suite from Patrole project.
- dependencies:
- installer: ''
- scenario: ''
run:
- module: 'functest.opnfv_tests.openstack.patrole.patrole'
- class: 'Patrole'
+ name: patrole
args:
- role: 'admin'
- services:
- - 'image'
- - 'network'
- exclude:
- - 'test_networks_multiprovider_rbac'
+ 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: odl
+ case_name: patrole_member
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'
+ Test suite from Patrole project.
run:
- module: 'functest.opnfv_tests.sdn.odl.odl'
- class: 'ODLTests'
+ name: patrole
args:
- suites:
- - /src/odl_test/csit/suites/integration/basic
- - /src/odl_test/csit/suites/openstack/neutron
+ 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: snaps_smoke
+ case_name: patrole_reader
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.
+ Test suite from Patrole project.
+ run:
+ 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'
- dependencies:
- installer: ''
- scenario: '^((?!lxd).)*$'
+ -
+ case_name: tempest_barbican
+ project_name: functest
+ criteria: 100
+ blocking: false
+ description: >-
+ It leverages on the tempest plugin containing tests used to
+ verify the functionality of a barbican installation.
run:
- module: 'functest.opnfv_tests.openstack.snaps.smoke'
- class: 'SnapsSmoke'
+ name: barbican
+ args:
+ mode:
+ '^barbican_tempest_plugin.((?!test_signed_image_upload_boot_failure).)*$'
+ services:
+ - barbican
+ option:
+ - '--concurrency=4'
-
- case_name: neutron_trunk
+ case_name: tempest_octavia
project_name: functest
criteria: 100
blocking: false
description: >-
- This test case runs the neutron trunk subtest of the
- OpenStack Tempest suite. The list of test cases is
- generated by Tempest having as input the relevant
- testcase list file.
- dependencies:
- installer: '(fuel)|(apex)|(compass)'
- scenario: ''
+ It leverages on the tempest plugin containing tests used to
+ verify the functionality of an octavia installation.
run:
- module: 'functest.opnfv_tests.openstack.tempest.tempest'
- class: 'TempestNeutronTrunk'
+ 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: features
- order: 2
- ci_loop: '(daily)|(weekly)'
+ name: smoke_cntt
description: >-
- Test suites from feature projects
- integrated in functest
+ Set of basic Functional tests to validate the OPNFV scenarios.
testcases:
-
- case_name: doctor-notification
- project_name: doctor
+ case_name: tempest_neutron_cntt
+ project_name: functest
criteria: 100
blocking: false
+ deny_skipping: true
+ tests_count: 564
description: >-
- Test suite from Doctor project.
- dependencies:
- installer: '(apex)|(fuel)|(daisy)'
- scenario: '^((?!fdio|nofeature).)*$'
+ 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:
- module: 'xtesting.core.feature'
- class: 'BashFeature'
+ name: tempest_common
args:
- cmd: 'doctor-test'
+ 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: bgpvpn
- project_name: sdnvpn
+ case_name: tempest_cinder_cntt
+ project_name: functest
criteria: 100
blocking: false
+ deny_skipping: true
+ tests_count: 10
description: >-
- Test suite from SDNVPN project.
- dependencies:
- installer: ''
- scenario: 'bgpvpn'
+ This test case runs the Tempest suite proposed by the
+ Cinder project.
run:
- module: 'sdnvpn.test.functest.run_sdnvpn_tests'
- class: 'SdnvpnFunctest'
+ 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: functest-odl-sfc
- project_name: sfc
+ case_name: tempest_keystone_cntt
+ project_name: functest
criteria: 100
blocking: false
+ deny_skipping: true
+ tests_count: 27
description: >-
- Test suite for odl-sfc to test two chains with one SF and
- one chain with two SFs
- dependencies:
- installer: ''
- scenario: 'odl.*sfc'
+ This test case runs the Tempest suite proposed by the
+ Keystone project.
run:
- module: 'sfc.tests.functest.run_sfc_tests'
- class: 'SfcFunctest'
+ name: tempest_common
+ args:
+ mode: "(?!.*api.identity.v3.test_oauth1_tokens)\
+ (?!.*rbac)\
+ (?!.*scenario.test_federated_authentication)\
+ keystone_tempest_plugin."
+ option:
+ - '--concurrency=4'
-
- case_name: barometercollectd
- project_name: barometer
+ case_name: tempest_heat_cntt
+ project_name: functest
criteria: 100
blocking: false
+ deny_skipping: true
+ tests_count: 124
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: ''
- scenario: 'bar'
+ This test case runs the Tempest suite proposed by the
+ Heat project.
run:
- module: 'baro_tests.barometer'
- class: 'BarometerCollectd'
+ 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: fds
- project_name: fastdatastacks
+ case_name: rally_sanity_cntt
+ 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: ''
- scenario: 'odl.*-fdio'
+ This test case runs a sub group of tests of the OpenStack
+ Rally suite in smoke mode.
run:
- module: 'functest.opnfv_tests.sdn.odl.odl'
- class: 'ODLTests'
+ name: rally_sanity
args:
- suites:
- - /src/fds/testing/robot
+ tests:
+ - 'authenticate'
+ - 'glance'
+ - 'cinder'
+ - 'heat'
+ - 'keystone'
+ - 'neutron'
+ - 'nova'
+ - 'quotas'
+ - 'swift'
- -
- name: components
- order: 3
- ci_loop: 'weekly'
- description: >-
- Extensive testing of OpenStack API.
- testcases:
-
- case_name: tempest_full_parallel
+ case_name: tempest_full_cntt
project_name: functest
- criteria: 80
+ 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: ''
- 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
@@ -348,35 +913,141 @@ tiers:
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:
- installer: ''
- scenario: ''
+ - NO_TENANT_NETWORK: '^(?![tT]rue$)'
run:
- module: 'functest.opnfv_tests.openstack.rally.rally'
- class: 'RallyFull'
+ 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:
+ - NO_TENANT_NETWORK: '^(?![tT]rue$)'
+ run:
+ 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
+ project_name: functest
+ criteria: 100
+ blocking: false
+ description: >-
+ This test case deploys the Cloudify orchestrator.
+ run:
+ name: cloudify
+ -
case_name: cloudify_ims
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-.*-nofeature-.*ha'
+ - NO_TENANT_NETWORK: '^(?![tT]rue$)'
+ run:
+ name: cloudify_ims
+
+ -
+ case_name: heat_ims
+ project_name: functest
+ criteria: 100
+ blocking: false
+ description: >-
+ This test case deploys an OpenSource vIMS solution from
+ Clearwater using the OpenStack Heat orchestrator.
+ It also runs some signaling traffic.
+ dependencies:
+ - NO_TENANT_NETWORK: '^(?![tT]rue$)'
run:
- module: 'functest.opnfv_tests.vnf.ims.cloudify_ims'
- class: 'CloudifyIms'
+ name: heat_ims
-
case_name: vyos_vrouter
@@ -386,11 +1057,9 @@ tiers:
description: >-
This test case is vRouter testing.
dependencies:
- installer: ''
- scenario: 'os-.*-nofeature-.*ha'
+ - NO_TENANT_NETWORK: '^(?![tT]rue$)'
run:
- module: 'functest.opnfv_tests.vnf.router.cloudify_vrouter'
- class: 'CloudifyVrouter'
+ name: vyos_vrouter
-
case_name: juju_epc
@@ -401,8 +1070,6 @@ tiers:
vEPC validation with Juju as VNF manager and ABoT as test
executor.
dependencies:
- installer: ''
- scenario: 'os-.*-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/cli/__init__.py b/functest/cli/__init__.py
deleted file mode 100644
index e69de29bb..000000000
--- a/functest/cli/__init__.py
+++ /dev/null
diff --git a/functest/cli/cli_base.py b/functest/cli/cli_base.py
deleted file mode 100644
index 1a057e1bf..000000000
--- a/functest/cli/cli_base.py
+++ /dev/null
@@ -1,129 +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
-
-# pylint: disable=missing-docstring
-
-import logging.config
-import pkg_resources
-
-import click
-
-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): # pylint: disable=unused-argument
- pass
-
-
-@cli.group()
-@click.pass_context
-def openstack(ctx): # pylint: disable=unused-argument
- pass
-
-
-@cli.group()
-@click.pass_context
-def testcase(ctx): # pylint: disable=unused-argument
- pass
-
-
-@cli.group()
-@click.pass_context
-def tier(ctx): # pylint: disable=unused-argument
- 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/__init__.py b/functest/cli/commands/__init__.py
deleted file mode 100644
index e69de29bb..000000000
--- a/functest/cli/commands/__init__.py
+++ /dev/null
diff --git a/functest/cli/commands/cli_env.py b/functest/cli/commands/cli_env.py
deleted file mode 100644
index 18c8895ae..000000000
--- a/functest/cli/commands/cli_env.py
+++ /dev/null
@@ -1,49 +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
-
-# pylint: disable=missing-docstring
-
-import click
-import prettytable
-import six
-
-from functest.utils import env
-
-
-class Env(object): # pylint: disable=too-few-public-methods
-
- @staticmethod
- def show():
- install_type = env.get('INSTALLER_TYPE')
- scenario = env.get('DEPLOY_SCENARIO')
- node = env.get('NODE_NAME')
- build_tag = env.get('BUILD_TAG')
- if build_tag:
- build_tag = build_tag.lstrip(
- "jenkins-").lstrip("functest").lstrip("-")
-
- env_info = {'INSTALLER': install_type,
- 'SCENARIO': scenario,
- 'POD': node,
- 'BUILD_TAG': build_tag}
-
- return env_info
-
-
-class CliEnv(object): # pylint: disable=too-few-public-methods
-
- @staticmethod
- def show():
- env_info = Env.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 d3e229c81..000000000
--- a/functest/cli/commands/cli_os.py
+++ /dev/null
@@ -1,63 +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
-
-# pylint: disable=missing-docstring
-
-import os
-
-import click
-from six.moves import urllib
-
-from functest.ci import check_deployment
-from functest.utils import constants
-
-
-class OpenStack(object):
-
- def __init__(self):
- self.os_auth_url = os.environ.get('OS_AUTH_URL', None)
- self.endpoint_ip = None
- self.endpoint_port = None
- self.openstack_creds = constants.ENV_FILE
- if self.os_auth_url:
- self.endpoint_ip = urllib.parse.urlparse(self.os_auth_url).hostname
- self.endpoint_port = urllib.parse.urlparse(self.os_auth_url).port
-
- def ping_endpoint(self):
- if self.os_auth_url is None:
- click.echo("Source the OpenStack credentials first")
- 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):
-
- @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 a8ead5f53..000000000
--- a/functest/cli/commands/cli_testcase.py
+++ /dev/null
@@ -1,50 +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
-
-# pylint: disable=missing-docstring
-
-import click
-
-from functest.cli.commands import cli_tier
-from functest.utils import functest_utils
-
-
-class Testcase(cli_tier.Tier):
-
- 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, name):
- description = self.tiers.get_test(name)
- return description
-
- @staticmethod
- def run(name, noclean=False, report=False):
- tests = name.split(",")
- for test in tests:
- cmd = "run_tests {}-t {}".format(
- Testcase.get_flags(noclean, report), test)
- functest_utils.execute_command(cmd)
-
-
-class CliTestcase(Testcase):
-
- def list(self):
- click.echo(super(CliTestcase, self).list())
-
- def show(self, name):
- testcase_show = super(CliTestcase, self).show(name)
- if testcase_show:
- click.echo(testcase_show)
- else:
- click.echo("The test case '%s' does not exist or is not supported."
- % name)
diff --git a/functest/cli/commands/cli_tier.py b/functest/cli/commands/cli_tier.py
deleted file mode 100644
index ad722a1b9..000000000
--- a/functest/cli/commands/cli_tier.py
+++ /dev/null
@@ -1,87 +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
-
-# pylint: disable=missing-docstring
-
-import pkg_resources
-
-import click
-from xtesting.ci import tier_builder
-
-from functest.utils import functest_utils
-from functest.utils import env
-
-
-class Tier(object):
-
- def __init__(self):
- self.tiers = tier_builder.TierBuilder(
- env.get('INSTALLER_TYPE'),
- env.get('DEPLOY_SCENARIO'),
- pkg_resources.resource_filename('xtesting', '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, name):
- tier = self.tiers.get_tier(name)
- if tier is None:
- return None
- tier_info = self.tiers.get_tier(name)
- return tier_info
-
- def gettests(self, name):
- tier = self.tiers.get_tier(name)
- if tier is None:
- return None
- tests = tier.get_test_names()
- return tests
-
- @staticmethod
- def get_flags(noclean=False, report=False):
- flags = ""
- if noclean:
- flags += "-n "
- if report:
- flags += "-r "
- return flags
-
- @staticmethod
- def run(name, noclean=False, report=False):
- cmd = "run_tests {}-t {}".format(Tier.get_flags(noclean, report), name)
- functest_utils.execute_command(cmd)
-
-
-class CliTier(Tier):
-
- def list(self):
- click.echo(super(CliTier, self).list())
-
- def show(self, name):
- tier_info = super(CliTier, self).show(name)
- 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" % (name, tier_names))
-
- def gettests(self, name):
- tests = super(CliTier, self).gettests(name)
- if tests:
- click.echo("Test cases in tier '%s':\n %s\n" % (name, 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" % (name, 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/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/vnf.py b/functest/core/vnf.py
deleted file mode 100644
index a6afd4e6b..000000000
--- a/functest/core/vnf.py
+++ /dev/null
@@ -1,187 +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 uuid
-
-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.utils import keystone_utils
-from snaps.openstack.tests import openstack_tests
-
-from xtesting.core import vnf
-from functest.utils import constants
-
-__author__ = ("Morgan Richomme <morgan.richomme@orange.com>, "
- "Valentin Boucher <valentin.boucher@orange.com>")
-
-
-class VnfPreparationException(vnf.VnfPreparationException):
- """Raise when VNF preparation cannot be executed."""
-
-
-class OrchestratorDeploymentException(vnf.OrchestratorDeploymentException):
- """Raise when orchestrator cannot be deployed."""
-
-
-class VnfDeploymentException(vnf.VnfDeploymentException):
- """Raise when VNF cannot be deployed."""
-
-
-class VnfTestException(vnf.VnfTestException):
- """Raise when VNF cannot be tested."""
-
-
-class VnfOnBoarding(vnf.VnfOnBoarding):
- # pylint: disable=too-many-instance-attributes
- """Base model for OpenStack VNF test cases."""
-
- __logger = logging.getLogger(__name__)
-
- def __init__(self, **kwargs):
- super(VnfOnBoarding, self).__init__(**kwargs)
- self.uuid = uuid.uuid4()
- self.user_name = "{}-{}".format(self.case_name, self.uuid)
- self.tenant_name = "{}-{}".format(self.case_name, self.uuid)
- self.snaps_creds = {}
- self.created_object = []
- self.os_project = None
- self.tenant_description = "Created by OPNFV Functest: {}".format(
- self.case_name)
-
- 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:
- self.__logger.info(
- "Prepare VNF: %s, description: %s", self.case_name,
- self.tenant_description)
- snaps_creds = openstack_tests.get_credentials(
- os_env_file=constants.ENV_FILE)
-
- self.os_project = OpenStackProject(
- snaps_creds,
- ProjectConfig(
- name=self.tenant_name,
- description=self.tenant_description,
- domain=snaps_creds.project_domain_name
- ))
- self.os_project.create()
- self.created_object.append(self.os_project)
-
- snaps_creds.project_domain_id = \
- self.os_project.get_project().domain_id
- snaps_creds.user_domain_id = \
- self.os_project.get_project().domain_id
-
- for role in ['admin', 'Admin']:
- if keystone_utils.get_role_by_name(
- keystone_utils.keystone_client(snaps_creds), role):
- admin_role = role
- break
-
- user_creator = OpenStackUser(
- snaps_creds,
- UserConfig(
- name=self.user_name,
- password=str(uuid.uuid4()),
- project_name=self.tenant_name,
- domain_name=snaps_creds.user_domain_name,
- roles={admin_role: self.tenant_name}))
- user_creator.create()
- self.created_object.append(user_creator)
- self.snaps_creds = user_creator.get_os_creds(self.tenant_name)
- self.__logger.debug("snaps creds: %s", self.snaps_creds)
-
- return vnf.VnfOnBoarding.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('Removing the VNF resources ..')
- 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/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/opnfv_tests/openstack/patrole/patrole.py b/functest/opnfv_tests/openstack/patrole/patrole.py
index 0c5eedf48..88c42f269 100644
--- a/functest/opnfv_tests/openstack/patrole/patrole.py
+++ b/functest/opnfv_tests/openstack/patrole/patrole.py
@@ -9,48 +9,20 @@
# pylint: disable=missing-docstring
-import logging
-import os
+from six.moves import configparser
-from functest.opnfv_tests.openstack.tempest import conf_utils
from functest.opnfv_tests.openstack.tempest import tempest
-from functest.utils import config
class Patrole(tempest.TempestCommon):
- __logger = logging.getLogger(__name__)
-
- def __init__(self, **kwargs):
- if "case_name" not in kwargs:
- kwargs["case_name"] = 'patrole'
- super(Patrole, self).__init__(**kwargs)
- self.res_dir = os.path.join(
- getattr(config.CONF, 'dir_results'), 'patrole')
- self.list = os.path.join(self.res_dir, 'tempest-list.txt')
-
- def apply_tempest_blacklist(self):
- pass
-
def configure(self, **kwargs):
- super(Patrole, self).configure(**kwargs)
- rconfig = conf_utils.ConfigParser.RawConfigParser()
+ super().configure(**kwargs)
+ rconfig = configparser.RawConfigParser()
rconfig.read(self.conf_file)
- rconfig.add_section('rbac')
- rconfig.set('rbac', 'enable_rbac', True)
- rconfig.set('rbac', 'rbac_test_role', kwargs.get('role', 'admin'))
- with open(self.conf_file, 'wb') as config_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)
-
- def generate_test_list(self):
- self.backup_tempest_config(self.conf_file, '/etc')
- super(Patrole, self).generate_test_list()
- os.remove('/etc/tempest.conf')
-
- def run(self, **kwargs):
- for exclude in kwargs.get('exclude', []):
- self.mode = "{}(?!.*{})".format(self.mode, exclude)
- self.mode = "'{}(?=patrole_tempest_plugin.tests.api.({}))'".format(
- self.mode, '|'.join(kwargs.get('services', [])))
- return super(Patrole, self).run(**kwargs)
diff --git a/functest/opnfv_tests/openstack/rally/blacklist.txt b/functest/opnfv_tests/openstack/rally/blacklist.txt
deleted file mode 100644
index c9d7c6007..000000000
--- a/functest/opnfv_tests/openstack/rally/blacklist.txt
+++ /dev/null
@@ -1,28 +0,0 @@
-scenario:
- -
- scenarios:
- - '^os-nosdn-lxd-(no)?ha$'
- installers:
- - '.+' # all installers
- tests:
- - NovaServers.boot_server_from_volume_and_delete
- -
- scenarios:
- - '^os-' # all scenarios
- installers:
- - '.+' # all installers
- tests:
- # Following test occasionally fails due to race condition issue on
- # quota manipulation in nova.
- # Ref: https://bugs.launchpad.net/nova/+bug/1552622
- - 'Quotas.nova_update_and_delete'
-
-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 8048eddeb..3d897e25d 100644
--- a/functest/opnfv_tests/openstack/rally/rally.py
+++ b/functest/opnfv_tests/openstack/rally/rally.py
@@ -11,135 +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 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.utils import deploy_utils
+from ruamel.yaml import YAML
+import six
+from six.moves import configparser
from xtesting.core import testcase
-from xtesting.energy import energy
import yaml
-from functest.opnfv_tests.openstack.snaps import snaps_utils
-from functest.opnfv_tests.openstack.tempest import conf_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."""
- # pylint: disable=too-many-instance-attributes
- TESTS = ['authenticate', 'glance', 'cinder', 'gnocchi', 'heat',
- 'keystone', 'neutron', 'nova', 'quotas', 'vm', 'all']
- GLANCE_IMAGE_NAME = getattr(config.CONF, 'openstack_image_name')
- GLANCE_IMAGE_FILENAME = getattr(config.CONF, 'openstack_image_file_name')
- GLANCE_IMAGE_PATH = os.path.join(getattr(
- config.CONF, 'dir_functest_images'), GLANCE_IMAGE_FILENAME)
- GLANCE_IMAGE_FORMAT = getattr(config.CONF, 'openstack_image_disk_format')
- GLANCE_IMAGE_USERNAME = getattr(config.CONF, 'openstack_image_username')
- GLANCE_IMAGE_EXTRA_PROPERTIES = getattr(
- config.CONF, 'image_properties', {})
- FLAVOR_NAME = getattr(config.CONF, 'rally_flavor_name')
- FLAVOR_ALT_NAME = getattr(config.CONF, 'rally_flavor_alt_name')
- FLAVOR_RAM = 512
- FLAVOR_RAM_ALT = 1024
- FLAVOR_EXTRA_SPECS = getattr(config.CONF, 'flavor_extra_specs', None)
- if 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(getattr(config.CONF, 'dir_results'), 'rally')
- BLACKLIST_FILE = os.path.join(RALLY_DIR, "blacklist.txt")
- TEMP_DIR = os.path.join(RALLY_DIR, "var")
-
- RALLY_PRIVATE_NET_NAME = getattr(config.CONF, 'rally_network_name')
- RALLY_PRIVATE_SUBNET_NAME = str(getattr(config.CONF, 'rally_subnet_name'))
- RALLY_PRIVATE_SUBNET_CIDR = getattr(config.CONF, 'rally_subnet_cidr')
- RALLY_ROUTER_NAME = getattr(config.CONF, '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)
- self.os_creds = kwargs.get('os_creds') or snaps_utils.get_credentials()
- self.guid = '-' + str(uuid.uuid4())
+ 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:
+ 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
+ self.flavor_alt = None
+ self.tests = []
+ self.run_cmd = ''
+ self.network_extensions = []
+ self.services = []
- def _build_task_args(self, test_file_name):
+ def build_task_args(self, test_name):
"""Build arguments for the Rally task."""
- task_args = {'service_list': [test_file_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.GLANCE_IMAGE_PATH)
- task_args['glance_image_format'] = str(self.GLANCE_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 = {'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):
"""Build the list of test cases to be executed."""
- test_yaml_file_name = 'opnfv-{}.yaml'.format(test_name)
- scenario_file_name = os.path.join(self.RALLY_SCENARIO_DIR,
+ 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):
@@ -147,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):
@@ -184,49 +266,45 @@ 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 result.get('error'):
+ 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 = ""
- for line in proc.stdout:
- 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 = env.get('INSTALLER_TYPE')
deploy_scenario = env.get('DEPLOY_SCENARIO')
- if (bool(installer_type) and bool(deploy_scenario) and
+ 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: # pylint: disable=broad-except
@@ -261,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']:
@@ -279,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):
@@ -319,201 +399,161 @@ 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_cmd_output(proc)
- 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)
+ self.results_dir)
+ os.makedirs(self.results_dir)
- # get and save rally operation JSON result
- cmd = (["rally", "task", "detailed", task_id])
+ # put detailed result to log
+ cmd = (["rally", "task", "detailed", "--uuid", task_id])
LOGGER.debug('running command: %s', cmd)
- proc = subprocess.Popen(cmd, stdout=subprocess.PIPE,
- stderr=subprocess.STDOUT)
- json_detailed = self.get_cmd_output(proc)
- LOGGER.info('%s', json_detailed)
-
- 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)
+ 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)
- 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)
-
- # 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])
- LOGGER.debug('running command: %s', cmd)
- subprocess.Popen(cmd, stdout=subprocess.PIPE,
- stderr=subprocess.STDOUT)
# 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: "%s" Failed.', test_name)
+
+ 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:
- LOGGER.info('Test scenario: "{}" Failed.'.format(test_name) + "\n")
+ 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 = []
+ failures = []
rally_report = json.loads(json_raw)
- for report in rally_report:
- if report.get('full_duration'):
- overall_duration += report.get('full_duration')
-
- if report.get('result'):
- for result in report.get('result'):
- nb_tests += 1
- if not result.get('error'):
- nb_success += 1
+ 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,
- 'nb_success': nb_success}
+ 'nb_success': nb_success,
+ 'success': success,
+ 'failures': failures,
+ 'task_status': self.task_succeed(json_raw)}
self.summary.append(scenario_summary)
- def _prepare_env(self):
- """Create resources needed by test scenarios."""
- 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 = getattr(config.CONF, 'rally_network_type', None)
- rally_physical_network = getattr(
- config.CONF, 'rally_physical_network', None)
- rally_segmentation_id = getattr(
- config.CONF, 'rally_segmentation_id', None)
-
- 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,
- dns_nameservers=[env.get('NAMESERVER')])]))
- 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):
+ 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."""
- 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)
+ 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):
"""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(
@@ -525,6 +565,8 @@ class RallyBase(testcase.TestCase):
# for each scenario we draw a row for the table
for item in self.summary:
+ 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']
@@ -532,15 +574,17 @@ class RallyBase(testcase.TestCase):
success_avg = 100 * item['nb_success'] / item['nb_tests']
except ZeroDivisionError:
success_avg = 0
- success_str = str("{:0.2f}".format(success_avg)) + '%'
- duration_str = time.strftime("%M:%S",
+ 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': success_str}})
+ 'success rate': success_str,
+ 'success': item['success'],
+ 'failures': item['failures']}})
total_duration_str = time.strftime("%H:%M:%S",
time.gmtime(total_duration))
@@ -548,44 +592,122 @@ class RallyBase(testcase.TestCase):
self.result = 100 * total_nb_success / total_nb_tests
except ZeroDivisionError:
self.result = 100
- success_rate = "{:0.2f}".format(self.result)
+ 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%%",
- self.case_name, success_rate)
- payload.append({'summary': {'duration': total_duration,
- 'nb tests': total_nb_tests,
- 'nb success': success_rate}})
- self.details = payload
-
- def _clean_up(self):
- """Cleanup all OpenStack objects. Should be called on completion."""
- for creator in reversed(self.creators):
- try:
- creator.clean()
- except Exception as exc: # pylint: disable=broad-except
- LOGGER.error('Unexpected error cleaning - %s', exc)
+ 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
+
+ @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
@@ -597,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-cinder.yaml b/functest/opnfv_tests/openstack/rally/scenario/full/opnfv-cinder.yaml
index f36d0b2d9..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) }}
@@ -91,6 +101,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) }}
@@ -103,7 +115,7 @@
{{ vm_params(image_name,flavor_name) }}
size:
min: 1
- max: 5
+ max: 1
create_vm_params:
nics:
- net-id: {{ netid }}
@@ -111,6 +123,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) }}
@@ -123,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) }}
@@ -148,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
@@ -165,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:
@@ -182,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) }}
@@ -194,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) }}
@@ -206,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) }}
@@ -221,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) }}
@@ -235,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:
@@ -250,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:
@@ -263,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:
@@ -279,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:
@@ -290,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:
@@ -301,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:
@@ -328,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
index 8da5142e7..b4487daa0 100644
--- a/functest/opnfv_tests/openstack/rally/scenario/full/opnfv-gnocchi.yaml
+++ b/functest/opnfv_tests/openstack/rally/scenario/full/opnfv-gnocchi.yaml
@@ -161,3 +161,21 @@
{{ 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-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
index 15185f385..d99b15f81 100644
--- a/functest/opnfv_tests/openstack/rally/scenario/sanity/opnfv-gnocchi.yaml
+++ b/functest/opnfv_tests/openstack/rally/scenario/sanity/opnfv-gnocchi.yaml
@@ -108,3 +108,12 @@
{{ 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 fe9304fc2..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 %}
@@ -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/opnfv_tests/openstack/refstack/refstack.py b/functest/opnfv_tests/openstack/refstack/refstack.py
index b55f7268a..87932020b 100644
--- a/functest/opnfv_tests/openstack/refstack/refstack.py
+++ b/functest/opnfv_tests/openstack/refstack/refstack.py
@@ -11,9 +11,9 @@
import logging
import os
-import shutil
-
-from refstack_client import list_parser
+import re
+import subprocess
+import yaml
from functest.opnfv_tests.openstack.tempest import tempest
from functest.utils import config
@@ -24,22 +24,58 @@ class Refstack(tempest.TempestCommon):
__logger = logging.getLogger(__name__)
- defcorelist = os.path.join(
- getattr(config.CONF, 'dir_refstack_data'), 'defcore.txt')
-
- def __init__(self, **kwargs):
- if "case_name" not in kwargs:
- kwargs["case_name"] = 'refstack'
- super(Refstack, self).__init__(**kwargs)
- self.res_dir = os.path.join(
- getattr(config.CONF, 'dir_results'), 'refstack')
- self.list = os.path.join(self.res_dir, 'tempest-list.txt')
-
- def generate_test_list(self):
- parser = list_parser.TestListParser(
- getattr(config.CONF, 'dir_repo_tempest'))
- nfile = parser.get_normalized_test_list(Refstack.defcorelist)
- shutil.copyfile(nfile, self.list)
-
- def apply_tempest_blacklist(self):
- pass
+ 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/api/database/v1/__init__.py b/functest/opnfv_tests/openstack/shaker/__init__.py
index e69de29bb..e69de29bb 100644
--- a/functest/api/database/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 b8cd4fdd4..000000000
--- a/functest/opnfv_tests/openstack/snaps/api_check.py
+++ /dev/null
@@ -1,45 +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
-
-"""api_check test case implementation"""
-
-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(ApiCheck, 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 f8bf8852e..000000000
--- a/functest/opnfv_tests/openstack/snaps/connection_check.py
+++ /dev/null
@@ -1,44 +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
-
-# pylint: disable=missing-docstring
-
-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(ConnectionCheck, 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 8a88ac6b8..000000000
--- a/functest/opnfv_tests/openstack/snaps/health_check.py
+++ /dev/null
@@ -1,49 +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
-
-"""snaps_health_check test case implementation"""
-
-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(HealthCheck, 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 bc6781180..000000000
--- a/functest/opnfv_tests/openstack/snaps/smoke.py
+++ /dev/null
@@ -1,48 +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
-
-"""snaps_smoke test case implementation"""
-
-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(SnapsSmoke, 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 ed3b2825e..000000000
--- a/functest/opnfv_tests/openstack/snaps/snaps_suite_builder.py
+++ /dev/null
@@ -1,446 +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
-
-"""
-Snaps test suite including openstack client tests, api tests and
-integration tests.
-add_openstack_client_tests: for connection_check
-add_openstack_api_tests: for api_check
-add_openstack_integration_tests: for snaps_smoke
-"""
-
-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):
- # pylint: disable=too-many-arguments
- """
- 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):
- # pylint: disable=too-many-arguments
- """
- 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 7b111ed1b..000000000
--- a/functest/opnfv_tests/openstack/snaps/snaps_test_runner.py
+++ /dev/null
@@ -1,52 +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
-
-"""configuration params to run snaps tests"""
-
-import logging
-
-from xtesting.core import unit
-
-from functest.opnfv_tests.openstack.snaps import snaps_utils
-from functest.utils import config
-
-
-class SnapsTestRunner(unit.Suite):
- # pylint: disable=too-many-instance-attributes
- """
- This test executes the SNAPS Python Tests
- """
-
- def __init__(self, **kwargs):
- super(SnapsTestRunner, self).__init__(**kwargs)
- self.logger = logging.getLogger(__name__)
- self.os_creds = kwargs.get('os_creds') or snaps_utils.get_credentials()
-
- 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(config.CONF, 'snaps_network_config'):
- self.netconf_override = getattr(
- config.CONF, 'snaps_network_config')
-
- self.use_fip = (
- getattr(config.CONF, 'snaps_use_floating_ips') == 'True')
- self.use_keystone = (
- getattr(config.CONF, 'snaps_use_keystone') == 'True')
-
- self.flavor_metadata = getattr(config.CONF, 'flavor_extra_specs', None)
- self.logger.info("Using flavor metadata '%s'", self.flavor_metadata)
-
- self.image_metadata = None
- if hasattr(config.CONF, 'snaps_images'):
- self.image_metadata = getattr(config.CONF, '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 fa1005ea8..000000000
--- a/functest/opnfv_tests/openstack/snaps/snaps_utils.py
+++ /dev/null
@@ -1,61 +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
-
-"""Some common utils wrapping snaps functions """
-
-from functest.utils import config
-from functest.utils import constants
-from functest.utils import env
-
-from snaps.openstack.tests import openstack_tests
-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 env.get('EXTERNAL_NETWORK'):
- extnet_config = env.get('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)
-
-
-def get_credentials(proxy_settings_str=None, ssh_proxy_cmd=None):
- """
- Returns snaps OSCreds object instance
- :param: proxy_settings_str: proxy settings string <host>:<port>
- :param: ssh_proxy_cmd: the SSH proxy command for the environment
- :return: an instance of snaps OSCreds object
- """
- creds_override = None
- if hasattr(config.CONF, 'snaps_os_creds_override'):
- creds_override = getattr(config.CONF, 'snaps_os_creds_override')
- os_creds = openstack_tests.get_credentials(
- os_env_file=constants.ENV_FILE, proxy_settings_str=proxy_settings_str,
- ssh_proxy_cmd=ssh_proxy_cmd, overrides=creds_override)
- return os_creds
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 6a3d2d6e8..000000000
--- a/functest/opnfv_tests/openstack/tempest/conf_utils.py
+++ /dev/null
@@ -1,263 +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
-#
-
-"""Tempest configuration utilities."""
-
-import ConfigParser
-import logging
-import fileinput
-import os
-import subprocess
-
-import pkg_resources
-import yaml
-
-from functest.utils import config
-from functest.utils import env
-
-
-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(
- getattr(config.CONF, 'dir_functest_images'),
- getattr(config.CONF, 'openstack_image_file_name'))
-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_CONF_YAML = pkg_resources.resource_filename(
- 'functest', 'opnfv_tests/openstack/tempest/custom_tests/tempest_conf.yaml')
-
-CI_INSTALLER_TYPE = env.get('INSTALLER_TYPE')
-
-""" logging configuration """
-LOGGER = logging.getLogger(__name__)
-
-
-def create_rally_deployment():
- """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(RALLY_AARCH64_PATCH_PATH, "r") as pfile:
- rally_patch_conf = pfile.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...")
-
- 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)
- except subprocess.CalledProcessError:
- pass
-
- cmd = ['rally', 'deployment', 'create', '--fromenv',
- '--name', str(getattr(config.CONF, 'rally_deployment_name'))]
- output = subprocess.check_output(cmd)
- LOGGER.info("%s\n%s", " ".join(cmd), output)
-
- cmd = ['rally', 'deployment', 'check']
- output = subprocess.check_output(cmd)
- LOGGER.info("%s\n%s", " ".join(cmd), output)
-
-
-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)
- 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)
-
-
-def get_verifier_id():
- """
- Returns verifier id for current Tempest
- """
- create_rally_deployment()
- create_verifier()
- cmd = ("rally verify list-verifiers | awk '/" +
- getattr(config.CONF, 'tempest_verifier_name') +
- "/ {print $2}'")
- proc = subprocess.Popen(cmd, shell=True,
- stdout=subprocess.PIPE,
- stderr=subprocess.STDOUT)
- deployment_uuid = proc.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 '/" +
- getattr(config.CONF, 'rally_deployment_name') +
- "/ {print $2}'")
- proc = subprocess.Popen(cmd, shell=True,
- stdout=subprocess.PIPE,
- stderr=subprocess.STDOUT)
- deployment_uuid = proc.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(getattr(config.CONF, '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(getattr(config.CONF, 'dir_rally_inst'),
- 'verification',
- 'verifier-{}'.format(verifier_id),
- 'for-deployment-{}'.format(deployment_id))
-
-
-def update_tempest_conf_file(conf_file, rconfig):
- """Update defined paramters into tempest config file"""
- with open(TEMPEST_CONF_YAML) 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, 'wb') as config_file:
- rconfig.write(config_file)
-
-
-def configure_tempest_update_params(tempest_conf_file,
- network_name=None, image_id=None,
- flavor_id=None, compute_cnt=1):
- # pylint: disable=too-many-branches, too-many-arguments
- """
- 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', 'fixed_network_name', network_name)
- 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_ID_ALT is not None:
- rconfig.set('compute', 'image_ref_alt', IMAGE_ID_ALT)
- if getattr(config.CONF, 'tempest_use_custom_flavors'):
- if flavor_id is not None:
- rconfig.set('compute', 'flavor_ref', flavor_id)
- if FLAVOR_ID_ALT is not None:
- rconfig.set('compute', 'flavor_ref_alt', FLAVOR_ID_ALT)
- if compute_cnt > 1:
- # enable multinode tests
- rconfig.set('compute', 'min_compute_nodes', compute_cnt)
- rconfig.set('compute-feature-enabled', 'live_migration', True)
-
- rconfig.set('identity', 'region', os.environ.get('OS_REGION_NAME'))
- identity_api_version = os.environ.get("OS_IDENTITY_API_VERSION", '3')
- if identity_api_version == '3':
- auth_version = 'v3'
- rconfig.set('identity-feature-enabled', 'api_v2', False)
- else:
- auth_version = 'v2'
- rconfig.set('identity', 'auth_version', auth_version)
- rconfig.set(
- 'validation', 'ssh_timeout',
- getattr(config.CONF, 'tempest_validation_ssh_timeout'))
- rconfig.set('object-storage', 'operator_role',
- getattr(config.CONF, 'tempest_object_storage_operator_role'))
-
- if os.environ.get('OS_ENDPOINT_TYPE') is not None:
- rconfig.set('identity', 'v3_endpoint_type',
- os.environ.get('OS_ENDPOINT_TYPE'))
-
- if os.environ.get('OS_ENDPOINT_TYPE') is not None:
- 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_ENDPOINT_TYPE'))
-
- LOGGER.debug('Add/Update required params defined in tempest_conf.yaml '
- 'into tempest.conf file')
- update_tempest_conf_file(tempest_conf_file, rconfig)
-
-
-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)
-
- 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)
- 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/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 9c97b01fb..7233ffd60 100644
--- a/functest/opnfv_tests/openstack/tempest/tempest.py
+++ b/functest/opnfv_tests/openstack/tempest/tempest.py
@@ -12,60 +12,123 @@
from __future__ import division
+import json
import logging
import os
import re
import shutil
import subprocess
import time
-import uuid
-
-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
-from snaps.openstack.create_flavor import OpenStackFlavor
-from snaps.openstack.tests import openstack_tests
-from snaps.openstack.utils import deploy_utils
+
+import pkg_resources
+from six.moves import configparser
from xtesting.core import testcase
import yaml
-from functest.opnfv_tests.openstack.snaps import snaps_utils
-from functest.opnfv_tests.openstack.tempest import conf_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(testcase.TestCase):
- # pylint: disable=too-many-instance-attributes
+class TempestCommon(singlevm.VmReady2):
+ # pylint: disable=too-many-instance-attributes,too-many-public-methods
"""TempestCommon testcases implementation class."""
- TEMPEST_RESULTS_DIR = os.path.join(
- getattr(config.CONF, 'dir_results'), 'tempest')
+ 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')
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)
+ 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 = TempestCommon.TEMPEST_RESULTS_DIR
+ 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
+
+ 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()
@staticmethod
def read_file(filename):
"""Read file and return content as a stripped list."""
- with open(filename) as src:
+ with open(filename, encoding='utf-8') as src:
return [line.strip() for line in src.readlines()]
@staticmethod
@@ -79,22 +142,22 @@ class TempestCommon(testcase.TestCase):
}
cmd = ["rally", "verify", "show", "--uuid", verif_id]
LOGGER.info("Showing result for a verification: '%s'.", cmd)
- proc = subprocess.Popen(cmd,
- stdout=subprocess.PIPE,
- stderr=subprocess.STDOUT)
- for line in proc.stdout:
- new_line = line.replace(' ', '').split('|')
- if 'Tests' in new_line:
- break
- LOGGER.info(line)
- 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])
+ 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
@staticmethod
@@ -107,102 +170,236 @@ class TempestCommon(testcase.TestCase):
shutil.copyfile(conf_file,
os.path.join(res_dir, 'tempest.conf'))
- def generate_test_list(self):
+ @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 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")
+
+ @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...")
- if self.mode == 'custom':
- if os.path.isfile(conf_utils.TEMPEST_CUSTOM):
+ 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, self.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 = r"'^tempest\.(api|scenario).*\[.*\bsmoke\b.*\]$'"
- elif self.mode == 'full':
- testr_mode = r"'^tempest\.'"
- else:
- testr_mode = self.mode
- cmd = "(cd {0}; stestr list {1} >{2} 2>/dev/null)".format(
- self.verifier_repo_dir, testr_mode, self.list)
+ 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)
+ LOGGER.info("%s\n%s", cmd, output.decode("utf-8"))
+ os.remove('/etc/tempest.conf')
- def apply_tempest_blacklist(self):
+ 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)
- result_file = open(self.list, 'w')
- black_tests = []
- try:
- installer_type = env.get('INSTALLER_TYPE')
- deploy_scenario = env.get('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: # pylint: disable=broad-except
+ 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()
+ 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):
+ def run_verifier_tests(self, **kwargs):
"""Execute tempest test cases."""
cmd = ["rally", "verify", "start", "--load-list",
self.list]
- cmd.extend(self.option)
+ cmd.extend(kwargs.get('option', []))
LOGGER.info("Starting Tempest test suite: '%s'.", cmd)
- f_stdout = open(
- os.path.join(self.res_dir, "tempest.log"), 'w+')
- f_stderr = open(
- os.path.join(self.res_dir,
- "tempest-error.log"), 'w+')
-
- proc = subprocess.Popen(
- cmd,
- stdout=subprocess.PIPE,
- stderr=f_stderr,
- bufsize=1)
-
- with proc.stdout:
- for line in iter(proc.stdout.readline, b''):
- if re.search(r"\} tempest\.", line):
- LOGGER.info(line.replace('\n', ''))
- elif re.search(r'(?=\(UUID=(.*)\))', line):
- self.verification_id = re.search(
- r'(?=\(UUID=(.*)\))', line).group(1)
- LOGGER.info('Verification UUID: %s', self.verification_id)
- f_stdout.write(line)
- proc.wait()
-
- f_stdout.close()
- f_stderr.close()
+ 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)
+
+ 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."""
@@ -219,18 +416,21 @@ class TempestCommon(testcase.TestCase):
LOGGER.error("No test has been executed")
return
- with open(os.path.join(self.res_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(r'.*\{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(r'.*\{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(r'.*\{0\} (.*?)[. ]*skip:', output):
+ for match in re.findall(r'.*\{\d{1,2}\} (.*?) \.{3} skip(?::| )',
+ output):
skipped_testcases.append(match)
self.details = {"tests_number": stat['num_tests'],
@@ -246,14 +446,149 @@ class TempestCommon(testcase.TestCase):
LOGGER.info("Tempest %s success_rate is %s%%",
self.case_name, self.result)
- def generate_report(self):
- """Generate verification report."""
- html_file = os.path.join(self.res_dir,
- "tempest-report.html")
- cmd = ["rally", "verify", "report", "--type", "html", "--uuid",
- self.verification_id, "--to", html_file]
- subprocess.Popen(cmd, stdout=subprocess.PIPE,
- stderr=subprocess.STDOUT)
+ 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)
+
+ @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
"""
@@ -262,252 +597,178 @@ class TempestCommon(testcase.TestCase):
"""
if not os.path.exists(self.res_dir):
os.makedirs(self.res_dir)
- resources = self.resources.create()
- compute_cnt = snaps_utils.get_active_compute_cnt(
- self.resources.os_creds)
- self.conf_file = conf_utils.configure_verifier(self.deployment_dir)
- conf_utils.configure_tempest_update_params(
- self.conf_file, network_name=resources.get("network_name"),
- image_id=resources.get("image_id"),
- flavor_id=resources.get("flavor_id"),
- compute_cnt=compute_cnt)
+ 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:
+ 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()
- self.apply_tempest_blacklist()
- self.run_verifier_tests()
+ 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()
- self.generate_report()
+ 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: # 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
+ 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
-class TempestSmokeSerial(TempestCommon):
- """Tempest smoke serial testcase implementation."""
- 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 TempestNeutronTrunk(TempestCommon):
- """Tempest neutron trunk testcase implementation."""
def __init__(self, **kwargs):
- if "case_name" not in kwargs:
- kwargs["case_name"] = 'neutron_trunk'
- TempestCommon.__init__(self, **kwargs)
- self.mode = "'neutron_tempest_plugin.(api|scenario).test_trunk'"
- self.res_dir = os.path.join(
- getattr(config.CONF, 'dir_results'), 'neutron_trunk')
- self.raw_list = os.path.join(self.res_dir, 'test_raw_list.txt')
- self.list = os.path.join(self.res_dir, 'test_list.txt')
+ 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):
- super(TempestNeutronTrunk, self).configure(**kwargs)
- rconfig = conf_utils.ConfigParser.RawConfigParser()
+ assert self.user2
+ super().configure(**kwargs)
+ rconfig = configparser.RawConfigParser()
rconfig.read(self.conf_file)
- rconfig.set('network-feature-enabled', 'api_extensions', 'all')
- with open(self.conf_file, 'wb') as config_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:
+ 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)
-
-class TempestSmokeParallel(TempestCommon):
- """Tempest smoke parallel testcase implementation."""
- def __init__(self, **kwargs):
- if "case_name" not in kwargs:
- kwargs["case_name"] = 'tempest_smoke_parallel'
- TempestCommon.__init__(self, **kwargs)
- self.mode = "smoke"
-
-
-class TempestFullParallel(TempestCommon):
- """Tempest full parallel testcase implementation."""
- 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):
- """Tempest custom testcase implementation."""
- 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):
- """Tempest Defcore testcase implementation."""
- 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):
- """Tempest resource manager."""
- def __init__(self, **kwargs):
- self.os_creds = kwargs.get('os_creds') or snaps_utils.get_credentials()
- self.guid = '-' + str(uuid.uuid4())
- self.creators = list()
- self.cirros_image_config = getattr(
- config.CONF, 'snaps_images_cirros', None)
-
- def _create_project(self):
- """Create project for tests."""
- project_creator = deploy_utils.create_project(
- self.os_creds, ProjectConfig(
- name=getattr(
- config.CONF, 'tempest_identity_tenant_name') + self.guid,
- description=getattr(
- config.CONF, 'tempest_identity_tenant_description'),
- domain=self.os_creds.project_domain_name))
- if project_creator is None or project_creator.get_project() is None:
- raise Exception("Failed to create tenant")
- self.creators.append(project_creator)
- return project_creator.get_project().id
-
- def _create_user(self):
- """Create user for tests."""
- user_creator = deploy_utils.create_user(
- self.os_creds, UserConfig(
- name=getattr(
- config.CONF, 'tempest_identity_user_name') + self.guid,
- password=getattr(
- config.CONF, 'tempest_identity_user_password'),
- project_name=getattr(
- config.CONF, 'tempest_identity_tenant_name') + self.guid,
- domain_name=self.os_creds.user_domain_name))
- if user_creator is None or user_creator.get_user() is None:
- raise Exception("Failed to create user")
- self.creators.append(user_creator)
- return user_creator.get_user().id
-
- def _create_network(self, project_name):
- """Create network for tests."""
- tempest_network_type = None
- tempest_physical_network = None
- tempest_segmentation_id = None
-
- tempest_network_type = getattr(
- config.CONF, 'tempest_network_type', None)
- tempest_physical_network = getattr(
- config.CONF, 'tempest_physical_network', None)
- tempest_segmentation_id = getattr(
- config.CONF, 'tempest_segmentation_id', None)
- tempest_net_name = getattr(
- config.CONF, 'tempest_private_net_name') + self.guid
-
- network_creator = deploy_utils.create_network(
- self.os_creds, NetworkConfig(
- name=tempest_net_name,
- project_name=project_name,
- network_type=tempest_network_type,
- physical_network=tempest_physical_network,
- segmentation_id=tempest_segmentation_id,
- subnet_settings=[SubnetConfig(
- name=getattr(
- config.CONF,
- 'tempest_private_subnet_name') + self.guid,
- project_name=project_name,
- cidr=getattr(
- config.CONF, 'tempest_private_subnet_cidr'),
- dns_nameservers=[env.get('NAMESERVER')])]))
- if network_creator is None or network_creator.get_network() is None:
- raise Exception("Failed to create private network")
- self.creators.append(network_creator)
- return tempest_net_name
-
- def _create_image(self, name):
- """Create image for tests"""
- os_image_settings = openstack_tests.cirros_image_settings(
- name, public=True,
- image_metadata=self.cirros_image_config)
- 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)
- return image_creator.get_image().id
-
- def _create_flavor(self, name):
- """Create flavor for tests."""
- flavor_metadata = getattr(config.CONF, 'flavor_extra_specs', None)
- flavor_creator = OpenStackFlavor(
- self.os_creds, FlavorConfig(
- name=name,
- ram=getattr(config.CONF, 'openstack_flavor_ram'),
- disk=getattr(config.CONF, 'openstack_flavor_disk'),
- vcpus=getattr(config.CONF, '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)
- return flavor.id
-
- def create(self, create_project=False):
- """Create resources for Tempest test suite."""
- result = {
- 'tempest_net_name': None,
- 'image_id': None,
- 'image_id_alt': None,
- 'flavor_id': None,
- 'flavor_id_alt': None
- }
- project_name = None
-
- if create_project:
- LOGGER.debug("Creating project and user for Tempest suite")
- project_name = getattr(
- config.CONF, 'tempest_identity_tenant_name') + self.guid
- result['project_id'] = self._create_project()
- result['user_id'] = self._create_user()
- result['tenant_id'] = result['project_id'] # for compatibility
-
- LOGGER.debug("Creating private network for Tempest suite")
- result['tempest_net_name'] = self._create_network(project_name)
-
- LOGGER.debug("Creating two images for Tempest suite")
- image_name = getattr(config.CONF, 'openstack_image_name') + self.guid
- result['image_id'] = self._create_image(image_name)
- image_name = getattr(
- config.CONF, 'openstack_image_name_alt') + self.guid
- result['image_id_alt'] = self._create_image(image_name)
-
- LOGGER.info("Creating two flavors for Tempest suite")
- name = getattr(config.CONF, 'openstack_flavor_name') + self.guid
- result['flavor_id'] = self._create_flavor(name)
-
- name = getattr(
- config.CONF, 'openstack_flavor_name_alt') + self.guid
- result['flavor_id_alt'] = self._create_flavor(name)
-
- return result
-
- def cleanup(self):
+ def clean(self):
"""
Cleanup all OpenStack objects. Should be called on completion.
"""
- for creator in reversed(self.creators):
- try:
- creator.clean()
- except Exception as err: # pylint: disable=broad-except
- LOGGER.error('Unexpected error cleaning - %s', err)
+ super().clean()
+ if self.user2:
+ self.orig_cloud.delete_user(self.user2.id)
diff --git a/functest/api/resources/__init__.py b/functest/opnfv_tests/openstack/vmtp/__init__.py
index e69de29bb..e69de29bb 100644
--- a/functest/api/resources/__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 13e0efbc8..000000000
--- a/functest/opnfv_tests/openstack/vping/vping_base.py
+++ /dev/null
@@ -1,201 +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
-
-"""Define the parent class of vping_ssh and vping_userdata testcases."""
-
-from datetime import datetime
-import logging
-import time
-import uuid
-
-from snaps.config.flavor import FlavorConfig
-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 xtesting.core import testcase
-
-from functest.opnfv_tests.openstack.snaps import snaps_utils
-from functest.utils import config
-from functest.utils import env
-
-
-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__)
- self.os_creds = kwargs.get('os_creds') or snaps_utils.get_credentials()
- 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 = getattr(
- config.CONF, 'vping_router_name') + self.guid
- self.vm1_name = getattr(
- config.CONF, 'vping_vm_name_1') + self.guid
- self.vm2_name = getattr(config.CONF, 'vping_vm_name_2') + self.guid
-
- self.vm_boot_timeout = getattr(config.CONF, 'vping_vm_boot_timeout')
- self.vm_delete_timeout = getattr(
- config.CONF, 'vping_vm_delete_timeout')
- self.vm_ssh_connect_timeout = getattr(
- config.CONF, 'vping_vm_ssh_connect_timeout')
- self.ping_timeout = getattr(config.CONF, 'vping_ping_timeout')
- self.flavor_name = 'vping-flavor' + self.guid
-
- # Move this configuration option up for all tests to leverage
- if hasattr(config.CONF, 'snaps_images_cirros'):
- self.cirros_image_config = getattr(
- config.CONF, 'snaps_images_cirros')
- else:
- self.cirros_image_config = None
-
- def run(self, **kwargs): # pylint: disable=too-many-locals
- """
- 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(
- getattr(config.CONF, '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 = getattr(
- config.CONF, 'vping_private_net_name') + self.guid
- private_subnet_name = str(getattr(
- config.CONF, 'vping_private_subnet_name') + self.guid)
- private_subnet_cidr = getattr(config.CONF, 'vping_private_subnet_cidr')
-
- vping_network_type = None
- vping_physical_network = None
- vping_segmentation_id = None
-
- if hasattr(config.CONF, 'vping_network_type'):
- vping_network_type = getattr(config.CONF, 'vping_network_type')
- if hasattr(config.CONF, 'vping_physical_network'):
- vping_physical_network = getattr(
- config.CONF, 'vping_physical_network')
- if hasattr(config.CONF, 'vping_segmentation_id'):
- vping_segmentation_id = getattr(
- config.CONF, '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,
- dns_nameservers=[env.get('NAMESERVER')])]))
- 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)
- flavor_ram = getattr(config.CONF, 'openstack_flavor_ram')
- flavor_metadata = getattr(config.CONF, 'flavor_extra_specs', None)
-
- 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 clean(self):
- """
- Cleanup all OpenStack objects. Should be called on completion
- :return:
- """
- if getattr(config.CONF, '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 7cdcd2576..ad64348c4 100644
--- a/functest/opnfv_tests/openstack/vping/vping_ssh.py
+++ b/functest/opnfv_tests/openstack/vping/vping_ssh.py
@@ -9,26 +9,13 @@
"""vPingSSH testcase."""
-import time
+import logging
-from scp import SCPClient
-import pkg_resources
-
-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
-from snaps.openstack.utils import deploy_utils
-
-from xtesting.core import testcase
-from xtesting.energy import energy
-
-from functest.opnfv_tests.openstack.vping import vping_base
+from functest.core import singlevm
from functest.utils import config
-class VPingSSH(vping_base.VPingBase):
+class VPingSSH(singlevm.SingleVm2):
"""
VPingSSH testcase implementation.
@@ -36,198 +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 = getattr(config.CONF, 'vping_keypair_name') + self.guid
- self.kp_priv_file = getattr(config.CONF, 'vping_keypair_priv_file')
- self.kp_pub_file = getattr(config.CONF, 'vping_keypair_pub_file')
- self.sg_name = getattr(config.CONF, 'vping_sg_name') + self.guid
- self.sg_desc = getattr(config.CONF, 'vping_sg_desc')
-
- @energy.enable_recording
- def run(self, **kwargs):
- """
- 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.TestCase.EX_RUN_ERROR
-
- 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.TestCase.EX_RUN_ERROR
- return self._do_vping_ssh(ssh, test_ip)
- else:
- return testcase.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.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.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 7d9a57c93..8a8f26f37 100644
--- a/functest/opnfv_tests/openstack/vping/vping_userdata.py
+++ b/functest/opnfv_tests/openstack/vping/vping_userdata.py
@@ -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.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,7 +26,10 @@ 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, **kwargs):
"""
@@ -35,56 +37,35 @@ class VPingUserdata(vping_base.VPingBase):
validates.
:return: the exit code from the super.execute() method
"""
- 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()
-
- def _do_vping(self, vm_creator, test_ip):
+ try:
+ 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.TestCase.EX_TESTCASE_FAILED
sec = 0
@@ -92,48 +73,65 @@ class VPingUserdata(vping_base.VPingBase):
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.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 7c61e88df..72c38ce2c 100644
--- a/functest/opnfv_tests/sdn/odl/odl.py
+++ b/functest/opnfv_tests/sdn/odl/odl.py
@@ -25,13 +25,12 @@ import os
import re
import sys
+import os_client_config
from six.moves import urllib
-from snaps.openstack.utils import keystone_utils
+from xtesting.core import robotframework
-from functest.opnfv_tests.openstack.snaps import snaps_utils
from functest.utils import config
from functest.utils import env
-from xtesting.core import robotframework
__author__ = "Cedric Ollivier <cedric.ollivier@orange.com>"
@@ -50,7 +49,7 @@ 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(
getattr(config.CONF, 'dir_results'), 'odl')
self.xml_file = os.path.join(self.res_dir, 'output.xml')
@@ -67,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:")
@@ -112,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 + '"',
@@ -136,7 +134,7 @@ 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
@@ -157,15 +155,19 @@ class ODLTests(robotframework.RobotFramework):
suites = kwargs["suites"]
except KeyError:
pass
- snaps_creds = snaps_utils.get_credentials()
- kwargs = {'neutronurl': keystone_utils.get_endpoint(
- snaps_creds, 'network')}
+ 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'] = '8080'
- kwargs['odlrestconfport'] = '8181'
- kwargs['odlusername'] = 'admin'
- kwargs['odlpassword'] = 'admin'
- installer_type = env.get('INSTALLER_TYPE')
+ 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,22 +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'] = '8282'
- kwargs['odlrestconfport'] = '8282'
- elif installer_type == 'apex' or installer_type == 'netvirt':
- kwargs['odlwebport'] = '8081'
- kwargs['odlrestconfport'] = '8081'
- elif installer_type == 'compass':
- kwargs['odlrestconfport'] = '8080'
- elif installer_type == 'daisy':
- kwargs['odlwebport'] = '8181'
- kwargs['odlrestconfport'] = '8087'
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.")
@@ -198,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):
diff --git a/functest/opnfv_tests/vnf/epc/juju_epc.py b/functest/opnfv_tests/vnf/epc/juju_epc.py
index 50253ccac..1cf240b80 100644
--- a/functest/opnfv_tests/vnf/epc/juju_epc.py
+++ b/functest/opnfv_tests/vnf/epc/juju_epc.py
@@ -14,34 +14,16 @@ import os
import time
import json
import re
-import subprocess
import sys
-import uuid
+
from copy import deepcopy
-from urlparse import urljoin
import pkg_resources
-import yaml
+import scp
-from functest.core import vnf
-from functest.opnfv_tests.openstack.snaps import snaps_utils
+from functest.core import singlevm
from functest.utils import config
from functest.utils import env
-
-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.config.security_group import (
- Direction, Protocol, SecurityGroupConfig, SecurityGroupRuleConfig)
-from snaps.config.user import UserConfig
-from snaps.openstack.create_flavor import OpenStackFlavor
-from snaps.openstack.create_image import OpenStackImage
-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.create_user import OpenStackUser
-from snaps.openstack.utils import keystone_utils
-from snaps.openstack.utils import nova_utils
+from functest.utils import functest_utils
__author__ = "Amarendra Meher <amarendra@rebaca.com>"
__author__ = "Soumaya K Nayek <soumaya.nayek@rebaca.com>"
@@ -60,175 +42,186 @@ CREDS_TEMPLATE2 = """credentials:
default-credential: abot-epc
abot-epc:
auth-type: userpass
- password: {pass}
+ password: '{pass}'
project-domain-name: {project_domain_n}
tenant-name: {tenant_n}"""
-CREDS_TEMPLATE3 = """credentials:
+CREDS_TEMPLATE = """credentials:
abot-epc:
default-credential: abot-epc
abot-epc:
auth-type: userpass
- password: {pass}
+ 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__)
- juju_timeout = '3600'
+ 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 = getattr(
- config.CONF, 'vnf_{}_config'.format(self.case_name))
- except Exception:
- raise Exception("VNF config file not found")
+ config.CONF, f'vnf_{self.case_name}_config')
+ except Exception as exc:
+ raise Exception("VNF config file not found") from exc
self.config_file = os.path.join(self.case_dir, self.config)
- self.orchestrator = dict(requirements=get_config(
- "orchestrator.requirements", self.config_file))
+ self.orchestrator = dict(
+ requirements=functest_utils.get_parameter_from_yaml(
+ "orchestrator.requirements", self.config_file))
self.created_object = []
self.details['orchestrator'] = dict(
- name=get_config("orchestrator.name", self.config_file),
- version=get_config("orchestrator.version", self.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", self.config_file),
- requirements=get_config("vnf.requirements", self.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", self.config_file),
- version=get_config("vnf.version", self.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", self.config_file),
- version=get_config("vnf_test_suite.version", self.config_file),
- tag_name=get_config("vnf_test_suite.tag_name", self.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.public_auth_url = None
self.res_dir = os.path.join(
getattr(config.CONF, 'dir_results'), self.case_name)
- def _bypass_juju_network_discovery_bug(self, name):
- user_creator = OpenStackUser(
- self.snaps_creds,
- UserConfig(
- name=name,
- password=str(uuid.uuid4()),
- project_name=self.tenant_name,
- domain=self.snaps_creds.user_domain_name,
- roles={'_member_': self.tenant_name}))
- user_creator.create()
- self.created_object.append(user_creator)
- return user_creator
+ 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,
- 'region': self.snaps_creds.region_name}
- with open(clouds_yaml, 'w') as yfile:
+ '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))
- cmd = ['juju', 'add-cloud', 'abot-epc', '-f', clouds_yaml, '--replace']
- output = subprocess.check_output(cmd, stderr=subprocess.STDOUT)
- self.__logger.info("%s\n%s", " ".join(cmd), output)
-
- def _register_credentials_v2(self):
+ 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 .....")
- user_creator = self._bypass_juju_network_discovery_bug(
- 'juju_network_discovery_bug')
- snaps_creds = user_creator.get_os_creds(self.snaps_creds.project_name)
- self.__logger.debug("snaps creds: %s", snaps_creds)
credentials_yaml = os.path.join(self.res_dir, "credentials.yaml")
creds_data = {
- 'pass': snaps_creds.password,
- 'tenant_n': snaps_creds.project_name,
- 'user_n': snaps_creds.username}
- with open(credentials_yaml, 'w') as yfile:
- yfile.write(CREDS_TEMPLATE2.format(**creds_data))
- cmd = ['juju', 'add-credential', 'abot-epc', '-f', credentials_yaml,
- '--replace']
- output = subprocess.check_output(cmd, stderr=subprocess.STDOUT)
- self.__logger.info("%s\n%s", " ".join(cmd), output)
-
- def _register_credentials_v3(self):
- self.__logger.info("Creating Credentials for Abot-epc .....")
- user_creator = self._bypass_juju_network_discovery_bug(
- 'juju_network_discovery_bug')
- snaps_creds = user_creator.get_os_creds(self.snaps_creds.project_name)
- self.__logger.debug("snaps creds: %s", snaps_creds)
- credentials_yaml = os.path.join(self.res_dir, "credentials.yaml")
- creds_data = {
- 'pass': snaps_creds.password,
- 'tenant_n': snaps_creds.project_name,
- 'user_n': snaps_creds.username,
- 'project_domain_n': snaps_creds.project_domain_name,
- 'user_domain_n': snaps_creds.user_domain_name}
- with open(credentials_yaml, 'w') as yfile:
- yfile.write(CREDS_TEMPLATE3.format(**creds_data))
- cmd = ['juju', 'add-credential', 'abot-epc', '-f', credentials_yaml,
- '--replace']
- output = subprocess.check_output(cmd, stderr=subprocess.STDOUT)
- self.__logger.info("%s\n%s", " ".join(cmd), output)
-
- def _add_custom_rule(self, sec_grp_name):
- """ To add custom rule for SCTP Traffic """
- sec_grp_rules = list()
- sec_grp_rules.append(
- SecurityGroupRuleConfig(
- sec_grp_name=sec_grp_name, direction=Direction.ingress,
- protocol=Protocol.sctp))
- security_group = OpenStackSecurityGroup(
- self.snaps_creds,
- SecurityGroupConfig(
- name=sec_grp_name,
- rule_settings=sec_grp_rules))
- security_group.create()
- self.created_object.append(security_group)
-
- def prepare(self):
- """Prepare testcase (Additional pre-configuration steps)."""
- self.__logger.info("Additional pre-configuration steps")
- super(JujuEpc, self).prepare()
- 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 vnf.VnfPreparationException
- 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._register_cloud()
- if self.snaps_creds.identity_api_version == 3:
- self._register_credentials_v3()
- else:
- self._register_credentials_v2()
+ '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
"""
@@ -236,175 +229,128 @@ class JujuEpc(vnf.VnfOnBoarding):
Bootstrap juju
"""
- self.__logger.info("Deployed Orchestrator")
- private_net_name = getattr(
- config.CONF, 'vnf_{}_private_net_name'.format(self.case_name))
- private_subnet_name = '{}-{}'.format(
- getattr(config.CONF,
- 'vnf_{}_private_subnet_name'.format(self.case_name)),
- self.uuid)
- private_subnet_cidr = getattr(
- config.CONF, 'vnf_{}_private_subnet_cidr'.format(self.case_name))
- abot_router = '{}-{}'.format(
- getattr(config.CONF,
- 'vnf_{}_external_router'.format(self.case_name)),
- self.uuid)
- self.__logger.info("Creating full network ...")
- subnet_settings = SubnetConfig(
- name=private_subnet_name,
- cidr=private_subnet_cidr,
- dns_nameservers=[env.get('NAMESERVER')])
- network_settings = NetworkConfig(
- name=private_net_name, subnet_settings=[subnet_settings])
- network_creator = OpenStackNetwork(self.snaps_creds, network_settings)
- net_id = network_creator.create().id
- 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, RouterConfig(
- 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 = FlavorConfig(
- 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)
- flavor_creator.create()
- self.created_object.append(flavor_creator)
- self.__logger.info("Upload some OS images if it doesn't exist")
- images = get_config("tenant_images", self.config_file)
- self.__logger.info("Images needed for vEPC: %s", images)
- for image_name, image_file in 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_id = image_creator.create().id
- cmd = ['timeout', '-t', JujuEpc.juju_timeout,
- 'juju', 'metadata', 'generate-image', '-d', '/root',
- '-i', image_id, '-s', image_name,
- '-r', self.snaps_creds.region_name,
- '-u', self.public_auth_url]
- output = subprocess.check_output(cmd, stderr=subprocess.STDOUT)
- self.__logger.info("%s\n%s", " ".join(cmd), output)
- self.created_object.append(image_creator)
- self.__logger.info("Network ID : %s", net_id)
- cmd = ['timeout', '-t', JujuEpc.juju_timeout,
- 'juju', 'bootstrap', 'abot-epc', 'abot-controller',
- '--metadata-source', '/root',
- '--constraints', 'mem=2G',
- '--bootstrap-series', 'xenial',
- '--config', 'network={}'.format(net_id),
- '--config', 'ssl-hostname-verification=false',
- '--config', 'use-floating-ip=true',
- '--config', 'use-default-secgroup=true',
- '--debug']
- output = subprocess.check_output(cmd, stderr=subprocess.STDOUT)
- self.__logger.info("%s\n%s", " ".join(cmd), output)
- return True
+ 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."""
- cmd = ['juju', 'status', '--format', 'short', name]
- output = subprocess.check_output(cmd, stderr=subprocess.STDOUT)
- self.__logger.info("%s\n%s", " ".join(cmd), output)
- ret = re.search(r'(?=workload:({})\))'.format(status), output)
- if ret:
- self.__logger.info("%s workload is %s", name, status)
- return True
- self.__logger.error("%s workload differs from %s", name, status)
- return False
+ 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 = FlavorConfig(
- 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 ...")
- cmd = ['timeout', '-t', JujuEpc.juju_timeout,
- 'juju', 'deploy', '{}'.format(descriptor.get('file_name'))]
- output = subprocess.check_output(cmd, stderr=subprocess.STDOUT)
- self.__logger.info("%s\n%s", " ".join(cmd), output)
- self.__logger.info("Waiting for instances .....")
- cmd = ['timeout', '-t', JujuEpc.juju_timeout, 'juju-wait']
- output = subprocess.check_output(cmd, stderr=subprocess.STDOUT)
- self.__logger.info("%s\n%s", " ".join(cmd), output)
- self.__logger.info("Deployed Abot-epc on Openstack")
- nova_client = nova_utils.nova_client(self.snaps_creds)
- instances = get_instances(nova_client)
- self.__logger.info("List of Instance: %s", instances)
- for items in instances:
- metadata = get_instance_metadata(nova_client, items)
- if 'juju-units-deployed' in metadata:
- sec_group = 'juju-{}-{}'.format(
- metadata['juju-controller-uuid'],
- metadata['juju-model-uuid'])
- self.__logger.info("Instance: %s", sec_group)
- break
- self.__logger.info("Adding Security group rule....")
- # This will add sctp rule to a common Security Group Created
- # by juju and shared to all deployed units.
- self._add_custom_rule(sec_group)
- cmd = ['juju', 'status']
- output = subprocess.check_output(cmd, stderr=subprocess.STDOUT)
- self.__logger.debug("%s\n%s", " ".join(cmd), output)
+ (_, 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
- self.__logger.info("Copying the feature files to Abot_node ")
- cmd = ['timeout', '-t', JujuEpc.juju_timeout,
- 'juju', 'scp', '--', '-r', '-v',
- '{}/featureFiles'.format(self.case_dir), 'abot-epc-basic/0:~/']
- output = subprocess.check_output(cmd, stderr=subprocess.STDOUT)
- self.__logger.info("%s\n%s", " ".join(cmd), output)
- self.__logger.info("Copying the feature files in Abot_node ")
- cmd = ['timeout', '-t', JujuEpc.juju_timeout,
- 'juju', 'ssh', 'abot-epc-basic/0',
- 'sudo', 'rsync', '-azvv', '~/featureFiles',
- '/etc/rebaca-test-suite/featureFiles']
- output = subprocess.check_output(cmd, stderr=subprocess.STDOUT)
- self.__logger.info("%s\n%s", " ".join(cmd), output)
- return True
+ 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....")
- cmd = ['timeout', '-t', JujuEpc.juju_timeout,
- 'juju', 'run-action', 'abot-epc-basic/0', 'run',
- 'tagnames={}'.format(self.details['test_vnf']['tag_name'])]
- output = subprocess.check_output(cmd, stderr=subprocess.STDOUT)
- self.__logger.info("%s\n%s", " ".join(cmd), output)
- cmd = ['timeout', '-t', JujuEpc.juju_timeout, 'juju-wait']
- output = subprocess.check_output(cmd, stderr=subprocess.STDOUT)
- self.__logger.info("%s\n%s", " ".join(cmd), output)
+ (_, 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....")
- cmd = ['timeout', '-t', JujuEpc.juju_timeout,
- 'juju', 'scp', '--', '-v',
- 'abot-epc-basic/0:'
- '/var/lib/abot-epc-basic/artifacts/TestResults.json',
- '{}/.'.format(self.res_dir)]
- output = subprocess.check_output(cmd, stderr=subprocess.STDOUT)
- self.__logger.info("%s\n%s", " ".join(cmd), output)
+ (_, 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.res_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(
@@ -416,50 +362,48 @@ class JujuEpc(vnf.VnfOnBoarding):
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:
- cmd = ['juju', 'debug-log', '--replay', '--no-tail']
- output = subprocess.check_output(cmd, stderr=subprocess.STDOUT)
- self.__logger.debug("%s\n%s", " ".join(cmd), output)
- if not self.orchestrator['requirements']['preserve_setup']:
- self.__logger.info("Destroying Orchestrator...")
- cmd = ['timeout', '-t', JujuEpc.juju_timeout,
- 'juju', 'destroy-controller', '-y', 'abot-controller',
- '--destroy-all-models']
- output = subprocess.check_output(cmd, stderr=subprocess.STDOUT)
- self.__logger.info("%s\n%s", " ".join(cmd), output)
+ 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.exception("Some issue during the undeployment ..")
-
- if not self.orchestrator['requirements']['preserve_setup']:
- self.__logger.info('Remove the Abot_epc OS object ..')
- super(JujuEpc, self).clean()
-
- 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):
@@ -485,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:
@@ -495,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
@@ -537,23 +481,3 @@ def update_data(obj):
raise
return obj
-
-
-def get_instances(nova_client):
- """ To get all vm info of a project """
- try:
- instances = nova_client.servers.list()
- return instances
- except Exception as exc: # pylint: disable=broad-except
- logging.error("Error [get_instances(nova_client)]: %s", exc)
- return None
-
-
-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
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 f35e281dd..000000000
--- a/functest/opnfv_tests/vnf/ims/clearwater_ims_base.py
+++ /dev/null
@@ -1,164 +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 shlex
-import shutil
-import subprocess
-import time
-
-import pkg_resources
-import requests
-
-import functest.core.vnf as vnf
-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 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 = getattr(config.CONF, 'dir_ims_data')
- self.result_dir = os.path.join(getattr(config.CONF, 'dir_results'),
- self.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)
-
- 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 Exception: # pylint: disable=broad-except
- if i == 1:
- raise Exception("Unable to create a number")
- self.logger.info("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: # pylint: disable=broad-except
- self.logger.error("Unable to retrieve test results")
-
- try:
- os.remove(tempFile)
- except Exception: # pylint: disable=broad-except
- 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 c2fda6888..b93af7d6d 100644
--- a/functest/opnfv_tests/vnf/ims/cloudify_ims.py
+++ b/functest/opnfv_tests/vnf/ims/cloudify_ims.py
@@ -9,533 +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 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
-from xtesting.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
+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 = getattr(
- config.CONF, 'vnf_{}_config'.format(self.case_name))
- except Exception:
- raise Exception("VNF config file not found")
+ config.CONF, f'vnf_{self.case_name}_config')
+ except Exception as exc:
+ raise Exception("VNF config file not found") from exc
+ self.case_dir = pkg_resources.resource_filename(
+ 'functest', 'opnfv_tests/vnf/ims')
config_file = os.path.join(self.case_dir, self.config)
- self.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-{}'.format(self.uuid),
- 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-{}'.format(self.uuid),
- cidr='10.67.79.0/24',
- dns_nameservers=[env.get('NAMESERVER')])
- network_settings = NetworkConfig(
- name='cloudify_ims_network-{}'.format(self.uuid),
- 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-{}'.format(self.uuid),
- 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-{}".format(self.uuid),
- direction=Direction.ingress, protocol=Protocol.tcp,
- port_range_min=1, port_range_max=65535))
- sg_rules.append(
- SecurityGroupRuleConfig(
- sec_grp_name="sg-cloudify-manager-{}".format(self.uuid),
- 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-{}".format(self.uuid),
- 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-{}'.format(self.uuid),
- network_name=network_settings.name)
-
- manager_settings = VmInstanceConfig(
- name='cloudify_manager-{}'.format(self.uuid),
- 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-{}'.format(self.uuid),
- 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.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.snaps_creds.username,
- keystone_password=self.snaps_creds.password,
- keystone_tenant_name=self.snaps_creds.project_name,
- keystone_url=public_auth_url,
- region=self.snaps_creds.region_name,
- user_domain_name=self.snaps_creds.user_domain_name,
- project_domain_name=self.snaps_creds.project_domain_name)
+ 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)
- 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:
+ for loop in range(10):
try:
- cfy_status = cfy_client.manager.get_status()['status']
- self.__logger.info(
- "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.info(
- "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")
+ "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/"
- self.run_blocking_ssh_command(ssh, cmd)
- cmd = "sudo chmod 444 /etc/cloudify/cloudify_ims.pem"
- self.run_blocking_ssh_command(ssh, cmd)
- cmd = "sudo yum install -y gcc python-devel"
- self.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,
- key_pair_name=keypair_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 Exception: # 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 Exception: # pylint: disable=broad-except
- self.__logger.exception("Some issue during the undeployment ..")
-
- super(CloudifyIms, self).clean()
-
- @staticmethod
- def run_blocking_ssh_command(ssh, cmd,
- error_msg="Unable to run this command"):
- """Command to run ssh command with the exit status."""
- _, stdout, stderr = ssh.exec_command(cmd)
- CloudifyIms.__logger.debug("SSH %s stdout: %s", cmd, stdout.read())
- if stdout.channel.recv_exit_status() != 0:
- CloudifyIms.__logger.error("SSH %s stderr: %s", cmd, stderr.read())
- raise Exception(error_msg)
-
- @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)
+ 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 4586dfd33..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/ubuntu-14.04-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 37148c918..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 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
-from xtesting.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 import config
-from functest.utils import env
-
-__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 = getattr(
- config.CONF, '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',
- dns_nameservers=[env.get('NAMESERVER')])
- 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 0e020cbe4..000000000
--- a/functest/opnfv_tests/vnf/ims/cloudify_ims_perf.yaml
+++ /dev/null
@@ -1,91 +0,0 @@
----
-tenant_images:
- ubuntu_14.04:
- /home/opnfv/functest/images/ubuntu-14.04-server-cloudimg-amd64-disk1.img
- cloudify_manager_4.0:
- /home/opnfv/functest/images/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 bc71a38cf..000000000
--- a/functest/opnfv_tests/vnf/ims/ixia/utils/IxLoadUtils.py
+++ /dev/null
@@ -1,399 +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 sys
-import time
-import logging
-
-import requests
-
-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 41c23dc53..000000000
--- a/functest/opnfv_tests/vnf/ims/ixia/utils/IxRestUtils.py
+++ /dev/null
@@ -1,193 +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/router/cloudify_vrouter.py b/functest/opnfv_tests/vnf/router/cloudify_vrouter.py
index 9f6327b78..32d675347 100644
--- a/functest/opnfv_tests/vnf/router/cloudify_vrouter.py
+++ b/functest/opnfv_tests/vnf/router/cloudify_vrouter.py
@@ -14,69 +14,54 @@
import logging
import os
import time
-import uuid
-from cloudify_rest_client import CloudifyClient
-from cloudify_rest_client.executions import Execution
-from scp import SCPClient
+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 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.user import UserConfig
-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_security_group import OpenStackSecurityGroup
-from snaps.openstack.create_router import OpenStackRouter
-from snaps.openstack.create_user import OpenStackUser
-
-import snaps.openstack.utils.glance_utils as glance_utils
-from snaps.openstack.utils import keystone_utils
-
__author__ = "Shuya Nakama <shuya.nakama@okinawaopenlabs.org>"
-class CloudifyVrouter(vrouter_base.VrouterOnBoardingBase):
+class CloudifyVrouter(cloudify.Cloudify):
# pylint: disable=too-many-instance-attributes
"""vrouter testcase deployed with Cloudify Orchestrator."""
__logger = logging.getLogger(__name__)
- name = __name__
+
+ filename_alt = '/home/opnfv/functest/images/vyos-1.1.8-amd64.qcow2'
+
+ flavor_alt_ram = 1024
+ flavor_alt_vcpus = 1
+ flavor_alt_disk = 3
+
+ check_console_loop = 12
+
+ 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 = getattr(
- config.CONF, 'vnf_{}_config'.format(self.case_name))
- except Exception:
- raise Exception("VNF config file not found")
-
- self.cfy_manager_ip = ''
- self.deployment_name = ''
+ 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=functest_utils.get_parameter_from_yaml(
@@ -91,7 +76,7 @@ class CloudifyVrouter(vrouter_base.VrouterOnBoardingBase):
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=functest_utils.get_parameter_from_yaml(
"vnf.descriptor", config_file),
@@ -110,6 +95,10 @@ class CloudifyVrouter(vrouter_base.VrouterOnBoardingBase):
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=functest_utils.get_parameter_from_yaml(
@@ -121,260 +110,94 @@ class CloudifyVrouter(vrouter_base.VrouterOnBoardingBase):
"tenant_images", config_file)
self.__logger.info("Images needed for vrouter: %s", self.images)
- @staticmethod
- def run_blocking_ssh_command(ssh, cmd,
- error_msg="Unable to run this command"):
- """Command to run ssh command with the exit status."""
- (_, stdout, stderr) = ssh.exec_command(cmd)
- CloudifyVrouter.__logger.debug("SSH %s stdout: %s", cmd, stdout.read())
- if stdout.channel.recv_exit_status() != 0:
- CloudifyVrouter.__logger.error(
- "SSH %s stderr: %s", cmd, stderr.read())
- raise Exception(error_msg)
-
- def prepare(self):
- super(CloudifyVrouter, self).prepare()
- self.__logger.info("Additional pre-configuration steps")
- self.util.set_credentials(self.snaps_creds)
- 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
+
+ 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):
# 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-{}'.format(self.uuid),
- 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-{}'.format(self.uuid),
- cidr='10.67.79.0/24',
- dns_nameservers=[env.get('NAMESERVER')])
- network_settings = NetworkConfig(
- name='cloudify_vrouter_network-{}'.format(self.uuid),
- 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-{}'.format(self.uuid),
- 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-{}".format(self.uuid),
- direction=Direction.ingress,
- protocol=Protocol.tcp, port_range_min=1,
- port_range_max=65535))
- sg_rules.append(
- SecurityGroupRuleConfig(
- sec_grp_name="sg-cloudify-manager-{}".format(self.uuid),
- 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-{}".format(self.uuid),
- 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-{}'.format(self.uuid),
- network_name=network_settings.name)
-
- manager_settings = VmInstanceConfig(
- name='cloudify_manager-{}'.format(self.uuid),
- 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-{}'.format(self.uuid),
- 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)
-
- 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.info(
- "The current manager status is %s", cfy_status)
- except Exception: # pylint: disable=broad-except
- self.__logger.info(
- "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")
-
- duration = time.time() - start_time
+ self.put_private_key()
+ self.upload_cfy_plugins(self.cop_yaml, self.cop_wgn)
- 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/"
- self.run_blocking_ssh_command(ssh, cmd)
- cmd = "sudo chmod 444 /etc/cloudify/cloudify_vrouter.pem"
- self.run_blocking_ssh_command(ssh, cmd)
- cmd = "sudo yum install -y gcc python-devel"
- self.run_blocking_ssh_command(
- ssh, cmd, "Unable to install packages on manager")
+ self.image_alt = self.publish_image_alt()
+ self.flavor_alt = self.create_flavor_alt()
+ duration = time.time() - start_time
self.details['orchestrator'].update(status='PASS', duration=duration)
- self.vnf['inputs'].update(dict(external_network_name=ext_net_name))
-
- return True
-
- 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")
-
- user_creator = OpenStackUser(
- self.snaps_creds,
- UserConfig(
- name='cloudify_network_bug-{}'.format(self.uuid),
- password=str(uuid.uuid4()),
- project_name=self.tenant_name,
- domain=self.snaps_creds.user_domain_name,
- roles={'_member_': self.tenant_name}))
- user_creator.create()
- self.created_object.append(user_creator)
- snaps_creds = user_creator.get_os_creds(self.snaps_creds.project_name)
- self.__logger.debug("snaps creds: %s", snaps_creds)
-
- self.vnf['inputs'].update(dict(target_vnf_image_id=image.id))
- self.vnf['inputs'].update(dict(reference_vnf_image_id=image.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=snaps_creds.username))
+ 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_password=snaps_creds.password))
+ keystone_username=self.project.user.name))
self.vnf['inputs'].update(dict(
- keystone_tenant_name=snaps_creds.project_name))
+ keystone_password=self.project.password))
self.vnf['inputs'].update(dict(
- keystone_user_domain_name=snaps_creds.user_domain_name))
+ keystone_tenant_name=self.project.project.name))
self.vnf['inputs'].update(dict(
- keystone_project_domain_name=snaps_creds.project_domain_name))
+ keystone_user_domain_name=os.environ.get(
+ 'OS_USER_DOMAIN_NAME', 'Default')))
self.vnf['inputs'].update(dict(
- region=snaps_creds.region_name))
+ keystone_project_domain_name=os.environ.get(
+ 'OS_PROJECT_DOMAIN_NAME', 'Default')))
self.vnf['inputs'].update(dict(
- keystone_url=keystone_utils.get_endpoint(
- snaps_creds, 'identity')))
+ 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")
+ descriptor = self.vnf['descriptor']
+ 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(
+ 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')),
+ 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
@@ -388,19 +211,10 @@ class CloudifyVrouter(vrouter_base.VrouterOnBoardingBase):
return result
def test_vnf(self):
- cfy_client = self.orchestrator['object']
- credentials = {"snaps_creds": self.snaps_creds}
-
- 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,
@@ -409,95 +223,12 @@ class CloudifyVrouter(vrouter_base.VrouterOnBoardingBase):
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 Exception: # 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 Exception: # pylint: disable=broad-except
- self.__logger.exception("Some issue during the undeployment ..")
-
- super(CloudifyVrouter, self).clean()
-
- 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)
-
-
-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))
+ 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 be7bee889..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
@@ -12,6 +12,7 @@
"""vrouter function test execution module"""
import logging
+import os
import time
import yaml
@@ -20,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__)
@@ -31,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 2865175b3..111f20c1a 100644
--- a/functest/opnfv_tests/vnf/router/utilvnf.py
+++ b/functest/opnfv_tests/vnf/router/utilvnf.py
@@ -14,14 +14,10 @@
import json
import logging
import os
-import pkg_resources
import requests
import yaml
from functest.utils import config
-from git import Repo
-from snaps.openstack.utils import nova_utils
-
RESULT_SPRIT_INDEX = {
"transfer": 8,
@@ -47,22 +43,19 @@ NUMBER_OF_DIGITS_FOR_AVG_JITTER = 3
NUMBER_OF_DIGITS_FOR_AVG_PKT_LOSS = 1
-class Utilvnf(object): # pylint: disable=too-many-instance-attributes
+class Utilvnf(): # pylint: disable=too-many-instance-attributes
""" Utility class of vrouter testcase """
logger = logging.getLogger(__name__)
def __init__(self):
- self.snaps_creds = ""
self.vnf_data_dir = getattr(config.CONF, 'dir_router_data')
- self.opnfv_vnf_data_dir = "opnfv-vnf-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/"
@@ -71,29 +64,7 @@ class Utilvnf(object): # pylint: disable=too-many-instance-attributes
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 = getattr(
- config.CONF, '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,71 +78,27 @@ class Utilvnf(object): # pylint: disable=too-many-instance-attributes
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)
-
- 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"]
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"]
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=requests.auth.HTTPBasicAuth('admin', 'admin'),
@@ -200,15 +127,10 @@ class Utilvnf(object): # pylint: disable=too-many-instance-attributes
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):
@@ -225,7 +147,7 @@ class Utilvnf(object): # pylint: disable=too-many-instance-attributes
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"])
@@ -288,24 +210,29 @@ class Utilvnf(object): # pylint: disable=too-many-instance-attributes
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)
@@ -315,8 +242,6 @@ class Utilvnf(object): # pylint: disable=too-many-instance-attributes
@staticmethod
def get_test_scenario(file_path):
- test_scenario_file = open(file_path,
- 'r')
- test_scenario_yaml = yaml.safe_load(test_scenario_file)
- test_scenario_file.close()
+ 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 a7a70f6d7..d3a216ed0 100644
--- a/functest/opnfv_tests/vnf/router/vnf_controller/checker.py
+++ b/functest/opnfv_tests/vnf/router/vnf_controller/checker.py
@@ -18,7 +18,7 @@ import re
from jinja2 import Environment, FileSystemLoader
-class Checker(object):
+class Checker():
"""vrouter test result check class"""
logger = logging.getLogger(__name__)
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 7d9116bcc..a86a16485 100644
--- a/functest/opnfv_tests/vnf/router/vnf_controller/command_generator.py
+++ b/functest/opnfv_tests/vnf/router/vnf_controller/command_generator.py
@@ -15,7 +15,7 @@ import logging
from jinja2 import Environment, FileSystemLoader
-class CommandGenerator(object):
+class CommandGenerator():
"""command generator class for vrouter testing"""
logger = logging.getLogger(__name__)
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 c5f554cbd..269f6526b 100644
--- a/functest/opnfv_tests/vnf/router/vnf_controller/ssh_client.py
+++ b/functest/opnfv_tests/vnf/router/vnf_controller/ssh_client.py
@@ -24,7 +24,7 @@ DEFAULT_CONNECT_RETRY_COUNT = 10
DEFAULT_SEND_TIMEOUT = 10
-class SshClient(object): # pylint: disable=too-many-instance-attributes
+class SshClient(): # pylint: disable=too-many-instance-attributes
"""ssh client class for vrouter testing"""
logger = logging.getLogger(__name__)
@@ -43,7 +43,7 @@ class SshClient(object): # pylint: disable=too-many-instance-attributes
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()
@@ -80,7 +80,7 @@ class SshClient(object): # pylint: disable=too-many-instance-attributes
retrycount -= 1
if retrycount == 0:
- self.logger.warn(
+ self.logger.warning(
"Cannot establish connection to IP '%s'", self.ip_address)
self.connected = False
return self.connected
@@ -110,7 +110,7 @@ class SshClient(object): # pylint: disable=too-many-instance-attributes
cmd)
break
- res_buff += res
+ res_buff += res.decode("utf-8")
self.logger.debug("Response : '%s'", res_buff)
return res_buff
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 56dc1e237..2210b3909 100644
--- a/functest/opnfv_tests/vnf/router/vnf_controller/vm_controller.py
+++ b/functest/opnfv_tests/vnf/router/vnf_controller/vm_controller.py
@@ -23,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__)
@@ -34,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(
@@ -85,16 +83,10 @@ class VmController(object):
result = ssh.connect(self.ssh_connect_timeout,
self.ssh_connect_retry_count)
if not result:
- self.logger.warn("Reboot %s", vm_info["vnf_name"])
- 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:
- self.logger.error(
- "Cannot establish connection to IP '%s'. Aborting!",
- ssh.ip_address)
- return None
+ self.logger.error(
+ "Cannot establish connection to IP '%s'. Aborting!",
+ ssh.ip_address)
+ return None
(result, _) = self.command_create_and_execute(
ssh,
@@ -109,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,
@@ -124,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
@@ -140,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 a5b1ad856..46584456f 100644
--- a/functest/opnfv_tests/vnf/router/vnf_controller/vnf_controller.py
+++ b/functest/opnfv_tests/vnf/router/vnf_controller/vnf_controller.py
@@ -26,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__)
@@ -36,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()
@@ -49,10 +49,9 @@ class VnfController(object):
def config_vnf(self, source_vnf, destination_vnf, test_cmd_file_path,
parameter_file_path, prompt_file_path):
# pylint: disable=too-many-arguments
- 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["macaddress"] = source_vnf["data_plane_network_mac"]
cmd_input_param["source_ip"] = source_vnf["data_plane_network_ip"]
@@ -71,19 +70,16 @@ class VnfController(object):
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"],
diff --git a/functest/opnfv_tests/vnf/router/vrouter_base.py b/functest/opnfv_tests/vnf/router/vrouter_base.py
index 8818032da..932770b9c 100644
--- a/functest/opnfv_tests/vnf/router/vrouter_base.py
+++ b/functest/opnfv_tests/vnf/router/vrouter_base.py
@@ -19,37 +19,22 @@ import time
import pkg_resources
-import functest.core.vnf as vnf
-from functest.utils import config
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 = getattr(config.CONF, 'dir_router_data')
- self.result_dir = os.path.join(getattr(config.CONF, '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
@@ -65,9 +50,9 @@ 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)
test_result_data_list.append(result_data)
@@ -89,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)
@@ -117,6 +98,7 @@ class VrouterOnBoardingBase(vnf.VnfOnBoarding):
return result, test_result_data
def get_vnf_info_list(self, target_vnf_name):
- # pylint: disable=unused-argument,no-self-use
- 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 aeeca5871..000000000
--- a/functest/tests/unit/ci/test_check_deployment.py
+++ /dev/null
@@ -1,286 +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
-
-# pylint: disable=missing-docstring
-
-import socket
-import unittest
-
-import logging
-import mock
-
-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,too-many-public-methods
-
- 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
-
- @mock.patch('socket.socket.connect', side_effect=TypeError)
- def test_verify_connectivity_ko1(self, *args):
- self.assertFalse(check_deployment.verify_connectivity("127.0.0.1"))
- args[0].assert_called_once_with((None, 80))
-
- @mock.patch('socket.socket.connect', side_effect=socket.error)
- def test_verify_connectivity_ko2(self, *args):
- self.assertFalse(
- check_deployment.verify_connectivity("http://127.0.0.1"))
- args[0].assert_called_once_with(("127.0.0.1", 80))
-
- @mock.patch('socket.socket.connect', side_effect=socket.error)
- def test_verify_connectivity_ko3(self, *args):
- self.assertFalse(
- check_deployment.verify_connectivity("https://127.0.0.1"))
- args[0].assert_called_once_with(("127.0.0.1", 443))
-
- @mock.patch('socket.socket.connect')
- def test_verify_connectivity(self, *args):
- self.assertTrue(
- check_deployment.verify_connectivity("https://127.0.0.1"))
- args[0].assert_called_once_with(("127.0.0.1", 443))
-
- @mock.patch('snaps.openstack.utils.keystone_utils.keystone_session',
- return_value=mock.Mock(
- get_token=mock.Mock(side_effect=Exception)))
- def test_get_auth_token_ko(self, *args):
- with self.assertRaises(Exception):
- check_deployment.get_auth_token(self.os_creds)
- args[0].assert_called_once_with(self.os_creds)
-
- @mock.patch('snaps.openstack.utils.keystone_utils.keystone_session',
- return_value=mock.Mock(
- get_token=mock.Mock(return_value="foo")))
- def test_get_auth_token(self, *args):
- self.assertEqual(check_deployment.get_auth_token(self.os_creds), "foo")
- args[0].assert_called_once_with(self.os_creds)
-
- @mock.patch('six.moves.builtins.open',
- mock.mock_open(read_data='OS_AUTH_URL'))
- @mock.patch('functest.ci.check_deployment.os.path.isfile', returns=True)
- def test_check_rc(self, *args):
- self.deployment.check_rc()
- args[0].assert_called_once_with(self.rc_file)
-
- @mock.patch('functest.ci.check_deployment.os.path.isfile',
- return_value=False)
- def test_check_rc_missing_file(self, *args):
- with self.assertRaises(Exception) as context:
- self.deployment.check_rc()
- args[0].assert_called_once_with(self.rc_file)
- msg = 'RC file {} does not exist!'.format(self.rc_file)
- self.assertTrue(msg in str(context.exception))
-
- @mock.patch('six.moves.builtins.open',
- mock.mock_open(read_data='test'))
- @mock.patch('functest.ci.check_deployment.os.path.isfile',
- return_value=True)
- def test_check_rc_missing_os_auth(self, *args):
- with self.assertRaises(Exception) as context:
- self.deployment.check_rc()
- args[0].assert_called_once_with(self.rc_file)
- msg = 'OS_AUTH_URL not defined in {}.'.format(self.rc_file)
- self.assertTrue(msg in str(context.exception))
-
- @mock.patch('functest.ci.check_deployment.get_auth_token',
- return_value='gAAAAABaOhXGS')
- @mock.patch('functest.ci.check_deployment.verify_connectivity',
- return_value=True)
- def test_check_auth_endpoint(self, *args):
- self.deployment.check_auth_endpoint()
- args[0].assert_called_once_with(self.endpoint_test)
- args[1].assert_called_once_with(mock.ANY)
-
- @mock.patch('functest.ci.check_deployment.verify_connectivity',
- return_value=False)
- def test_check_auth_endpoint_ko(self, *args):
- with self.assertRaises(Exception) as context:
- self.deployment.check_auth_endpoint()
- msg = "OS_AUTH_URL {} is not reachable.".format(self.os_creds.auth_url)
- args[0].assert_called_once_with(self.os_creds.auth_url)
- self.assertTrue(msg in str(context.exception))
-
- @mock.patch('functest.ci.check_deployment.verify_connectivity',
- return_value=True)
- @mock.patch('functest.ci.check_deployment.keystone_utils.get_endpoint')
- def test_check_public_endpoint(self, *args):
- args[0].return_value = self.endpoint_test
- self.deployment.check_public_endpoint()
- args[0].assert_called_once_with(
- mock.ANY, 'identity', interface='public')
- args[1].assert_called_once_with(self.endpoint_test)
-
- @mock.patch('functest.ci.check_deployment.verify_connectivity',
- return_value=False)
- @mock.patch('functest.ci.check_deployment.keystone_utils.get_endpoint')
- def test_check_public_endpoint_ko(self, *args):
- args[0].return_value = self.endpoint_test
- with self.assertRaises(Exception) as context:
- self.deployment.check_public_endpoint()
- args[0].assert_called_once_with(
- mock.ANY, 'identity', interface='public')
- args[1].assert_called_once_with(self.endpoint_test)
- msg = "Public endpoint {} is not reachable.".format(self.endpoint_test)
- self.assertTrue(msg in str(context.exception))
-
- @mock.patch('functest.ci.check_deployment.verify_connectivity',
- return_value=True)
- @mock.patch('functest.ci.check_deployment.keystone_utils.get_endpoint')
- def test_check_service_endpoint(self, *args):
- self.deployment.check_service_endpoint(self.service_test)
- args[0].assert_called_once_with(
- mock.ANY, self.service_test, interface='public')
- args[1].assert_called_once_with(args[0].return_value)
-
- @mock.patch('functest.ci.check_deployment.verify_connectivity',
- return_value=False)
- @mock.patch('functest.ci.check_deployment.keystone_utils.get_endpoint')
- def test_check_service_endpoint_ko(self, *args):
- args[0].return_value = self.endpoint_test
- with 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(msg in str(context.exception))
- args[0].assert_called_once_with(
- mock.ANY, self.service_test, interface='public')
- args[1].assert_called_once_with(args[0].return_value)
-
- @mock.patch('functest.ci.check_deployment.nova_utils.nova_client')
- def test_check_nova(self, mock_method):
- self.deployment.check_nova()
- mock_method.assert_called_once_with(mock.ANY)
-
- @mock.patch('functest.ci.check_deployment.nova_utils.nova_client',
- return_value=mock.Mock(
- servers=mock.Mock(list=mock.Mock(side_effect=Exception))))
- def test_check_nova_fail(self, mock_method):
- with self.assertRaises(Exception):
- self.deployment.check_nova()
- mock_method.assert_called_once_with(mock.ANY)
-
- @mock.patch('functest.ci.check_deployment.neutron_utils.neutron_client')
- def test_check_neutron(self, mock_method):
- self.deployment.check_neutron()
- mock_method.assert_called_once_with(mock.ANY)
-
- @mock.patch('functest.ci.check_deployment.neutron_utils.neutron_client',
- return_value=mock.Mock(
- list_networks=mock.Mock(side_effect=Exception)))
- def test_check_neutron_fail(self, mock_method):
- with self.assertRaises(Exception):
- self.deployment.check_neutron()
- mock_method.assert_called_once_with(mock.ANY)
-
- @mock.patch('functest.ci.check_deployment.glance_utils.glance_client')
- def test_check_glance(self, mock_method):
- self.deployment.check_glance()
- mock_method.assert_called_once_with(mock.ANY)
-
- @mock.patch('functest.ci.check_deployment.glance_utils.glance_client',
- return_value=mock.Mock(
- images=mock.Mock(list=mock.Mock(side_effect=Exception))))
- def test_check_glance_fail(self, mock_method):
- with self.assertRaises(Exception):
- self.deployment.check_glance()
- mock_method.assert_called_once_with(mock.ANY)
-
- @mock.patch('functest.ci.check_deployment.LOGGER.info')
- @mock.patch('functest.opnfv_tests.openstack.snaps.snaps_utils.'
- 'get_ext_net_name', return_value='ext-net')
- def test_check_extnet(self, *args):
- self.deployment.check_ext_net()
- args[0].assert_called_once_with(mock.ANY)
- args[1].assert_called_once_with(
- "External network found: %s", "ext-net")
-
- @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 str(context.exception))
-
- @mock.patch('functest.ci.check_deployment.CheckDeployment.check_rc',
- side_effect=Exception)
- def test_check_all_exc1(self, *args):
- with self.assertRaises(Exception):
- self.deployment.check_all()
- args[0].assert_called_once_with()
-
- @mock.patch('snaps.openstack.tests.openstack_tests.get_credentials',
- side_effect=Exception)
- @mock.patch('functest.ci.check_deployment.CheckDeployment.check_rc')
- def test_check_all_exc2(self, *args):
- with self.assertRaises(Exception):
- self.deployment.check_all()
- args[0].assert_called_once_with()
- args[1].assert_called_once_with(
- os_env_file=self.rc_file, proxy_settings_str=None,
- ssh_proxy_cmd=None)
-
- @mock.patch('snaps.openstack.tests.openstack_tests.get_credentials',
- return_value=None)
- @mock.patch('functest.ci.check_deployment.CheckDeployment.check_rc')
- def test_check_all_exc3(self, *args):
- with self.assertRaises(Exception):
- self.deployment.check_all()
- args[0].assert_called_once_with()
- args[1].assert_called_once_with(
- os_env_file=self.rc_file, proxy_settings_str=None,
- ssh_proxy_cmd=None)
-
- @mock.patch('functest.ci.check_deployment.CheckDeployment.check_ext_net')
- @mock.patch('functest.ci.check_deployment.CheckDeployment.check_glance')
- @mock.patch('functest.ci.check_deployment.CheckDeployment.check_neutron')
- @mock.patch('functest.ci.check_deployment.CheckDeployment.check_nova')
- @mock.patch(
- 'functest.ci.check_deployment.CheckDeployment.check_service_endpoint')
- @mock.patch(
- 'functest.ci.check_deployment.CheckDeployment.check_public_endpoint')
- @mock.patch(
- 'functest.ci.check_deployment.CheckDeployment.check_auth_endpoint')
- @mock.patch('snaps.openstack.tests.openstack_tests.get_credentials')
- @mock.patch('functest.ci.check_deployment.CheckDeployment.check_rc')
- def test_check_all(self, *args):
- self.assertEqual(self.deployment.check_all(), 0)
- for i in [0, 2, 3, 5, 6, 7, 8]:
- args[i].assert_called_once_with()
- args[1].assert_called_once_with(
- os_env_file=self.rc_file, proxy_settings_str=None,
- ssh_proxy_cmd=None)
- calls = [mock.call('compute'), mock.call('network'),
- mock.call('image')]
- args[4].assert_has_calls(calls)
-
-
-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 7d6f77870..000000000
--- a/functest/tests/unit/cli/commands/test_cli_env.py
+++ /dev/null
@@ -1,69 +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 os
-import re
-import unittest
-
-import mock
-
-from functest.cli.commands import cli_env
-
-
-class RegexMatch(object): # pylint: disable=too-few-public-methods
- def __init__(self, msg):
- self.msg = msg
-
- def __eq__(self, other):
- match = re.search(self.msg, other)
- return match is not None
-
-
-class CliEnvTesting(unittest.TestCase):
-
- def setUp(self):
- self.cli_environ = cli_env.CliEnv()
-
- def _test_show_missing_env_var(self, var, *args):
- # pylint: disable=unused-argument
- if var == 'INSTALLER_TYPE':
- os.environ['INSTALLER_TYPE'] = ''
- reg_string = r"| INSTALLER: Unknown, \S+\s*|"
- elif var == 'SCENARIO':
- os.environ['DEPLOY_SCENARIO'] = ''
- reg_string = r"| SCENARIO: Unknown\s*|"
- elif var == 'NODE':
- os.environ['NODE_NAME'] = ''
- reg_string = r"| POD: Unknown\s*|"
- elif var == 'BUILD_TAG':
- os.environ['BUILD_TAG'] = ''
- reg_string = r"| BUILD TAG: None|"
-
- with mock.patch('functest.cli.commands.cli_env.click.echo') \
- as mock_click_echo:
- self.cli_environ.show()
- mock_click_echo.assert_called_with(RegexMatch(reg_string))
-
- def test_show_ci_installer_type_ko(self, *args):
- self._test_show_missing_env_var('INSTALLER_TYPE', *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)
-
-
-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 a5e562a27..000000000
--- a/functest/tests/unit/cli/commands/test_cli_os.py
+++ /dev/null
@@ -1,78 +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
-
-# pylint: disable=missing-docstring
-
-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.openstack_creds = 'test_env_file'
- self.snapshot_file = 'test_snapshot_file'
- os.environ["OS_AUTH_URL"] = ''
- 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_auth_url_ko(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")
- mock_exit.assert_called_once_with(0)
-
- @mock.patch('functest.cli.commands.cli_os.exit')
- @mock.patch('functest.cli.commands.cli_os.click.echo')
- def test_ping_endpoint_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 67bf2d503..000000000
--- a/functest/tests/unit/cli/commands/test_cli_testcase.py
+++ /dev/null
@@ -1,77 +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.cli.commands import cli_testcase
-
-
-class CliTestCasesTesting(unittest.TestCase):
-
- def setUp(self):
- self.testname = 'testname'
- with mock.patch('xtesting.ci.tier_builder'):
- self.cli_tests = cli_testcase.CliTestcase()
-
- @mock.patch('functest.utils.functest_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.utils.functest_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.utils.functest_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.utils.functest_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 23b614b81..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
-
-# pylint: disable=missing-docstring
-
-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('xtesting.ci.tier_builder'):
- 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.utils.functest_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.utils.functest_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.utils.functest_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.utils.functest_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 185a52204..000000000
--- a/functest/tests/unit/cli/test_cli_base.py
+++ /dev/null
@@ -1,102 +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 os
-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)):
- os.environ['OS_AUTH_URL'] = ''
- 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/test_vnf.py b/functest/tests/unit/core/test_vnf.py
deleted file mode 100644
index 81d9eef76..000000000
--- a/functest/tests/unit/core/test_vnf.py
+++ /dev/null
@@ -1,196 +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 snaps.openstack.os_credentials import OSCreds
-from xtesting.core import testcase
-
-from functest.core import vnf
-from functest.utils import constants
-
-
-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):
- 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.ENV_FILE)
- 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.ENV_FILE)
- 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('snaps.openstack.utils.keystone_utils.get_role_by_name',
- return_value="admin")
- @mock.patch('snaps.openstack.utils.keystone_utils.keystone_client')
- @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.ENV_FILE)
- args[1].assert_called_with(mock.ANY, mock.ANY)
- args[2].assert_called_with(mock.ANY)
- args[3].assert_called_with(mock.ANY, mock.ANY)
- args[4].assert_called_with(mock.ANY, mock.ANY)
-
- @mock.patch('functest.core.vnf.OpenStackUser')
- @mock.patch('snaps.openstack.utils.keystone_utils.get_role_by_name',
- return_value="admin")
- @mock.patch('snaps.openstack.utils.keystone_utils.keystone_client')
- @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.ENV_FILE)
- args[1].assert_called_with(mock.ANY, mock.ANY)
- args[2].assert_called_with(mock.ANY)
- args[3].assert_called_with(mock.ANY, mock.ANY)
- args[4].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/odl/test_odl.py b/functest/tests/unit/odl/test_odl.py
index 6304d37a3..c675c2988 100644
--- a/functest/tests/unit/odl/test_odl.py
+++ b/functest/tests/unit/odl/test_odl.py
@@ -14,6 +14,7 @@ import os
import unittest
import mock
+import munch
from robot.errors import RobotError
import six
from six.moves import urllib
@@ -32,9 +33,10 @@ class ODLTesting(unittest.TestCase):
logging.disable(logging.CRITICAL)
_keystone_ip = "127.0.0.1"
- _neutron_url = u"https://127.0.0.1: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"
@@ -44,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
@@ -56,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,
@@ -101,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(
@@ -156,19 +159,19 @@ class ODLMainTesting(ODLTesting):
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,
include=[],
@@ -221,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):
@@ -229,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):
@@ -238,62 +243,157 @@ 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
+ # pylint: disable=too-many-public-methods,missing-docstring
- @mock.patch('snaps.openstack.utils.keystone_utils.get_endpoint',
- return_value=ODLTesting._neutron_url)
- @mock.patch('functest.opnfv_tests.openstack.snaps.snaps_utils.'
- 'get_credentials')
+ @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()
- args[1].assert_called_once_with(mock.ANY, 'network')
- @mock.patch('snaps.openstack.utils.keystone_utils.get_endpoint',
- return_value=ODLTesting._neutron_url)
- @mock.patch('functest.opnfv_tests.openstack.snaps.snaps_utils.'
- 'get_credentials')
+ @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()
- args[1].assert_called_once_with(mock.ANY, 'network')
- @mock.patch('snaps.openstack.utils.keystone_utils.get_endpoint',
- return_value=ODLTesting._neutron_url)
- @mock.patch('functest.opnfv_tests.openstack.snaps.snaps_utils.'
- 'get_credentials')
+ @mock.patch('os_client_config.make_shade')
def _test_run(self, status=testcase.TestCase.EX_OK,
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']
@@ -313,14 +413,21 @@ class ODLRunTesting(ODLTesting):
osprojectdomainname=self._os_projectdomainname,
osuserdomainname=self._os_userdomainname)
args[0].assert_called_once_with()
- args[1].assert_called_once_with(mock.ANY, 'network')
-
- @mock.patch('snaps.openstack.utils.keystone_utils.get_endpoint',
- return_value=ODLTesting._neutron_url)
- @mock.patch('functest.opnfv_tests.openstack.snaps.snaps_utils.'
- 'get_credentials')
+ 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, *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']
@@ -336,10 +443,13 @@ class ODLRunTesting(ODLTesting):
osprojectdomainname=self._os_projectdomainname,
osuserdomainname=self._os_userdomainname)
args[0].assert_called_once_with()
- args[1].assert_called_once_with(mock.ANY, 'network')
+ 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('snaps.openstack.utils.keystone_utils.get_endpoint',
+ with mock.patch('os_client_config.make_shade',
side_effect=Exception()):
self.assertEqual(self.test.run(),
testcase.TestCase.EX_RUN_ERROR)
@@ -379,65 +489,48 @@ class ODLRunTesting(ODLTesting):
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)
-
- def test_fuel_no_controller_ip(self):
- os.environ["INSTALLER_TYPE"] = "fuel"
- self._test_missing_value()
+ self._test_run(testcase.TestCase.EX_OK, None,
+ odlip=self._sdn_controller_ip,
+ odlwebport=self._odl_webport)
- def test_fuel(self):
+ def test_os_interface_public(self):
+ os.environ["OS_INTERFACE"] = "public"
os.environ["SDN_CONTROLLER_IP"] = self._sdn_controller_ip
- os.environ["INSTALLER_TYPE"] = "fuel"
self._test_run(testcase.TestCase.EX_OK, None,
odlip=self._sdn_controller_ip,
- odlwebport='8282',
- odlrestconfport='8282')
-
- def test_apex_no_controller_ip(self):
- os.environ["INSTALLER_TYPE"] = "apex"
- self._test_missing_value()
+ 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, None,
- odlip=self._sdn_controller_ip, odlwebport='8081',
- odlrestconfport='8081')
-
- def test_netvirt_no_controller_ip(self):
- os.environ["INSTALLER_TYPE"] = "netvirt"
- self._test_missing_value()
+ 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, None,
- odlip=self._sdn_controller_ip, odlwebport='8081',
- odlrestconfport='8081')
+ odlip=self._sdn_controller_ip,
+ odlwebport=self._odl_webport)
- def test_compass(self):
+ def test_os_interface_admin(self):
+ os.environ["OS_INTERFACE"] = "admin"
os.environ["SDN_CONTROLLER_IP"] = self._sdn_controller_ip
- os.environ["INSTALLER_TYPE"] = "compass"
self._test_run(testcase.TestCase.EX_OK, None,
odlip=self._sdn_controller_ip,
- odlrestconfport='8080')
-
- def test_daisy_no_controller_ip(self):
- os.environ["INSTALLER_TYPE"] = "daisy"
- self._test_missing_value()
+ 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, None,
- 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):
@@ -447,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)
@@ -457,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)
@@ -471,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):
@@ -512,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):
@@ -520,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/api/resources/v1/__init__.py b/functest/tests/unit/openstack/cinder/__init__.py
index e69de29bb..e69de29bb 100644
--- a/functest/api/resources/v1/__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 989ade090..f3c2e7cf6 100644
--- a/functest/tests/unit/openstack/rally/test_rally.py
+++ b/functest/tests/unit/openstack/rally/test_rally.py
@@ -10,42 +10,47 @@
import json
import logging
import os
+import subprocess
import unittest
import mock
-from snaps.openstack.os_credentials import OSCreds
+import munch
from xtesting.core import testcase
from functest.opnfv_tests.openstack.rally import rally
+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('functest.opnfv_tests.openstack.snaps.snaps_utils.'
- 'get_credentials',
- return_value=os_creds) as mock_get_creds:
+ 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.assertTrue(mock_get_creds.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):
os.environ['OS_AUTH_URL'] = ''
- self.rally_base.ext_net_name = ''
- task_args = self.rally_base._build_task_args('test_file_name')
+ 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):
os.environ['OS_AUTH_URL'] = ''
- self.rally_base.priv_net_id = ''
- task_args = self.rally_base._build_task_args('test_file_name')
+ 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
@@ -59,64 +64,79 @@ 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 test_get_cmd_output(self):
- proc = mock.Mock()
- proc.stdout.__iter__ = mock.Mock(return_value=iter(['line1', 'line2']))
- self.assertEqual(self.rally_base.get_cmd_output(proc),
- 'line1line2')
-
- @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):
os.environ['INSTALLER_TYPE'] = 'test_installer'
@@ -124,53 +144,48 @@ class OSRallyTesting(unittest.TestCase):
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):
- os.environ['INSTALLER_TYPE'] = 'test_installer'
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):
- os.environ['INSTALLER_TYPE'] = 'test_installer'
+ @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()
@@ -193,62 +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.'
- '_append_summary')
+ '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):
# pylint: disable=unused-argument
- self.rally_base._run_task('test_name')
- text = 'Failed to retrieve task_id, validating task...'
+ 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.'
- '_append_summary')
+ '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)
@@ -256,173 +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):
+ @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')
- 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, *args):
- self.rally_base.TESTS = ['test1', 'test2']
- self.rally_base.test_name = 'test1'
- with self.assertRaises(Exception):
- self.rally_base._prepare_env()
- for func in args:
- func.assert_called()
+ self.rally_base.run_task('test_name')
+ mock_save_res.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,
- *args):
- self.rally_base.TESTS = ['test1', 'test2']
- self.rally_base.test_name = 'test1'
- with self.assertRaises(Exception):
- self.rally_base._prepare_env()
- for func in args:
- func.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,
- *args):
- self.rally_base.TESTS = ['test1', 'test2']
- self.rally_base.test_name = 'test1'
+ @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()
- for func in args:
- func.assert_called()
- self.assertEqual(mock_create_flavor.call_count, 2)
+ 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):
- self.rally_base.TESTS = ['test1', 'test2']
- self.rally_base.test_name = 'all'
- self.rally_base._run_tests()
+ '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)
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.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', return_value=mock.Mock())
@mock.patch('functest.opnfv_tests.openstack.rally.rally.RallyBase.'
- '_prepare_env', side_effect=Exception)
- def test_run_exception_prepare_env(self, mock_prep_env, *args):
+ '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):
- text = '[{"result":[{"error":[]},{"error":["err"]}],' \
- '"full_duration": 17.312026}]'
- self.rally_base._append_summary(text, "foo_test")
+ 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'],
- 17.312026)
+ 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/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 8bbf70f4a..000000000
--- a/functest/tests/unit/openstack/snaps/test_snaps.py
+++ /dev/null
@@ -1,288 +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
-
-# pylint: disable=missing-docstring
-
-import logging
-import unittest
-
-import mock
-from snaps.openstack.os_credentials import OSCreds
-from xtesting.core 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')
- @mock.patch('unittest.TextTestRunner.run',
- return_value=mock.MagicMock(name='unittest.TextTestResult'))
- def test_run_success(self, *args):
- args[0].return_value.testsRun = 100
- args[0].return_value.failures = []
- args[0].return_value.errors = []
- self.assertEquals(testcase.TestCase.EX_OK, self.connection_check.run())
- self.assertEquals(
- testcase.TestCase.EX_OK, self.connection_check.is_successful())
- args[0].assert_called_with(mock.ANY)
- args[1].assert_called_with(
- ext_net_name='foo', os_creds=self.os_creds, suite=mock.ANY,
- use_keystone=True)
-
- @mock.patch('functest.opnfv_tests.openstack.snaps.snaps_suite_builder.'
- 'add_openstack_client_tests')
- @mock.patch('unittest.TextTestRunner.run',
- return_value=mock.MagicMock(name='unittest.TextTestResult'))
- def test_run_1_of_100_ko(self, *args):
- args[0].return_value.testsRun = 100
- args[0].return_value.failures = ['foo']
- args[0].return_value.errors = []
- self.assertEquals(testcase.TestCase.EX_OK, self.connection_check.run())
- self.assertEquals(
- testcase.TestCase.EX_TESTCASE_FAILED,
- self.connection_check.is_successful())
- args[0].assert_called_with(mock.ANY)
- args[1].assert_called_with(
- ext_net_name='foo', os_creds=self.os_creds, suite=mock.ANY,
- use_keystone=True)
-
- @mock.patch('functest.opnfv_tests.openstack.snaps.snaps_suite_builder.'
- 'add_openstack_client_tests')
- @mock.patch('unittest.TextTestRunner.run',
- return_value=mock.MagicMock(name='unittest.TextTestResult'))
- def test_run_1_of_100_ko_criteria(self, *args):
- self.connection_check.criteria = 90
- args[0].return_value.testsRun = 100
- args[0].return_value.failures = ['foo']
- args[0].return_value.errors = []
- self.assertEquals(testcase.TestCase.EX_OK, self.connection_check.run())
- self.assertEquals(
- testcase.TestCase.EX_OK, self.connection_check.is_successful())
- args[0].assert_called_with(mock.ANY)
- args[1].assert_called_with(
- ext_net_name='foo', os_creds=self.os_creds, suite=mock.ANY,
- use_keystone=True)
-
-
-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')
- @mock.patch('unittest.TextTestRunner.run',
- return_value=mock.MagicMock(name='unittest.TextTestResult'))
- def test_run_success(self, *args):
- args[0].return_value.testsRun = 100
- args[0].return_value.failures = []
- args[0].return_value.errors = []
- self.assertEquals(testcase.TestCase.EX_OK, self.api_check.run())
- self.assertEquals(
- testcase.TestCase.EX_OK, self.api_check.is_successful())
- args[0].assert_called_with(mock.ANY)
- args[1].assert_called_with(
- ext_net_name='foo', image_metadata=mock.ANY,
- os_creds=self.os_creds, suite=mock.ANY, use_keystone=True)
-
- @mock.patch('functest.opnfv_tests.openstack.snaps.snaps_suite_builder.'
- 'add_openstack_api_tests')
- @mock.patch('unittest.TextTestRunner.run',
- return_value=mock.MagicMock(name='unittest.TextTestResult'))
- def test_run_1_of_100_ko(self, *args):
- args[0].return_value.testsRun = 100
- args[0].return_value.failures = ['foo']
- args[0].return_value.errors = []
- self.assertEquals(testcase.TestCase.EX_OK, self.api_check.run())
- self.assertEquals(
- testcase.TestCase.EX_TESTCASE_FAILED,
- self.api_check.is_successful())
- args[0].assert_called_with(mock.ANY)
- args[1].assert_called_with(
- ext_net_name='foo', image_metadata=mock.ANY,
- os_creds=self.os_creds, suite=mock.ANY, use_keystone=True)
-
- @mock.patch('functest.opnfv_tests.openstack.snaps.snaps_suite_builder.'
- 'add_openstack_api_tests')
- @mock.patch('unittest.TextTestRunner.run',
- return_value=mock.MagicMock(name='unittest.TextTestResult'))
- def test_run_1_of_100_ko_criteria(self, *args):
- self.api_check.criteria = 90
- args[0].return_value.testsRun = 100
- args[0].return_value.failures = ['foo']
- args[0].return_value.errors = []
- self.assertEquals(testcase.TestCase.EX_OK, self.api_check.run())
- self.assertEquals(
- testcase.TestCase.EX_OK, self.api_check.is_successful())
- args[0].assert_called_with(mock.ANY)
- args[1].assert_called_with(
- ext_net_name='foo', image_metadata=mock.ANY,
- os_creds=self.os_creds, suite=mock.ANY, use_keystone=True)
-
-
-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('snaps.openstack.tests.os_source_file_test.'
- 'OSIntegrationTestCase.parameterize')
- @mock.patch('unittest.TextTestRunner.run',
- return_value=mock.MagicMock(name='unittest.TextTestResult'))
- def test_run_success(self, *args):
- args[0].return_value.testsRun = 100
- args[0].return_value.failures = []
- args[0].return_value.errors = []
- self.assertEquals(testcase.TestCase.EX_OK, self.health_check.run())
- self.assertEquals(
- testcase.TestCase.EX_OK, self.health_check.is_successful())
- args[0].assert_called_with(mock.ANY)
- args[1].assert_called_with(
- mock.ANY, ext_net_name='foo', flavor_metadata=None,
- image_metadata=mock.ANY, netconf_override=None,
- os_creds=self.os_creds, use_keystone=True)
-
- @mock.patch('snaps.openstack.tests.os_source_file_test.'
- 'OSIntegrationTestCase.parameterize')
- @mock.patch('unittest.TextTestRunner.run',
- return_value=mock.MagicMock(name='unittest.TextTestResult'))
- def test_run_1_of_100_ko(self, *args):
- args[0].return_value.testsRun = 100
- args[0].return_value.failures = ['foo']
- args[0].return_value.errors = []
- self.assertEquals(testcase.TestCase.EX_OK, self.health_check.run())
- self.assertEquals(
- testcase.TestCase.EX_TESTCASE_FAILED,
- self.health_check.is_successful())
- args[0].assert_called_with(mock.ANY)
- args[1].assert_called_with(
- mock.ANY, ext_net_name='foo', flavor_metadata=None,
- image_metadata=mock.ANY, netconf_override=None,
- os_creds=self.os_creds, use_keystone=True)
-
- @mock.patch('snaps.openstack.tests.os_source_file_test.'
- 'OSIntegrationTestCase.parameterize')
- @mock.patch('unittest.TextTestRunner.run',
- return_value=mock.MagicMock(name='unittest.TextTestResult'))
- def test_run_1_of_100_ko_criteria(self, *args):
- self.health_check.criteria = 90
- args[0].return_value.testsRun = 100
- args[0].return_value.failures = ['foo']
- args[0].return_value.errors = []
- self.assertEquals(testcase.TestCase.EX_OK, self.health_check.run())
- self.assertEquals(
- testcase.TestCase.EX_OK, self.health_check.is_successful())
- args[0].assert_called_with(mock.ANY)
- args[1].assert_called_with(
- mock.ANY, ext_net_name='foo', flavor_metadata=None,
- image_metadata=mock.ANY, netconf_override=None,
- os_creds=self.os_creds, use_keystone=True)
-
-
-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('unittest.TextTestRunner.run',
- return_value=mock.MagicMock(name='unittest.TextTestResult'))
- def test_run_success(self, *args):
- args[0].return_value.testsRun = 100
- args[0].return_value.failures = []
- args[0].return_value.errors = []
- self.assertEquals(testcase.TestCase.EX_OK, self.smoke.run())
- self.assertEquals(testcase.TestCase.EX_OK, self.smoke.is_successful())
- args[0].assert_called_with(mock.ANY)
- args[1].assert_called_with(
- ext_net_name='foo', flavor_metadata=None, image_metadata=mock.ANY,
- netconf_override=None, os_creds=self.os_creds,
- suite=mock.ANY, use_floating_ips=True, use_keystone=True)
-
- @mock.patch('functest.opnfv_tests.openstack.snaps.snaps_suite_builder.'
- 'add_openstack_integration_tests')
- @mock.patch('unittest.TextTestRunner.run',
- return_value=mock.MagicMock(name='unittest.TextTestResult'))
- def test_run_1_of_100_ko(self, *args):
- args[0].return_value.testsRun = 100
- args[0].return_value.failures = ['foo']
- args[0].return_value.errors = []
- self.assertEquals(testcase.TestCase.EX_OK, self.smoke.run())
- self.assertEquals(
- testcase.TestCase.EX_TESTCASE_FAILED, self.smoke.is_successful())
- args[0].assert_called_with(mock.ANY)
- args[1].assert_called_with(
- ext_net_name='foo', flavor_metadata=None, image_metadata=mock.ANY,
- netconf_override=mock.ANY, os_creds=self.os_creds,
- suite=mock.ANY, use_floating_ips=True, use_keystone=True)
-
- @mock.patch('functest.opnfv_tests.openstack.snaps.snaps_suite_builder.'
- 'add_openstack_integration_tests')
- @mock.patch('unittest.TextTestRunner.run',
- return_value=mock.MagicMock(name='unittest.TextTestResult'))
- def test_run_1_of_100_ko_criteria(self, *args):
- self.smoke.criteria = 90
- args[0].return_value.testsRun = 100
- args[0].return_value.failures = ['foo']
- args[0].return_value.errors = []
- self.assertEquals(testcase.TestCase.EX_OK, self.smoke.run())
- self.assertEquals(
- testcase.TestCase.EX_OK, self.smoke.is_successful())
- args[0].assert_called_with(mock.ANY)
- args[1].assert_called_with(
- ext_net_name='foo', flavor_metadata=None, image_metadata=mock.ANY,
- netconf_override=None, os_creds=self.os_creds,
- suite=mock.ANY, use_floating_ips=True, use_keystone=True)
-
-
-if __name__ == "__main__":
- logging.disable(logging.CRITICAL)
- unittest.main(verbosity=2)
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 8988e96a1..000000000
--- a/functest/tests/unit/openstack/tempest/test_conf_utils.py
+++ /dev/null
@@ -1,258 +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 os
-import unittest
-
-import mock
-
-from functest.opnfv_tests.openstack.tempest import conf_utils
-from functest.opnfv_tests.openstack.tempest import tempest
-from functest.utils import config
-from snaps.openstack.os_credentials import OSCreds
-
-
-class OSTempestConfUtilsTesting(unittest.TestCase):
- # pylint: disable=too-many-public-methods
- 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_res_missing_net_dic(self, *mock_args):
- # pylint: disable=unused-argument
- tempest_resources = tempest.TempestResourcesManager(
- os_creds=self.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_res_missing_image(self, *mock_args):
- # pylint: disable=unused-argument
- tempest_resources = tempest.TempestResourcesManager(
- os_creds=self.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.utils.keystone_utils.keystone_client')
- @mock.patch('snaps.openstack.utils.keystone_utils.get_project')
- @mock.patch('snaps.openstack.create_flavor.OpenStackFlavor.create',
- return_value=None)
- def test_create_res_missing_flavor(self, *mock_args):
- # pylint: disable=unused-argument
- tempest_resources = tempest.TempestResourcesManager(
- os_creds=self.os_creds)
- with self.assertRaises(Exception) as context:
- tempest_resources.create()
- msg = 'Failed to create flavor'
- self.assertTrue(msg in context.exception, msg=str(context.exception))
-
- @mock.patch('subprocess.check_output')
- def test_create_rally_deployment(self, mock_exec):
- self.assertEqual(conf_utils.create_rally_deployment(), None)
- calls = [
- mock.call(['rally', 'deployment', 'destroy', '--deployment',
- str(getattr(config.CONF, 'rally_deployment_name'))]),
- mock.call(['rally', 'deployment', 'create', '--fromenv', '--name',
- str(getattr(config.CONF, 'rally_deployment_name'))]),
- mock.call(['rally', 'deployment', 'check'])]
- mock_exec.assert_has_calls(calls)
-
- @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)
-
- setattr(config.CONF, 'tempest_verifier_name', 'test_verifier_name')
- with mock.patch('subprocess.Popen', side_effect=Exception), \
- self.assertRaises(Exception):
- conf_utils.create_verifier()
- mock_logger_debug.assert_any_call("Tempest test_verifier_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_verif_id_missing_verif(self, mock_rally, mock_tempest):
- # pylint: disable=unused-argument
- setattr(config.CONF, '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):
- # pylint: disable=unused-argument
- setattr(config.CONF, '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_depl_id_missing_rally(self):
- setattr(config.CONF, '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_depl_id_default(self):
- setattr(config.CONF, '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_verif_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 mock_get_id:
- self.assertEqual(conf_utils.get_verifier_repo_dir(''),
- 'test_verifier_repo_dir')
- self.assertTrue(mock_get_id.called)
-
- def test_get_depl_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 mock_get_vid, \
- mock.patch('functest.opnfv_tests.openstack.tempest.'
- 'conf_utils.get_verifier_deployment_id') \
- as mock_get_did:
- self.assertEqual(conf_utils.get_verifier_deployment_dir('', ''),
- 'test_verifier_repo_dir')
- self.assertTrue(mock_get_vid.called)
- self.assertTrue(mock_get_did.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.utils.functest_utils.yaml.safe_load',
- return_value={'validation': {'ssh_timeout': 300}}):
- os.environ['OS_ENDPOINT_TYPE'] = ''
- 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_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):
- 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_upd_missing_flavor_id(self):
- setattr(config.CONF, 'tempest_use_custom_flavors', 'True')
- self._test_missing_param(('compute', 'flavor_ref', 'test_flavor_id'),
- None, 'test_flavor_id')
-
- def test_upd_missing_flavor_id_alt(self):
- setattr(config.CONF, '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_verif_missing_conf_file(self):
- with mock.patch('functest.opnfv_tests.openstack.tempest.'
- 'conf_utils.os.path.isfile',
- return_value=False), \
- mock.patch('subprocess.check_output') as mexe, \
- self.assertRaises(Exception) as context:
- conf_utils.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.'
- 'conf_utils.os.path.isfile',
- return_value=True), \
- mock.patch('subprocess.check_output') as mexe:
- self.assertEqual(conf_utils.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'))])
-
-
-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 fc8c9cc85..efc4393c8 100644
--- a/functest/tests/unit/openstack/tempest/test_tempest.py
+++ b/functest/tests/unit/openstack/tempest/test_tempest.py
@@ -12,43 +12,38 @@ import os
import unittest
import mock
-from snaps.openstack.os_credentials import OSCreds
from xtesting.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 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('functest.opnfv_tests.openstack.snaps.snaps_utils.'
- '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()
- self.tempestneutrontrunk = tempest.TempestNeutronTrunk()
@mock.patch('functest.opnfv_tests.openstack.tempest.tempest.LOGGER.error')
@mock.patch('functest.opnfv_tests.openstack.tempest.tempest.LOGGER.debug')
@@ -62,9 +57,11 @@ class OSTempestTesting(unittest.TestCase):
msg = "Tempest test list file %s NOT found."
self.tempestcommon.generate_test_list()
self.assertTrue(
- (msg % conf_utils.TEMPEST_CUSTOM) in context.exception)
+ (msg % self.tempestcommon.tempest_custom) in context.exception)
- def test_gen_tl_cm_default(self):
+ @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 mock_copyfile, \
@@ -72,21 +69,25 @@ class OSTempestTesting(unittest.TestCase):
'os.path.isfile', return_value=True):
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, mock_exec=None):
- self.tempestcommon.mode = mode
- if self.tempestcommon.mode == 'smoke':
- testr_mode = r"'^tempest\.(api|scenario).*\[.*\bsmoke\b.*\]$'"
- elif self.tempestcommon.mode == 'full':
- testr_mode = r"'^tempest\.'"
+ 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 = self.tempestcommon.mode
verifier_repo_dir = 'test_verifier_repo_dir'
- cmd = "(cd {0}; stestr list {1} >{2} 2>/dev/null)".format(
- verifier_repo_dir, testr_mode, self.tempestcommon.list)
- self.tempestcommon.generate_test_list()
- mock_exec.assert_called_once_with(cmd, shell=True)
+ 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')
@@ -94,9 +95,6 @@ class OSTempestTesting(unittest.TestCase):
def test_gen_tl_full_mode(self):
self._test_gen_tl_mode_default('full')
- def test_gen_tl_neutron_trunk_mode(self):
- self._test_gen_tl_mode_default('neutron_trunk')
-
def test_verif_res_missing_verif_id(self):
self.tempestcommon.verification_id = None
with self.assertRaises(Exception):
@@ -121,13 +119,14 @@ class OSTempestTesting(unittest.TestCase):
@mock.patch("os.remove")
@mock.patch("os.path.exists", return_value=True)
def test_apply_missing_blacklist(self, *args):
- with mock.patch('__builtin__.open', mock.mock_open()) as mock_open, \
+ 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
- os.environ['INSTALLER_TYPE'] = 'installer_type'
+ self.tempestcommon.tempest_blacklist = Exception
os.environ['DEPLOY_SCENARIO'] = 'deploy_scenario'
- self.tempestcommon.apply_tempest_blacklist()
+ 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')
@@ -141,16 +140,16 @@ class OSTempestTesting(unittest.TestCase):
@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 mock_open, \
+ 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):
- os.environ['INSTALLER_TYPE'] = 'installer_type'
os.environ['DEPLOY_SCENARIO'] = 'deploy_scenario'
- self.tempestcommon.apply_tempest_blacklist()
+ 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'))
@@ -159,31 +158,17 @@ class OSTempestTesting(unittest.TestCase):
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=[r'\} tempest\.']), \
- mock.patch('functest.opnfv_tests.openstack.tempest.tempest.'
- 'subprocess.Popen'):
- conf_utils.TEMPEST_LIST = 'test_tempest_list'
- cmd = ["rally", "verify", "start", "--load-list",
- conf_utils.TEMPEST_LIST]
- with self.assertRaises(Exception):
- self.tempestcommon.run_verifier_tests()
- mock_logger_info. \
- assert_any_call("Starting Tempest test suite: '%s'.", cmd)
-
@mock.patch('functest.opnfv_tests.openstack.tempest.tempest.'
'subprocess.Popen')
- def test_generate_report(self, mock_popen):
- self.tempestcommon.verification_id = "1234"
- html_file = os.path.join(tempest.TempestCommon.TEMPEST_RESULTS_DIR,
- "tempest-report.html")
- cmd = ["rally", "verify", "report", "--type", "html", "--uuid",
- "1234", "--to", html_file]
- self.tempestcommon.generate_report()
- mock_popen.assert_called_once_with(cmd, stdout=mock.ANY,
- stderr=mock.ANY)
+ @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()
+ 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)
@@ -197,8 +182,6 @@ class OSTempestTesting(unittest.TestCase):
@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_create_resources_ko(self, *args):
# pylint: disable=unused-argument
self.assertEqual(self.tempestcommon.run(),
@@ -208,22 +191,6 @@ 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_comp_cnt_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', 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.'
'TempestCommon.configure', side_effect=Exception)
def test_run_configure_tempest_ko(self, *args):
# pylint: disable=unused-argument
@@ -234,10 +201,6 @@ 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.'
'TempestCommon.configure')
def _test_run(self, status, *args):
# pylint: disable=unused-argument
@@ -250,9 +213,9 @@ class OSTempestTesting(unittest.TestCase):
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):
@@ -274,15 +237,155 @@ class OSTempestTesting(unittest.TestCase):
side_effect=Exception):
self._test_run(testcase.TestCase.EX_RUN_ERROR)
- def test_run(self):
- with mock.patch.object(self.tempestcommon, 'generate_test_list'), \
+ @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, '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, 'generate_report'):
+ '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/ci/__init__.py b/functest/tests/unit/openstack/vmtp/__init__.py
index e69de29bb..e69de29bb 100644
--- a/functest/ci/__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/tests/unit/openstack/vping/test_vping.py b/functest/tests/unit/openstack/vping/test_vping.py
deleted file mode 100644
index 3aaa4594a..000000000
--- a/functest/tests/unit/openstack/vping/test_vping.py
+++ /dev/null
@@ -1,175 +0,0 @@
-#!/usr/bin/env python
-
-# 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
-
-# pylint: disable=missing-docstring
-
-import logging
-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 xtesting.core import testcase
-
-from functest.opnfv_tests.openstack.vping import vping_userdata, vping_ssh
-from functest.utils import env
-
-
-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('os.path.exists', return_value=True)
- @mock.patch('snaps.openstack.utils.keystone_utils.keystone_client')
- @mock.patch('snaps.openstack.utils.keystone_utils.get_project')
- @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('functest.opnfv_tests.openstack.snaps.snaps_utils.'
- 'get_ext_net_name', return_value='foo')
- def test_vping_userdata(self, *args):
- # pylint: disable=unused-argument
- 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_router',
- return_value=OpenStackRouter(
- self.os_creds, RouterConfig(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.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('os.path.exists', return_value=True)
- @mock.patch('snaps.openstack.utils.keystone_utils.keystone_client')
- @mock.patch('snaps.openstack.utils.keystone_utils.get_project')
- @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.TestCase.EX_OK)
- @mock.patch('functest.opnfv_tests.openstack.snaps.snaps_utils.'
- 'get_ext_net_name', return_value='foo')
- def test_vping_ssh(self, *args):
- # pylint: disable=unused-argument
- 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
-
- subnet_config = SubnetConfig(
- name='bar',
- cidr='10.0.0.1/24',
- dns_nameservers=[env.get('NAMESERVER')])
-
- 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=[subnet_config]))), \
- 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.TestCase.EX_OK, self.vping_ssh.run())
-
-
-if __name__ == "__main__":
- logging.disable(logging.CRITICAL)
- unittest.main(verbosity=2)
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/utils/test_functest_utils.py b/functest/tests/unit/utils/test_functest_utils.py
index d35ed8ced..4b642ff9d 100644
--- a/functest/tests/unit/utils/test_functest_utils.py
+++ b/functest/tests/unit/utils/test_functest_utils.py
@@ -15,12 +15,13 @@ import unittest
import mock
import pkg_resources
+import six
from functest.utils import functest_utils
class FunctestUtilsTesting(unittest.TestCase):
- # pylint: disable=too-many-instance-attributes
+ # 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']
@@ -81,7 +82,7 @@ class FunctestUtilsTesting(unittest.TestCase):
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
@@ -97,27 +98,20 @@ class FunctestUtilsTesting(unittest.TestCase):
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')
@@ -126,50 +120,35 @@ class FunctestUtilsTesting(unittest.TestCase):
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_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')
@@ -177,22 +156,16 @@ class FunctestUtilsTesting(unittest.TestCase):
# 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 test_get_param_from_yaml_failed(self):
@@ -204,9 +177,9 @@ 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_param_from_yaml_def(self):
with mock.patch('six.moves.builtins.open', mock.mock_open()), \
@@ -218,6 +191,218 @@ class FunctestUtilsTesting(unittest.TestCase):
self.test_file),
'test_image_name')
+ 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__":
logging.disable(logging.CRITICAL)
diff --git a/functest/tests/unit/vnf/epc/test_juju_epc.py b/functest/tests/unit/vnf/epc/test_juju_epc.py
index 6b4137069..a72c61586 100644
--- a/functest/tests/unit/vnf/epc/test_juju_epc.py
+++ b/functest/tests/unit/vnf/epc/test_juju_epc.py
@@ -62,7 +62,6 @@ class JujuEpcTesting(unittest.TestCase):
'test_vnf': {}}
@unittest.skip("It must be fixed. Please see JIRA FUNCTEST-915")
- @mock.patch('snaps.openstack.create_image.OpenStackImage.create')
@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 97654748a..f590a2857 100644
--- a/functest/tests/unit/vnf/ims/test_ims_base.py
+++ b/functest/tests/unit/vnf/ims/test_clearwater.py
@@ -12,15 +12,16 @@ 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,
@@ -37,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 79069a5de..c84adf0ff 100644
--- a/functest/tests/unit/vnf/ims/test_cloudify_ims.py
+++ b/functest/tests/unit/vnf/ims/test_cloudify_ims.py
@@ -10,56 +10,9 @@
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/router/test_cloudify_vrouter.py b/functest/tests/unit/vnf/router/test_cloudify_vrouter.py
index db03d716c..b3f83e946 100644
--- a/functest/tests/unit/vnf/router/test_cloudify_vrouter.py
+++ b/functest/tests/unit/vnf/router/test_cloudify_vrouter.py
@@ -12,61 +12,10 @@
import logging
import unittest
-import mock
-
-from functest.core import vnf
-from functest.opnfv_tests.vnf.router import cloudify_vrouter
-
class CloudifyVrouterTesting(unittest.TestCase):
- def setUp(self):
-
- 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}}}}
-
- # pylint: disable=bad-continuation
- with 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'), \
- mock.patch(
- 'functest.utils.functest_utils.get_parameter_from_yaml',
- 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 1851b201a..330093658 100644
--- a/functest/tests/unit/vnf/router/test_vrouter_base.py
+++ b/functest/tests/unit/vnf/router/test_vrouter_base.py
@@ -12,17 +12,9 @@
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 61d8401c5..40414b88b 100644
--- a/functest/utils/config.py
+++ b/functest/utils/config.py
@@ -10,15 +10,16 @@ import six
from functest.utils import env
-class Config(object):
+class Config():
def __init__(self):
try:
- # pylint: disable=bad-continuation
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):
@@ -34,7 +35,7 @@ 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:
@@ -53,13 +54,14 @@ class Config(object):
@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()
diff --git a/functest/utils/env.py b/functest/utils/env.py
index b0b8501f1..2e312726c 100644
--- a/functest/utils/env.py
+++ b/functest/utils/env.py
@@ -17,18 +17,31 @@ 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'],
- 'ENERGY_RECORDER_API_URL': env.INPUTS['ENERGY_RECORDER_API_URL'],
- 'ENERGY_RECORDER_API_USER': env.INPUTS['ENERGY_RECORDER_API_USER'],
- 'ENERGY_RECORDER_API_PASSWORD': env.INPUTS['ENERGY_RECORDER_API_PASSWORD'],
'VOLUME_DEVICE_NAME': 'vdb',
- 'NAMESERVER': '8.8.8.8'
+ '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'
}
diff --git a/functest/utils/functest_utils.py b/functest/utils/functest_utils.py
index b614af321..eec544489 100644
--- a/functest/utils/functest_utils.py
+++ b/functest/utils/functest_utils.py
@@ -11,10 +11,14 @@
from __future__ import print_function
import logging
+import os
import subprocess
import sys
import yaml
+from shade import _utils
+import six
+
LOGGER = logging.getLogger(__name__)
@@ -28,28 +32,26 @@ 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)
else:
LOGGER.debug(msg_exec)
- popen = subprocess.Popen(
- cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
- if output_file:
- ofd = open(output_file, "w")
- for line in iter(popen.stdout.readline, b''):
+ with subprocess.Popen(
+ cmd, shell=True, stdout=subprocess.PIPE,
+ stderr=subprocess.STDOUT) as popen:
if output_file:
- ofd.write(line)
- else:
- line = line.replace('\n', '')
- print (line)
- sys.stdout.flush()
- if output_file:
- ofd.close()
- popen.stdout.close()
- returncode = popen.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)
@@ -63,12 +65,161 @@ def get_parameter_from_yaml(parameter, yfile):
parameter must be given in string format with dots
Example: general.openstack.image_name
"""
- with open(yfile) as yfd:
+ 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, yfile))
+ raise ValueError(f"The parameter {parameter} is not defined in"
+ f" {yfile}")
return value
+
+
+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 list_services(cloud):
+ # pylint: disable=protected-access
+ """Search Keystone services via $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.
+
+ :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 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/requirements.txt b/requirements.txt
index fa0a17b90..385f8d8e6 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,30 +1,22 @@
# The order of packages is significant, because pip processes them in the order
# of appearance. Changing the order has an impact on the overall integration
# process, which may cause wedges in the gate later.
-pbr!=2.1.0,>=2.0.0 # Apache-2.0
-PyYAML>=3.12 # MIT
-GitPython>=1.0.1 # BSD License (3 clause)
-requests>=2.14.2 # Apache-2.0
+pbr!=2.1.0 # Apache-2.0
+PyYAML # MIT
+requests!=2.20.0,!=2.24.0 # Apache-2.0
robotframework>=3.0
scp
-dnspython>=1.14.0;python_version=='2.7' # http://www.dnspython.org/LICENSE
-dnspython3!=1.13.0,!=1.14.0,>=1.12.0;python_version>='3.0' # http://www.dnspython.org/LICENSE
-click
-openbaton-cli
cloudify-rest-client
-Flask!=0.11,<1.0,>=0.10 # BSD
-Flask-RESTful>=0.3.5 # BSD
-IPy
-flasgger # MIT
-mock>=2.0.0 # BSD
-PrettyTable<0.8,>=0.7.1 # BSD
-six>=1.10.0 # MIT
-snaps
-SQLAlchemy!=1.1.5,!=1.1.6,!=1.1.7,!=1.1.8,>=1.0.10 # MIT
-paramiko>=2.0.0 # LGPLv2.1+
-Jinja2>=2.10 # BSD License (3 clause)
-httplib2>=0.9.1 # MIT
-oslo.serialization!=2.19.1,>=2.18.0 # Apache-2.0
-oslo.utils>=3.33.0 # Apache-2.0
+mock!=4.0.0,!=4.0.1 # BSD
+PrettyTable!=3.4.0 # BSD
+six # MIT
+paramiko!=2.9.0,!=2.9.1 # LGPLv2.1+
+Jinja2 # BSD License (3 clause)
xtesting
-refstack-client
+os-client-config # Apache-2.0
+shade # Apache-2.0
+ruamel.yaml.jinja2 # MIT
+tempest # Apache-2.0
+rally
+rally-openstack
+munch # MIT
diff --git a/setup.cfg b/setup.cfg
index 96a8d9221..3b466985a 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -1,19 +1,45 @@
[metadata]
name = functest
-version = 7
+version = 10
home-page = https://wiki.opnfv.org/display/functest
[files]
packages = functest
scripts =
+ functest/ci/add_proxy.sh
+ functest/ci/convert_images.sh
functest/ci/download_images.sh
[entry_points]
console_scripts =
- functest = functest.cli.cli_base:cli
functest_odl = functest.opnfv_tests.sdn.odl.odl:main
- check_deployment = functest.ci.check_deployment:main
- functest_restapi = functest.api.server:main
+xtesting.testcase =
+ connection_check = functest.opnfv_tests.openstack.api.connection_check:ConnectionCheck
+ tenantnetwork1 = functest.core.tenantnetwork:TenantNetwork1
+ tenantnetwork2 = functest.core.tenantnetwork:TenantNetwork2
+ vmready1 = functest.core.singlevm:VmReady1
+ vmready2 = functest.core.singlevm:VmReady2
+ singlevm1 = functest.core.singlevm:SingleVm1
+ singlevm2 = functest.core.singlevm:SingleVm2
+ vping_ssh = functest.opnfv_tests.openstack.vping.vping_ssh:VPingSSH
+ vping_userdata = functest.opnfv_tests.openstack.vping.vping_userdata:VPingUserdata
+ cinder_test = functest.opnfv_tests.openstack.cinder.cinder_test:CinderCheck
+ odl = functest.opnfv_tests.sdn.odl.odl:ODLTests
+ tempest_common = functest.opnfv_tests.openstack.tempest.tempest:TempestCommon
+ tempest_heat = functest.opnfv_tests.openstack.tempest.tempest:TempestHeat
+ rally_sanity = functest.opnfv_tests.openstack.rally.rally:RallySanity
+ refstack = functest.opnfv_tests.openstack.refstack.refstack:Refstack
+ patrole = functest.opnfv_tests.openstack.patrole.patrole:Patrole
+ barbican = functest.opnfv_tests.openstack.barbican.barbican:Barbican
+ vmtp = functest.opnfv_tests.openstack.vmtp.vmtp:Vmtp
+ shaker = functest.opnfv_tests.openstack.shaker.shaker:Shaker
+ rally_full = functest.opnfv_tests.openstack.rally.rally:RallyFull
+ cloudify = functest.core.cloudify:Cloudify
+ cloudify_ims = functest.opnfv_tests.vnf.ims.cloudify_ims:CloudifyIms
+ heat_ims = functest.opnfv_tests.vnf.ims.heat_ims:HeatIms
+ vyos_vrouter = functest.opnfv_tests.vnf.router.cloudify_vrouter:CloudifyVrouter
+ juju_epc = functest.opnfv_tests.vnf.epc.juju_epc:JujuEpc
+ rally_jobs = functest.opnfv_tests.openstack.rally.rally:RallyJobs
[build_sphinx]
all_files = 1
diff --git a/setup.py b/setup.py
index 566d84432..f63cc23c5 100644
--- a/setup.py
+++ b/setup.py
@@ -16,14 +16,6 @@
# THIS FILE IS MANAGED BY THE GLOBAL REQUIREMENTS REPO - DO NOT EDIT
import setuptools
-# In python < 2.7.4, a lazy loading of package `pbr` will break
-# setuptools if some other modules registered functions in `atexit`.
-# solution from: http://bugs.python.org/issue15881#msg170215
-try:
- import multiprocessing # noqa
-except ImportError:
- pass
-
setuptools.setup(
setup_requires=['pbr>=2.0.0'],
pbr=True)
diff --git a/test-requirements.txt b/test-requirements.txt
index 84c5a4435..03f57b9cc 100644
--- a/test-requirements.txt
+++ b/test-requirements.txt
@@ -1,13 +1,18 @@
# The order of packages is significant, because pip processes them in the order
# of appearance. Changing the order has an impact on the overall integration
# process, which may cause wedges in the gate later.
-coverage!=4.4,>=4.0 # Apache-2.0
-mock>=2.0.0 # BSD
-nose>=1.3.7 # LGPL
-flake8<2.6.0,>=2.5.4 # MIT
-pylint==1.4.5 # GPLv2
-sphinx!=1.6.6,!=1.6.7,>=1.6.2 # BSD
-sphinx-opnfv-theme
+coverage!=4.4 # Apache-2.0
+mock!=4.0.0,!=4.0.1 # BSD
+pytest # MIT
+pytest-html #MPL-2.0
+pytest-cov # MIT
+flake8 # MIT
+pylint # GPLv2
+sphinx!=1.6.6,!=1.6.7,!=2.1.0,!=3.0.0,!=3.4.2 # BSD
sphinx-rtd-theme
yamllint
-doc8>=0.6.0 # Apache-2.0
+doc8 # Apache-2.0
+bashate # Apache-2.0
+bandit
+sphinxcontrib-spelling
+pre-commit
diff --git a/tox.ini b/tox.ini
index 9fb5a416c..1bebeb93a 100644
--- a/tox.ini
+++ b/tox.ini
@@ -1,126 +1,98 @@
[tox]
-envlist = docs,pep8,pylint,yamllint,py35,py27,perm,cover
+envlist = docs,pep8,pylint,yamllint,bashate,bandit,py310,cover,perm,pre-commit
[testenv]
usedevelop = True
deps =
-c{toxinidir}/upper-constraints.txt
- -chttps://git.openstack.org/cgit/openstack/requirements/plain/upper-constraints.txt?h=stable/queens
+ -c{env:UPPER_CONSTRAINTS_FILE:https://opendev.org/openstack/requirements/raw/branch/master/upper-constraints.txt}
-r{toxinidir}/requirements.txt
-r{toxinidir}/test-requirements.txt
-install_command = pip install {opts} {packages}
-commands = nosetests --with-xunit \
- --with-coverage \
- --cover-tests \
- --cover-package=functest \
- --cover-xml \
- --cover-html \
- functest/tests/unit
+install_command = pip install --use-deprecated=legacy-resolver {opts} {packages}
+commands =
+ pytest \
+ --junit-xml=junit.xml \
+ --html=report.html --self-contained-html \
+ --cov=xtesting --cov-reset --cov-report html \
+ functest/tests/unit
[testenv:docs]
-basepython = python2.7
+basepython = python3.10
commands =
doc8 \
--ignore-path api/build \
- --ignore-path docs/release/release-notes/build \
- --ignore-path docs/testing/developer/devguide/build \
- --ignore-path docs/testing/developer/internship/security_group/build \
- --ignore-path docs/testing/developer/internship/testapi_evolution/build \
- --ignore-path docs/testing/developer/internship/unit_tests/build \
- --ignore-path docs/testing/developer/internship/vnf_catalog/build \
- --ignore-path docs/testing/user/configguide/build \
- --ignore-path docs/testing/user/userguide/build \
+ --ignore-path docs/build \
+ --ignore-path docs/_build \
api \
- docs/release/release-notes \
- docs/testing/user/configguide \
- docs/testing/user/userguide
+ docs
sphinx-build -W -b html api/ api/build
- sphinx-build -W -b html docs/release/release-notes docs/release/release-notes/build/html
- sphinx-build -W -b html docs/testing/developer/devguide docs/testing/developer/devguide/build/html
- sphinx-build -W -b html docs/testing/developer/internship/security_group docs/testing/developer/internship/security_group/build/html
- sphinx-build -W -b html docs/testing/developer/internship/testapi_evolution docs/testing/developer/internship/testapi_evolution/build/html
- sphinx-build -W -b html docs/testing/developer/internship/unit_tests docs/testing/developer/internship/unit_tests/build/html
- sphinx-build -W -b html docs/testing/developer/internship/vnf_catalog docs/testing/developer/internship/vnf_catalog/build/html
- sphinx-build -W -b html docs/testing/user/configguide docs/testing/user/configguide/build/html
- sphinx-build -W -b html docs/testing/user/userguide docs/testing/user/userguide/build/html
+ sphinx-build -W -n -b html docs docs/build/html
+ sphinx-build -W -n -b linkcheck docs docs/build/linkcheck
+ sphinx-build -W -b spelling -Dextensions=sphinxcontrib.spelling docs docs/build/spellcheck
[testenv:pep8]
-basepython = python2.7
+basepython = python3.10
commands = flake8
[testenv:pylint]
-basepython = python2.7
-whitelist_externals = bash
-modules =
- functest.api
- functest.ci
- functest.cli
- functest.opnfv_tests.openstack.rally
- functest.opnfv_tests.openstack.refstack
- functest.opnfv_tests.openstack.snaps
- functest.opnfv_tests.openstack.tempest
- functest.opnfv_tests.openstack.vping
- functest.opnfv_tests.sdn.odl
- functest.opnfv_tests.vnf.router
- functest.tests.unit.ci
- functest.tests.unit.cli
- functest.tests.unit.odl
- functest.tests.unit.openstack.rally
- functest.tests.unit.openstack.snaps
- functest.tests.unit.openstack.tempest
- functest.tests.unit.openstack.vping
- functest.tests.unit.vnf.router
- functest.tests.unit.utils
- functest.utils.config
- functest.utils.constants
- functest.utils.env
- functest.utils.functest_utils
+basepython = python3.10
commands =
- bash -c "\
- pylint -f parseable --ignore-imports=y --disable=locally-disabled functest | \
- tee pylint.out | sed -ne '/Raw metrics/,//p'"
- pylint --reports=n --errors-only functest
- pylint --disable=locally-disabled \
- --disable=duplicate-code \
- --ignore-imports=y --reports=n {[testenv:pylint]modules}
+ pylint \
+ --ignore-imports=y --min-similarity-lines=15 \
+ --generated-members=os.* \
+ --disable=locally-disabled functest
[testenv:yamllint]
-basepython = python2.7
+basepython = python3.10
files =
.travis.yml
docker
- functest/api
functest/ci
+ functest/opnfv_tests/openstack/rally/blacklist.yaml
+ functest/opnfv_tests/openstack/rally/rally_jobs.yaml
+ functest/opnfv_tests/openstack/tempest/custom_tests/blacklist.yaml
+ functest/opnfv_tests/openstack/tempest/custom_tests/tempest_conf.yaml
functest/opnfv_tests/vnf
commands =
yamllint -s {[testenv:yamllint]files}
-[testenv:py35]
-dirs =
- functest/tests/unit/ci
- functest/tests/unit/cli
- functest/tests/unit/odl
- functest/tests/unit/utils
-commands = nosetests {[testenv:py35]dirs}
+[testenv:bashate]
+basepython = python3.10
+files =
+ functest/opnfv_tests/openstack/cinder/write_data.sh
+ functest/opnfv_tests/openstack/cinder/read_data.sh
+ functest/ci/add_proxy.sh
+ functest/ci/convert_images.sh
+ functest/ci/download_images.sh
+ build.sh
+commands = bashate -e E005,E006,E042,E043 {[testenv:bashate]files}
+
+[testenv:bandit]
+basepython = python3.10
+commands = bandit -r functest -x tests -n 5 -ll -s B601,B602
[testenv:cover]
-basepython = python2.7
+basepython = python3.10
dirs =
- functest/tests/unit/ci
functest/tests/unit/odl
-commands = nosetests --with-coverage --cover-tests \
- --cover-package functest.ci.check_deployment \
- --cover-package functest.opnfv_tests.sdn.odl \
- --cover-package functest.tests.unit \
- --cover-min-percentage 100 {[testenv:cover]dirs}
+ functest/tests/unit/openstack/vping
+ functest/tests/unit/openstack/cinder
+commands =
+ pytest --cov=xtesting --cov-reset --cov-report html --cov-fail-under=100 \
+ {[testenv:cover]dirs}
[testenv:perm]
-basepython = python2.7
-whitelist_externals = bash
-path=. -not -path './.tox/*' -not -path './.git/*' -not -path './docs/com/pres/reveal.js/*'
+basepython = python3.10
+allowlist_externals = sh
+path=. -not -path './.tox/*' -not -path './.git/*' -not -path './docs/com/pres/reveal.js/*' -not -path './elements/functest/install.d/*'
commands =
- bash -c "\
+ sh -c "\
find {[testenv:perm]path} \( -type f -not -perm 644 -o -type d -not -perm 755 \) \
-exec ls -l \{\} + | grep '.' && exit 1 || exit 0"
- bash -c "\
+ sh -c "\
find {[testenv:perm]path} -exec file \{\} + | grep CRLF && exit 1 || exit 0"
+
+[testenv:pre-commit]
+basepython = python3.10
+commands =
+ pre-commit run --all-files --show-diff-on-failure
diff --git a/upper-constraints.txt b/upper-constraints.txt
index 820f8d487..5eff3d20f 100644
--- a/upper-constraints.txt
+++ b/upper-constraints.txt
@@ -1,24 +1,24 @@
-git+https://gerrit.opnfv.org/gerrit/releng#egg=opnfv&subdirectory=modules
-git+https://gerrit.opnfv.org/gerrit/snaps#egg=snaps
-git+https://gerrit.opnfv.org/gerrit/barometer#egg=baro_tests
-git+https://gerrit.opnfv.org/gerrit/sdnvpn#egg=sdnvpn
-git+https://gerrit.opnfv.org/gerrit/sfc#egg=sfc
--e git+https://gerrit.opnfv.org/gerrit/doctor#egg=doctor-tests
-git+https://gerrit.opnfv.org/gerrit/stor4nfv#egg=stor4nfv-tests
-git+https://gerrit.opnfv.org/gerrit/clover#egg=clover
-git+https://gerrit.opnfv.org/gerrit/parser#egg=nfv-heattranslator&subdirectory=tosca2heat/heat-translator
-git+https://gerrit.opnfv.org/gerrit/parser#egg=nfv-toscaparser&subdirectory=tosca2heat/tosca-parser
--e git+https://gerrit.opnfv.org/gerrit/parser#egg=nfv-parser
-git+https://github.com/openstack/refstack-client@a59189eaacda24b787ecb65e6634257beba361ec#egg=refstack-client
-cloudify-rest-client===4.0
-openbaton-cli===2.2.1b7
-robotframework===3.0.2
+git+https://gerrit.opnfv.org/gerrit/functest#egg=functest
+git+https://github.com/collivier/cloudify-rest-client.git@4.3.3-py3#egg=cloudify-rest-client
+robotframework===4.1.2
robotframework-httplibrary===0.4.2
-robotframework-requests===0.4.7
-robotframework-sshlibrary===2.1.3;python_version=='2.7'
-IPy===0.83
-ansible===2.3.2.0
-flasgger===0.6.6
-xtesting===0.41.0
-networking-bgpvpn===8.0.0
-sphinx-opnfv-theme===0.1.1
+robotframework-requests===0.9.2
+robotframework-sshlibrary===3.8.0
+xtesting===0.98.0
+bandit===1.7.5
+bandit===1.7.0
+ruamel.yaml.jinja2==0.2.2
+-e git+https://opendev.org/openstack/tempest#egg=tempest
+-e git+https://opendev.org/openstack/rally.git#egg=rally
+git+https://opendev.org/openstack/rally-openstack.git#egg=rally-openstack
+git+https://github.com/xrally/xrally-kubernetes.git#egg=xrally-kubernetes
+pylint===2.11.1
+flake8===4.0.1
+pytest===7.1.2
+pytest-cov===3.0.0
+pytest-html===3.1.1
+ruamel.yaml===0.17.17
+sphinxcontrib-spelling===4.3.0
+ansible-lint===5.2.1
+setuptools_scm===6.3.2
+pre-commit===3.1.1