aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.circleci/config.yml26
-rw-r--r--.gitignore3
-rw-r--r--.pre-commit-config.yaml16
-rw-r--r--.travis.yml194
-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/Makefile225
-rw-r--r--api/_static/.gitkeep0
-rw-r--r--api/_templates/.gitkeep0
-rw-r--r--api/apidoc/functest.core.cloudify.rst (renamed from api/apidoc/functest.core.testcase.rst)4
-rw-r--r--api/apidoc/functest.core.robotframework.rst7
-rw-r--r--api/apidoc/functest.core.rst20
-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.rst (renamed from api/apidoc/functest.core.feature.rst)4
-rw-r--r--api/apidoc/functest.utils.constants.rst7
-rw-r--r--api/apidoc/functest.utils.env.rst (renamed from api/apidoc/functest.core.unit.rst)4
-rw-r--r--api/apidoc/functest.utils.functest_utils.rst7
-rw-r--r--api/apidoc/functest.utils.rst20
-rw-r--r--api/conf.py27
-rw-r--r--build.sh76
-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/restapi/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/Dockerfile60
-rw-r--r--docker/core/Switch-to-threading.Thread-for-Rally-tasks.patch49
-rw-r--r--docker/features/Dockerfile25
-rw-r--r--docker/features/hooks/post_checkout6
-rw-r--r--docker/features/testcases.yaml91
-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/Dockerfile21
-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/restapi/Dockerfile61
-rw-r--r--docker/restapi/thirdparty-requirements.txt7
-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/Dockerfile128
-rw-r--r--docker/smoke/compute.txt (renamed from functest/opnfv_tests/openstack/refstack_client/defcore.txt)109
-rw-r--r--docker/smoke/hooks/post_checkout4
-rw-r--r--docker/smoke/object.txt66
-rw-r--r--docker/smoke/platform.txt (renamed from functest/opnfv_tests/openstack/tempest/custom_tests/defcore_req.txt)227
-rw-r--r--docker/smoke/testcases.yaml413
-rw-r--r--docker/vnf/Dockerfile69
-rw-r--r--docker/vnf/clearwater-heat-singlenet-deps.patch1849
-rw-r--r--docker/vnf/hooks/post_checkout2
-rw-r--r--docker/vnf/testcases.yaml63
-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/gambiachallenges/gambia.md79
-rw-r--r--docs/com/pres/gambiachallenges/index.html52
-rw-r--r--docs/com/pres/gates/gates.md82
-rw-r--r--docs/com/pres/gates/index.html52
-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.py179
-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/functest-release.rst277
-rw-r--r--docs/release/release-notes/index.rst8
-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/index.rst126
-rw-r--r--docs/testing/developer/internship/security_group/index.rst70
-rw-r--r--docs/testing/developer/internship/testapi_evolution/index.rst237
-rw-r--r--docs/testing/developer/internship/unit_tests/index.rst126
-rw-r--r--docs/testing/developer/internship/vnf_catalog/index.rst170
-rw-r--r--docs/testing/user/configguide/ci.rst13
-rw-r--r--docs/testing/user/configguide/configguide.rst621
-rw-r--r--docs/testing/user/configguide/index.rst122
-rw-r--r--docs/testing/user/configguide/intro.rst86
-rw-r--r--docs/testing/user/configguide/prerequisites.rst21
-rw-r--r--docs/testing/user/userguide/index.rst74
-rw-r--r--docs/testing/user/userguide/intro.rst10
-rw-r--r--docs/testing/user/userguide/reporting.rst28
-rw-r--r--docs/testing/user/userguide/runfunctest.rst140
-rw-r--r--docs/testing/user/userguide/test_details.rst355
-rw-r--r--docs/testing/user/userguide/test_overview.rst281
-rw-r--r--docs/testing/user/userguide/test_results.rst178
-rw-r--r--docs/testing/user/userguide/troubleshooting.rst195
-rw-r--r--elements/functest/element-deps1
-rwxr-xr-xelements/functest/install.d/16-functest14
-rw-r--r--functest/api/base.py71
-rw-r--r--functest/api/common/api_utils.py101
-rw-r--r--functest/api/common/thread.py52
-rw-r--r--functest/api/database/db.py26
-rw-r--r--functest/api/database/v1/handlers.py43
-rw-r--r--functest/api/database/v1/models.py33
-rw-r--r--functest/api/resources/v1/creds.py80
-rw-r--r--functest/api/resources/v1/envs.py83
-rw-r--r--functest/api/resources/v1/tasks.py111
-rw-r--r--functest/api/resources/v1/testcases.py156
-rw-r--r--functest/api/resources/v1/tiers.py82
-rw-r--r--functest/api/server.py106
-rw-r--r--functest/api/swagger/creds.yaml36
-rw-r--r--functest/api/swagger/creds_action.yaml56
-rw-r--r--functest/api/swagger/envs.yaml27
-rw-r--r--functest/api/swagger/envs_action.yaml42
-rw-r--r--functest/api/swagger/task.yaml37
-rw-r--r--functest/api/swagger/task_log.yaml37
-rw-r--r--functest/api/swagger/testcase.yaml36
-rw-r--r--functest/api/swagger/testcase_run.yaml46
-rw-r--r--functest/api/swagger/testcases.yaml23
-rw-r--r--functest/api/swagger/testcases_in_tier.yaml30
-rw-r--r--functest/api/swagger/tier.yaml33
-rw-r--r--functest/api/swagger/tiers.yaml23
-rw-r--r--functest/api/urls.py70
-rw-r--r--functest/ci/add_proxy.sh138
-rw-r--r--functest/ci/check_deployment.py184
-rw-r--r--functest/ci/config_aarch64_patch.yaml151
-rw-r--r--functest/ci/config_functest.yaml123
-rw-r--r--functest/ci/config_patch.yaml516
-rw-r--r--functest/ci/convert_images.sh13
-rw-r--r--functest/ci/download_images.sh25
-rw-r--r--functest/ci/logging.debug.ini110
-rw-r--r--functest/ci/logging.ini48
-rw-r--r--functest/ci/rally_aarch64_patch.conf2
-rw-r--r--functest/ci/run_tests.py289
-rw-r--r--functest/ci/testcases.yaml1082
-rw-r--r--functest/ci/tier_builder.py107
-rw-r--r--functest/ci/tier_handler.py174
-rw-r--r--functest/cli/cli_base.py127
-rw-r--r--functest/cli/commands/cli_env.py60
-rw-r--r--functest/cli/commands/cli_os.py66
-rw-r--r--functest/cli/commands/cli_testcase.py73
-rw-r--r--functest/cli/commands/cli_tier.py90
-rw-r--r--functest/cli/functest-complete.sh8
-rw-r--r--functest/core/cloudify.py219
-rw-r--r--functest/core/feature.py134
-rw-r--r--functest/core/robotframework.py125
-rw-r--r--functest/core/singlevm.py549
-rw-r--r--functest/core/tenantnetwork.py326
-rw-r--r--functest/core/testcase.py186
-rw-r--r--functest/core/unit.py92
-rw-r--r--functest/core/vnf.py206
-rw-r--r--functest/energy/energy.py335
-rw-r--r--functest/opnfv_tests/openstack/api/__init__.py (renamed from functest/api/__init__.py)0
-rw-r--r--functest/opnfv_tests/openstack/api/connection_check.py73
-rw-r--r--functest/opnfv_tests/openstack/barbican/__init__.py (renamed from functest/api/common/__init__.py)0
-rw-r--r--functest/opnfv_tests/openstack/barbican/barbican.py37
-rw-r--r--functest/opnfv_tests/openstack/cinder/__init__.py (renamed from functest/api/database/__init__.py)0
-rw-r--r--functest/opnfv_tests/openstack/cinder/cinder_test.py127
-rw-r--r--functest/opnfv_tests/openstack/cinder/read_data.sh26
-rw-r--r--functest/opnfv_tests/openstack/cinder/write_data.sh30
-rw-r--r--functest/opnfv_tests/openstack/patrole/__init__.py (renamed from functest/api/database/v1/__init__.py)0
-rw-r--r--functest/opnfv_tests/openstack/patrole/patrole.py28
-rw-r--r--functest/opnfv_tests/openstack/rally/blacklist.txt71
-rw-r--r--functest/opnfv_tests/openstack/rally/blacklist.yaml40
-rw-r--r--functest/opnfv_tests/openstack/rally/macro/macro.yaml6
-rw-r--r--functest/opnfv_tests/openstack/rally/rally.py1059
-rw-r--r--functest/opnfv_tests/openstack/rally/rally_jobs.yaml3
-rw-r--r--functest/opnfv_tests/openstack/rally/scenario/full/opnfv-ceilometer.yaml458
-rw-r--r--functest/opnfv_tests/openstack/rally/scenario/full/opnfv-cinder.yaml77
-rw-r--r--functest/opnfv_tests/openstack/rally/scenario/full/opnfv-glance.yaml5
-rw-r--r--functest/opnfv_tests/openstack/rally/scenario/full/opnfv-gnocchi.yaml181
-rw-r--r--functest/opnfv_tests/openstack/rally/scenario/full/opnfv-neutron.yaml22
-rw-r--r--functest/opnfv_tests/openstack/rally/scenario/full/opnfv-nova.yaml82
-rw-r--r--functest/opnfv_tests/openstack/rally/scenario/opnfv-barbican.yaml98
-rw-r--r--functest/opnfv_tests/openstack/rally/scenario/opnfv-quotas.yaml15
-rw-r--r--functest/opnfv_tests/openstack/rally/scenario/opnfv-swift.yaml71
-rw-r--r--functest/opnfv_tests/openstack/rally/scenario/opnfv-vm.yaml41
-rw-r--r--functest/opnfv_tests/openstack/rally/scenario/sanity/opnfv-ceilometer.yaml247
-rw-r--r--functest/opnfv_tests/openstack/rally/scenario/sanity/opnfv-cinder.yaml20
-rw-r--r--functest/opnfv_tests/openstack/rally/scenario/sanity/opnfv-glance.yaml5
-rw-r--r--functest/opnfv_tests/openstack/rally/scenario/sanity/opnfv-gnocchi.yaml119
-rw-r--r--functest/opnfv_tests/openstack/rally/scenario/sanity/opnfv-neutron.yaml12
-rw-r--r--functest/opnfv_tests/openstack/rally/scenario/sanity/opnfv-nova.yaml48
-rw-r--r--functest/opnfv_tests/openstack/rally/scenario/support/instance_dd_test.sh13
-rw-r--r--functest/opnfv_tests/openstack/rally/scenario/templates/server_with_ports.yaml.template2
-rw-r--r--functest/opnfv_tests/openstack/rally/scenario/templates/server_with_volume.yaml.template2
-rw-r--r--functest/opnfv_tests/openstack/rally/task.yaml18
-rw-r--r--functest/opnfv_tests/openstack/refstack/__init__.py (renamed from functest/api/resources/__init__.py)0
-rw-r--r--functest/opnfv_tests/openstack/refstack/refstack.py81
-rw-r--r--functest/opnfv_tests/openstack/refstack_client/refstack_client.py261
-rw-r--r--functest/opnfv_tests/openstack/refstack_client/tempest_conf.py67
-rw-r--r--functest/opnfv_tests/openstack/shaker/__init__.py (renamed from functest/api/resources/v1/__init__.py)0
-rw-r--r--functest/opnfv_tests/openstack/shaker/shaker.py147
-rw-r--r--functest/opnfv_tests/openstack/snaps/__init__.py0
-rw-r--r--functest/opnfv_tests/openstack/snaps/api_check.py41
-rw-r--r--functest/opnfv_tests/openstack/snaps/connection_check.py40
-rw-r--r--functest/opnfv_tests/openstack/snaps/health_check.py45
-rw-r--r--functest/opnfv_tests/openstack/snaps/smoke.py44
-rw-r--r--functest/opnfv_tests/openstack/snaps/snaps_suite_builder.py433
-rw-r--r--functest/opnfv_tests/openstack/snaps/snaps_test_runner.py63
-rw-r--r--functest/opnfv_tests/openstack/snaps/snaps_utils.py38
-rw-r--r--functest/opnfv_tests/openstack/tempest/conf_utils.py352
-rw-r--r--functest/opnfv_tests/openstack/tempest/custom_tests/blacklist.txt2
-rw-r--r--functest/opnfv_tests/openstack/tempest/custom_tests/blacklist.yaml19
-rw-r--r--functest/opnfv_tests/openstack/tempest/custom_tests/public_blacklist.yaml15
-rw-r--r--functest/opnfv_tests/openstack/tempest/custom_tests/tempest_conf.yaml117
-rw-r--r--functest/opnfv_tests/openstack/tempest/custom_tests/tempest_conf_ovn.yaml104
-rw-r--r--functest/opnfv_tests/openstack/tempest/tempest.py1128
-rw-r--r--functest/opnfv_tests/openstack/vmtp/__init__.py (renamed from functest/ci/__init__.py)0
-rw-r--r--functest/opnfv_tests/openstack/vmtp/vmtp.py213
-rw-r--r--functest/opnfv_tests/openstack/vping/ping.sh10
-rw-r--r--functest/opnfv_tests/openstack/vping/vping_base.py215
-rw-r--r--functest/opnfv_tests/openstack/vping/vping_ssh.py253
-rw-r--r--functest/opnfv_tests/openstack/vping/vping_userdata.py170
-rw-r--r--functest/opnfv_tests/sdn/odl/odl.py82
-rw-r--r--functest/opnfv_tests/vnf/epc/juju_epc.py687
-rw-r--r--functest/opnfv_tests/vnf/ims/clearwater.py190
-rw-r--r--functest/opnfv_tests/vnf/ims/clearwater_ims_base.py165
-rw-r--r--functest/opnfv_tests/vnf/ims/cloudify_ims.py605
-rw-r--r--functest/opnfv_tests/vnf/ims/cloudify_ims.yaml35
-rw-r--r--functest/opnfv_tests/vnf/ims/cloudify_ims_perf.py498
-rw-r--r--functest/opnfv_tests/vnf/ims/cloudify_ims_perf.yaml91
-rw-r--r--functest/opnfv_tests/vnf/ims/heat_ims.py253
-rw-r--r--functest/opnfv_tests/vnf/ims/heat_ims.yaml22
-rw-r--r--functest/opnfv_tests/vnf/ims/ixia/__init__.py0
-rw-r--r--functest/opnfv_tests/vnf/ims/ixia/files/REG_CALL_OPNFV_v13.rxf.template16731
-rw-r--r--functest/opnfv_tests/vnf/ims/ixia/files/Registration_only_LPS.tstbin491520 -> 0 bytes
-rw-r--r--functest/opnfv_tests/vnf/ims/ixia/files/SIPCall.tstbin573440 -> 0 bytes
-rw-r--r--functest/opnfv_tests/vnf/ims/ixia/utils/IxChassisUtils.py150
-rw-r--r--functest/opnfv_tests/vnf/ims/ixia/utils/IxLoadUtils.py398
-rw-r--r--functest/opnfv_tests/vnf/ims/ixia/utils/IxRestUtils.py192
-rw-r--r--functest/opnfv_tests/vnf/ims/ixia/utils/__init__.py0
-rw-r--r--functest/opnfv_tests/vnf/ims/orchestra.yaml68
-rw-r--r--functest/opnfv_tests/vnf/ims/orchestra_clearwaterims.py667
-rw-r--r--functest/opnfv_tests/vnf/ims/orchestra_openims.py690
-rw-r--r--functest/opnfv_tests/vnf/router/cloudify_vrouter.py572
-rw-r--r--functest/opnfv_tests/vnf/router/cloudify_vrouter.yaml12
-rw-r--r--functest/opnfv_tests/vnf/router/test_controller/function_test_exec.py22
-rw-r--r--functest/opnfv_tests/vnf/router/utilvnf.py176
-rw-r--r--functest/opnfv_tests/vnf/router/vnf_controller/checker.py10
-rw-r--r--functest/opnfv_tests/vnf/router/vnf_controller/command_generator.py12
-rw-r--r--functest/opnfv_tests/vnf/router/vnf_controller/ssh_client.py37
-rw-r--r--functest/opnfv_tests/vnf/router/vnf_controller/vm_controller.py33
-rw-r--r--functest/opnfv_tests/vnf/router/vnf_controller/vnf_controller.py35
-rw-r--r--functest/opnfv_tests/vnf/router/vrouter_base.py47
-rw-r--r--functest/tests/unit/ci/__init__.py0
-rw-r--r--functest/tests/unit/ci/test_check_deployment.py199
-rw-r--r--functest/tests/unit/ci/test_run_tests.py250
-rw-r--r--functest/tests/unit/ci/test_tier_builder.py92
-rw-r--r--functest/tests/unit/ci/test_tier_handler.py142
-rw-r--r--functest/tests/unit/cli/__init__.py0
-rw-r--r--functest/tests/unit/cli/commands/__init__.py0
-rw-r--r--functest/tests/unit/cli/commands/test_cli_env.py70
-rw-r--r--functest/tests/unit/cli/commands/test_cli_os.py80
-rw-r--r--functest/tests/unit/cli/commands/test_cli_testcase.py81
-rw-r--r--functest/tests/unit/cli/commands/test_cli_tier.py104
-rw-r--r--functest/tests/unit/cli/test_cli_base.py98
-rw-r--r--functest/tests/unit/core/__init__.py0
-rw-r--r--functest/tests/unit/core/test_feature.py114
-rw-r--r--functest/tests/unit/core/test_robotframework.py191
-rw-r--r--functest/tests/unit/core/test_testcase.py232
-rw-r--r--functest/tests/unit/core/test_unit.py98
-rw-r--r--functest/tests/unit/core/test_vnf.py194
-rw-r--r--functest/tests/unit/energy/__init__.py0
-rw-r--r--functest/tests/unit/energy/test_functest_energy.py385
-rw-r--r--functest/tests/unit/odl/test_odl.py408
-rw-r--r--functest/tests/unit/openstack/cinder/__init__.py (renamed from functest/cli/__init__.py)0
-rw-r--r--functest/tests/unit/openstack/cinder/test_cinder.py270
-rw-r--r--functest/tests/unit/openstack/rally/test_rally.py495
-rw-r--r--functest/tests/unit/openstack/refstack_client/__init__.py0
-rw-r--r--functest/tests/unit/openstack/refstack_client/test_refstack_client.py154
-rw-r--r--functest/tests/unit/openstack/snaps/__init__.py0
-rw-r--r--functest/tests/unit/openstack/snaps/test_snaps.py228
-rw-r--r--functest/tests/unit/openstack/tempest/test_conf_utils.py340
-rw-r--r--functest/tests/unit/openstack/tempest/test_tempest.py418
-rw-r--r--functest/tests/unit/openstack/vmtp/__init__.py (renamed from functest/cli/commands/__init__.py)0
-rw-r--r--functest/tests/unit/openstack/vmtp/test_vmtp.py90
-rw-r--r--functest/tests/unit/openstack/vping/__init__.py (renamed from functest/energy/__init__.py)0
-rw-r--r--functest/tests/unit/openstack/vping/test_vping.py159
-rw-r--r--functest/tests/unit/openstack/vping/test_vping_ssh.py147
-rw-r--r--functest/tests/unit/test_utils.py29
-rw-r--r--functest/tests/unit/utils/test_decorators.py126
-rw-r--r--functest/tests/unit/utils/test_env.py57
-rw-r--r--functest/tests/unit/utils/test_functest_utils.py581
-rw-r--r--functest/tests/unit/utils/test_openstack_utils.py1811
-rw-r--r--functest/tests/unit/vnf/epc/__init__.py (renamed from functest/opnfv_tests/openstack/refstack_client/__init__.py)0
-rw-r--r--functest/tests/unit/vnf/epc/test_juju_epc.py23
-rw-r--r--functest/tests/unit/vnf/ims/test_clearwater.py (renamed from functest/tests/unit/vnf/ims/test_ims_base.py)10
-rw-r--r--functest/tests/unit/vnf/ims/test_cloudify_ims.py51
-rw-r--r--functest/tests/unit/vnf/ims/test_orchestra_clearwaterims.py120
-rw-r--r--functest/tests/unit/vnf/ims/test_orchestra_openims.py122
-rw-r--r--functest/tests/unit/vnf/router/test_cloudify_vrouter.py53
-rw-r--r--functest/tests/unit/vnf/router/test_vrouter_base.py12
-rw-r--r--functest/utils/config.py24
-rw-r--r--functest/utils/constants.py18
-rw-r--r--functest/utils/decorators.py57
-rw-r--r--functest/utils/env.py94
-rw-r--r--functest/utils/functest_utils.py424
-rw-r--r--functest/utils/functest_vacation.py53
-rw-r--r--functest/utils/openstack_utils.py1499
-rw-r--r--requirements.txt45
-rw-r--r--setup.cfg45
-rw-r--r--setup.py8
-rw-r--r--test-requirements.txt20
-rw-r--r--tox.ini124
-rw-r--r--upper-constraints.txt43
387 files changed, 17861 insertions, 41121 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 81ebca89c..12d86f825 100644
--- a/.gitignore
+++ b/.gitignore
@@ -4,7 +4,7 @@
.project
.pydevproject
rally_conf.json
-/docs_build/
+/docs/**/build/
_build
/docs_output/
/releng/
@@ -18,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 fcb229ead..6b6e0a672 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,132 +1,188 @@
+---
sudo: required
-language: bash
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}"
+ - 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"
+ - REPO="${DOCKER_USERNAME}"
+ - 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}"
+ - 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}"
+ - 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/features"
- - script: sudo -E bash build.sh
+ - REPO="${DOCKER_USERNAME}"
+ - amd64_dirs="docker/smoke"
+ - arm64_dirs=""
+ - arm_dirs=""
+ - script: sudo -E sh build.sh
env:
- - repo="${DOCKER_USERNAME}"
+ - REPO="${DOCKER_USERNAME}"
- amd64_dirs=""
- - arm64_dirs="docker/components"
- - script: sudo -E bash build.sh
+ - arm64_dirs="docker/smoke"
+ - arm_dirs=""
+ - script: sudo -E sh build.sh
env:
- - repo="${DOCKER_USERNAME}"
+ - REPO="${DOCKER_USERNAME}"
- amd64_dirs=""
- - arm64_dirs="docker/parser"
- - script: sudo -E bash build.sh
- env:
- - repo="${DOCKER_USERNAME}"
- - amd64_dirs="docker/healthcheck"
- 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"
+ - REPO="${DOCKER_USERNAME}"
+ - 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
+ - REPO="${DOCKER_USERNAME}"
+ - amd64_dirs=""
+ - arm64_dirs="docker/benchmarking"
+ - arm_dirs=""
+ - script: sudo -E sh build.sh
env:
- - repo="${DOCKER_USERNAME}"
- - amd64_dirs="docker/components"
+ - REPO="${DOCKER_USERNAME}"
+ - amd64_dirs=""
- arm64_dirs=""
- - script: sudo -E bash build.sh
+ - arm_dirs="docker/benchmarking"
+ - script: sudo -E sh build.sh
env:
- - repo="${DOCKER_USERNAME}"
+ - 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="docker/restapi"
- - arm64_dirs=""
- - script: sudo -E bash build.sh
+ - 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"
+ - REPO="${DOCKER_USERNAME}"
+ - amd64_dirs=""
- arm64_dirs=""
+ - arm_dirs="docker/vnf"
- stage: publish all manifests
script: >
sudo manifest-tool push from-args \
- --platforms linux/amd64,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-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,linux/arm64 \
- --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
- - script: >
+ - 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 \
- --template ${DOCKER_USERNAME}/functest-restapi:ARCH-latest \
- --target ${DOCKER_USERNAME}/functest-restapi:latest
+ --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/Makefile b/api/Makefile
deleted file mode 100644
index ca9cfdc0b..000000000
--- a/api/Makefile
+++ /dev/null
@@ -1,225 +0,0 @@
-# Makefile for Sphinx documentation
-#
-
-# You can set these variables from the command line.
-SPHINXOPTS =
-SPHINXBUILD = sphinx-build
-PAPER =
-BUILDDIR = _build
-
-# Internal variables.
-PAPEROPT_a4 = -D latex_paper_size=a4
-PAPEROPT_letter = -D latex_paper_size=letter
-ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
-# the i18n builder cannot share the environment and doctrees with the others
-I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
-
-.PHONY: help
-help:
- @echo "Please use \`make <target>' where <target> is one of"
- @echo " html to make standalone HTML files"
- @echo " dirhtml to make HTML files named index.html in directories"
- @echo " singlehtml to make a single large HTML file"
- @echo " pickle to make pickle files"
- @echo " json to make JSON files"
- @echo " htmlhelp to make HTML files and a HTML help project"
- @echo " qthelp to make HTML files and a qthelp project"
- @echo " applehelp to make an Apple Help Book"
- @echo " devhelp to make HTML files and a Devhelp project"
- @echo " epub to make an epub"
- @echo " epub3 to make an epub3"
- @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
- @echo " latexpdf to make LaTeX files and run them through pdflatex"
- @echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx"
- @echo " text to make text files"
- @echo " man to make manual pages"
- @echo " texinfo to make Texinfo files"
- @echo " info to make Texinfo files and run them through makeinfo"
- @echo " gettext to make PO message catalogs"
- @echo " changes to make an overview of all changed/added/deprecated items"
- @echo " xml to make Docutils-native XML files"
- @echo " pseudoxml to make pseudoxml-XML files for display purposes"
- @echo " linkcheck to check all external links for integrity"
- @echo " doctest to run all doctests embedded in the documentation (if enabled)"
- @echo " coverage to run coverage check of the documentation (if enabled)"
- @echo " dummy to check syntax errors of document sources"
-
-.PHONY: clean
-clean:
- rm -rf $(BUILDDIR)/*
-
-.PHONY: html
-html:
- $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
- @echo
- @echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
-
-.PHONY: dirhtml
-dirhtml:
- $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
- @echo
- @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
-
-.PHONY: singlehtml
-singlehtml:
- $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
- @echo
- @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."
-
-.PHONY: pickle
-pickle:
- $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
- @echo
- @echo "Build finished; now you can process the pickle files."
-
-.PHONY: json
-json:
- $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
- @echo
- @echo "Build finished; now you can process the JSON files."
-
-.PHONY: htmlhelp
-htmlhelp:
- $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
- @echo
- @echo "Build finished; now you can run HTML Help Workshop with the" \
- ".hhp project file in $(BUILDDIR)/htmlhelp."
-
-.PHONY: qthelp
-qthelp:
- $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
- @echo
- @echo "Build finished; now you can run "qcollectiongenerator" with the" \
- ".qhcp project file in $(BUILDDIR)/qthelp, like this:"
- @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/OPNFVFunctest.qhcp"
- @echo "To view the help file:"
- @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/OPNFVFunctest.qhc"
-
-.PHONY: applehelp
-applehelp:
- $(SPHINXBUILD) -b applehelp $(ALLSPHINXOPTS) $(BUILDDIR)/applehelp
- @echo
- @echo "Build finished. The help book is in $(BUILDDIR)/applehelp."
- @echo "N.B. You won't be able to view it unless you put it in" \
- "~/Library/Documentation/Help or install it in your application" \
- "bundle."
-
-.PHONY: devhelp
-devhelp:
- $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
- @echo
- @echo "Build finished."
- @echo "To view the help file:"
- @echo "# mkdir -p $$HOME/.local/share/devhelp/OPNFVFunctest"
- @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/OPNFVFunctest"
- @echo "# devhelp"
-
-.PHONY: epub
-epub:
- $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
- @echo
- @echo "Build finished. The epub file is in $(BUILDDIR)/epub."
-
-.PHONY: epub3
-epub3:
- $(SPHINXBUILD) -b epub3 $(ALLSPHINXOPTS) $(BUILDDIR)/epub3
- @echo
- @echo "Build finished. The epub3 file is in $(BUILDDIR)/epub3."
-
-.PHONY: latex
-latex:
- $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
- @echo
- @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
- @echo "Run \`make' in that directory to run these through (pdf)latex" \
- "(use \`make latexpdf' here to do that automatically)."
-
-.PHONY: latexpdf
-latexpdf:
- $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
- @echo "Running LaTeX files through pdflatex..."
- $(MAKE) -C $(BUILDDIR)/latex all-pdf
- @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
-
-.PHONY: latexpdfja
-latexpdfja:
- $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
- @echo "Running LaTeX files through platex and dvipdfmx..."
- $(MAKE) -C $(BUILDDIR)/latex all-pdf-ja
- @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
-
-.PHONY: text
-text:
- $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
- @echo
- @echo "Build finished. The text files are in $(BUILDDIR)/text."
-
-.PHONY: man
-man:
- $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
- @echo
- @echo "Build finished. The manual pages are in $(BUILDDIR)/man."
-
-.PHONY: texinfo
-texinfo:
- $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
- @echo
- @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo."
- @echo "Run \`make' in that directory to run these through makeinfo" \
- "(use \`make info' here to do that automatically)."
-
-.PHONY: info
-info:
- $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
- @echo "Running Texinfo files through makeinfo..."
- make -C $(BUILDDIR)/texinfo info
- @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo."
-
-.PHONY: gettext
-gettext:
- $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale
- @echo
- @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale."
-
-.PHONY: changes
-changes:
- $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
- @echo
- @echo "The overview file is in $(BUILDDIR)/changes."
-
-.PHONY: linkcheck
-linkcheck:
- $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
- @echo
- @echo "Link check complete; look for any errors in the above output " \
- "or in $(BUILDDIR)/linkcheck/output.txt."
-
-.PHONY: doctest
-doctest:
- $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
- @echo "Testing of doctests in the sources finished, look at the " \
- "results in $(BUILDDIR)/doctest/output.txt."
-
-.PHONY: coverage
-coverage:
- $(SPHINXBUILD) -b coverage $(ALLSPHINXOPTS) $(BUILDDIR)/coverage
- @echo "Testing of coverage in the sources finished, look at the " \
- "results in $(BUILDDIR)/coverage/python.txt."
-
-.PHONY: xml
-xml:
- $(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml
- @echo
- @echo "Build finished. The XML files are in $(BUILDDIR)/xml."
-
-.PHONY: pseudoxml
-pseudoxml:
- $(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml
- @echo
- @echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml."
-
-.PHONY: dummy
-dummy:
- $(SPHINXBUILD) -b dummy $(ALLSPHINXOPTS) $(BUILDDIR)/dummy
- @echo
- @echo "Build finished. Dummy builder generates no files."
diff --git a/api/_static/.gitkeep b/api/_static/.gitkeep
deleted file mode 100644
index e69de29bb..000000000
--- a/api/_static/.gitkeep
+++ /dev/null
diff --git a/api/_templates/.gitkeep b/api/_templates/.gitkeep
deleted file mode 100644
index e69de29bb..000000000
--- a/api/_templates/.gitkeep
+++ /dev/null
diff --git a/api/apidoc/functest.core.testcase.rst b/api/apidoc/functest.core.cloudify.rst
index 2f947a1bf..aa186afe7 100644
--- a/api/apidoc/functest.core.testcase.rst
+++ b/api/apidoc/functest.core.cloudify.rst
@@ -1,7 +1,7 @@
-functest.core.testcase module
+functest.core.cloudify module
=============================
-.. automodule:: functest.core.testcase
+.. automodule:: functest.core.cloudify
:members:
:undoc-members:
:show-inheritance:
diff --git a/api/apidoc/functest.core.robotframework.rst b/api/apidoc/functest.core.robotframework.rst
deleted file mode 100644
index 5404912c5..000000000
--- a/api/apidoc/functest.core.robotframework.rst
+++ /dev/null
@@ -1,7 +0,0 @@
-functest.core.robotframework module
-===================================
-
-.. automodule:: functest.core.robotframework
- :members:
- :undoc-members:
- :show-inheritance:
diff --git a/api/apidoc/functest.core.rst b/api/apidoc/functest.core.rst
index a610fa6fb..6d457c7f5 100644
--- a/api/apidoc/functest.core.rst
+++ b/api/apidoc/functest.core.rst
@@ -1,19 +1,19 @@
functest.core package
=====================
-.. automodule:: functest.core
- :members:
- :undoc-members:
- :show-inheritance:
-
Submodules
----------
.. toctree::
- functest.core.feature
- functest.core.robotframework
- functest.core.testcase
- functest.core.vnf
- functest.core.unit
+ 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.core.feature.rst b/api/apidoc/functest.utils.config.rst
index a80e38daa..5ea6e8982 100644
--- a/api/apidoc/functest.core.feature.rst
+++ b/api/apidoc/functest.utils.config.rst
@@ -1,7 +1,7 @@
-functest.core.feature module
+functest.utils.config module
============================
-.. automodule:: functest.core.feature
+.. 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.core.unit.rst b/api/apidoc/functest.utils.env.rst
index 5dd6880ed..cbcb3d6b0 100644
--- a/api/apidoc/functest.core.unit.rst
+++ b/api/apidoc/functest.utils.env.rst
@@ -1,7 +1,7 @@
-functest.core.unit module
+functest.utils.env module
=========================
-.. automodule:: functest.core.unit
+.. 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/conf.py b/api/conf.py
index 746a90fe0..18b33fdda 100644
--- a/api/conf.py
+++ b/api/conf.py
@@ -51,8 +51,8 @@ master_doc = 'index'
# General information about the project.
project = u'OPNFV Functest'
-copyright = u'2017, #opnfv-functest (chat.freenode.net)'
-author = u'#opnfv-functest (chat.freenode.net)'
+copyright = u'2017, 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
@@ -121,7 +121,7 @@ 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 = 'alabaster'
+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
@@ -155,7 +155,7 @@ html_theme = 'alabaster'
# 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 = ['_static']
+# html_static_path = []
# Add any extra paths that contain custom files (such as robots.txt or
# .htaccess) here, relative to this directory. These files are copied
@@ -261,8 +261,11 @@ latex_elements = {
# (source start file, target name, title,
# author, documentclass [howto, manual, or own class]).
latex_documents = [
- (master_doc, 'OPNFVFunctest.tex', u'OPNFV Functest Documentation',
- u'\\#opnfv-functest (chat.freenode.net)', 'manual'),
+ (master_doc,
+ 'OPNFVFunctest.tex',
+ u'OPNFV Functest Documentation',
+ u'Functest \\textless{}opnfv-tech-discuss@lists.opnfv.org\\textgreater{}',
+ 'manual'),
]
# The name of an image file (relative to this directory) to place at the top of
@@ -303,7 +306,9 @@ latex_documents = [
# One entry per manual page. List of tuples
# (source start file, name, description, authors, manual section).
man_pages = [
- (master_doc, 'opnfvfunctest', u'OPNFV Functest Documentation',
+ (master_doc,
+ 'opnfvfunctest',
+ u'OPNFV Functest Documentation',
[author], 1)
]
@@ -318,8 +323,12 @@ man_pages = [
# (source start file, target name, title, author,
# dir menu entry, description, category)
texinfo_documents = [
- (master_doc, 'OPNFVFunctest', u'OPNFV Functest Documentation',
- author, 'OPNFVFunctest', 'One line description of project.',
+ (master_doc,
+ 'OPNFVFunctest',
+ u'OPNFV Functest Documentation',
+ author,
+ 'OPNFVFunctest',
+ 'One line description of project.',
'Miscellaneous'),
]
diff --git a/build.sh b/build.sh
index 929f71f1b..033d31310 100644
--- a/build.sh
+++ b/build.sh
@@ -1,37 +1,79 @@
-#!/bin/bash
+#!/bin/sh
set -e
-repo=${repo:-opnfv}
+repo=${REPO:-opnfv}
amd64_dirs=${amd64_dirs-"\
docker/core \
docker/healthcheck \
docker/smoke \
-docker/features \
-docker/components \
+docker/benchmarking \
docker/vnf \
-docker/parser \
-docker/restapi"}
+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/restapi/hooks/post_checkout b/docker/benchmarking/hooks/post_checkout
index 8d0e98124..c347524ea 100644
--- a/docker/restapi/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 ce0d0c50a..000000000
--- a/docker/components/Dockerfile
+++ /dev/null
@@ -1,33 +0,0 @@
-FROM opnfv/functest-core
-
-ARG BRANCH=master
-ARG OPENSTACK_TAG=stable/pike
-ARG RALLY_TAG=stable/0.10
-ARG OS_FAULTS_TAG=0.1.16
-
-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 /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/functest/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 e9cea8421..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: '^((?!netvirt).)*$'
- scenario: ''
- run:
- module: 'functest.opnfv_tests.openstack.tempest.tempest'
- class: 'TempestFullParallel'
-
- -
- case_name: rally_full
- project_name: functest
- criteria: 90
- blocking: false
- description: >-
- This test case runs the full suite of scenarios of the
- OpenStack Rally suite using several threads and iterations.
- dependencies:
- installer: '^((?!netvirt).)*$'
- scenario: ''
- run:
- module: 'functest.opnfv_tests.openstack.rally.rally'
- class: 'RallyFull'
diff --git a/docker/core/Dockerfile b/docker/core/Dockerfile
index bc47e39b0..2715cce39 100644
--- a/docker/core/Dockerfile
+++ b/docker/core/Dockerfile
@@ -1,21 +1,49 @@
-FROM alpine:3.7
+FROM alpine:3.16
ARG BRANCH=master
-ARG OPENSTACK_TAG=stable/pike
+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 && \
- bash -c "mkdir -p /home/opnfv/functest{/conf,/data,/images,/results} /home/opnfv/repos/vnfs" && \
+ 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 && \
+ 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 eaf88f89c..000000000
--- a/docker/features/Dockerfile
+++ /dev/null
@@ -1,25 +0,0 @@
-FROM opnfv/functest-core
-
-ARG BRANCH=master
-ARG OPENSTACK_TAG=stable/pike
-ARG FDS_TAG=master
-
-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 \
- -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 && \
- apk del .build-deps
-COPY testcases.yaml /usr/lib/python2.7/site-packages/functest/ci/testcases.yaml
-CMD ["run_tests", "-t", "all"]
diff --git a/docker/features/hooks/post_checkout b/docker/features/hooks/post_checkout
deleted file mode 100644
index 8d0e98124..000000000
--- a/docker/features/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/features/testcases.yaml b/docker/features/testcases.yaml
deleted file mode 100644
index 7a30c6d9a..000000000
--- a/docker/features/testcases.yaml
+++ /dev/null
@@ -1,91 +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'
- scenario: '^((?!fdio).)*$'
- run:
- module: 'functest.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: '(fuel)|(apex)|(netvirt)'
- 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: 'functest.core.feature'
- class: 'BashFeature'
- args:
- cmd: 'run_sfc_tests.py'
-
- -
- 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: 'apex'
- 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: 'apex'
- 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 21b46ef97..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/functest/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 b631e84fe..7b6b2a108 100644
--- a/docker/healthcheck/testcases.yaml
+++ b/docker/healthcheck/testcases.yaml
@@ -2,8 +2,6 @@
tiers:
-
name: healthcheck
- order: 0
- ci_loop: '(daily)|(weekly)'
description: >-
First tier to be executed to verify the basic
operations in the VIM.
@@ -16,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: '^((?!netvirt).)*$'
- 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: '^((?!netvirt).)*$'
- 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 bf43ac0ce..000000000
--- a/docker/parser/Dockerfile
+++ /dev/null
@@ -1,21 +0,0 @@
-FROM opnfv/functest-core
-
-ARG BRANCH=master
-ARG OPENSTACK_TAG=stable/pike
-ARG RALLY_TAG=stable/0.10
-ARG OS_FAULTS_TAG=0.1.16
-
-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/functest/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 d069f3417..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|noha).)*$'
- run:
- module: 'functest.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/restapi/Dockerfile b/docker/restapi/Dockerfile
deleted file mode 100644
index 15b83fe3f..000000000
--- a/docker/restapi/Dockerfile
+++ /dev/null
@@ -1,61 +0,0 @@
-FROM opnfv/functest-core
-
-ARG BRANCH=master
-ARG OPENSTACK_TAG=stable/pike
-ARG ODL_TAG=master
-ARG RALLY_TAG=stable/0.10
-ARG OS_FAULTS_TAG=0.1.16
-ARG REFSTACK_TAG=master
-ARG FDS_TAG=master
-ARG VIMS_TAG=stable
-
-COPY thirdparty-requirements.txt thirdparty-requirements.txt
-RUN apk --no-cache add --update python3 sshpass \
- ruby ruby-bundler ruby-irb ruby-rdoc dnsmasq \
- procps libxslt libxml2 zlib libffi go musl-dev && \
- apk --no-cache add --virtual .build-deps --update \
- python-dev python3-dev build-base linux-headers libffi-dev \
- openssl-dev libjpeg-turbo-dev \
- 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 && \
- 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/ && \
- git clone https://github.com/openstack/refstack-client.git /src/refstack-client && \
- (cd /src/refstack-client && git checkout $REFSTACK_TAG) && \
- update-requirements -s --source /src/openstack-requirements /src/refstack-client/ && \
- pip install --no-cache-dir --src /src -cupper-constraints.txt \
- -chttps://git.opnfv.org/functest/plain/upper-constraints.txt?h=$BRANCH \
- tempest /src/os-faults && \
- pip install --no-cache-dir --src /src -cupper-constraints.txt \
- -chttps://git.opnfv.org/functest/plain/upper-constraints.txt?h=$BRANCH \
- -e/src/refstack-client /src/rally -rthirdparty-requirements.txt && \
- 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 && \
- git clone https://git.opendaylight.org/gerrit/p/integration/test.git /src/odl_test && \
- (cd /src/odl_test && git checkout $ODL_TAG) && \
- git clone --depth 1 -b $FDS_TAG https://gerrit.opnfv.org/gerrit/fds /src/fds && \
- git clone --depth 1 -b $VIMS_TAG https://github.com/boucherv-orange/clearwater-live-test /src/vims-test && \
- ln -s /src/tempest /src/refstack-client/.tempest && \
- virtualenv --system-site-packages /src/tempest/.venv --python=python2.7 && \
- 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 && \
- (cd /src/vims-test && bundle config build.nokogiri --use-system-libraries && bundle install --system) && \
- rm -r upper-constraints.txt thirdparty-requirements.txt /src/refstack-client/.git /src/odl_test/.git \
- /src/os-faults /src/rally /src/fds/.git /src/vims-test/.git /src/epc-requirements/abot_charm/.git && \
- 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
-EXPOSE 5000
-CMD ["functest_restapi"]
diff --git a/docker/restapi/thirdparty-requirements.txt b/docker/restapi/thirdparty-requirements.txt
deleted file mode 100644
index 73c11b447..000000000
--- a/docker/restapi/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/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 5e5b1591e..da42ef9b4 100644
--- a/docker/smoke/Dockerfile
+++ b/docker/smoke/Dockerfile
@@ -1,44 +1,94 @@
FROM opnfv/functest-core
-ARG BRANCH=master
-ARG OPENSTACK_TAG=stable/pike
-ARG ODL_TAG=master
-ARG RALLY_TAG=stable/0.10
-ARG OS_FAULTS_TAG=0.1.16
-ARG REFSTACK_TAG=master
+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 --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/ && \
- git clone https://github.com/openstack/refstack-client.git /src/refstack-client && \
- (cd /src/refstack-client && git checkout $REFSTACK_TAG) && \
- update-requirements -s --source /src/openstack-requirements /src/refstack-client/ && \
- pip install --no-cache-dir --src /src -cupper-constraints.txt \
- -chttps://git.opnfv.org/functest/plain/upper-constraints.txt?h=$BRANCH \
- tempest /src/os-faults && \
- pip install --no-cache-dir --src /src -cupper-constraints.txt \
- -chttps://git.opnfv.org/functest/plain/upper-constraints.txt?h=$BRANCH \
- -e/src/refstack-client /src/rally -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) && \
- ln -s /src/tempest /src/refstack-client/.tempest && \
- virtualenv --system-site-packages /src/tempest/.venv && \
- rm -r upper-constraints.txt thirdparty-requirements.txt /src/refstack-client/.git /src/odl_test/.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 && \
+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 && \
+ 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/functest/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/refstack_client/defcore.txt b/docker/smoke/compute.txt
index e958b47cd..7a642a703 100644
--- a/functest/opnfv_tests/openstack/refstack_client/defcore.txt
+++ b/docker/smoke/compute.txt
@@ -1,18 +1,18 @@
-# Set of DefCore tempest test cases not flagged and required.
-# According to https://github.com/openstack/interop/blob/master/doc/source/guidelines/2017.09.rst,
-# some tests are still flagged due to outstanding bugs in the Tempest library,
-# particularly tests that require SSH. Refstack developers
-# are working on correcting these bugs upstream. Please note that although some tests
-# are flagged because of bugs, there is still an expectation that the capabilities
-# covered by the tests are available.
-# It only contains Openstack core compute (no object storage)
-# The approved guidelines (2017.09) are valid for Mitaka, Newton, Ocata, Pike releases of OpenStack
-# The list can be generated using the Rest API from RefStack project:
-# https://refstack.openstack.org/api/v1/guidelines/2017.09/tests?target=compute&type=required&alias=true&flag=false
tempest.api.compute.flavors.test_flavors.FlavorsV2TestJSON.test_list_flavors[id-e36c0eaa-dff5-4082-ad1f-3f9a80aa3f59]
tempest.api.compute.flavors.test_flavors.FlavorsV2TestJSON.test_list_flavors_with_detail[id-6e85fde4-b3cd-4137-ab72-ed5f418e8c24]
tempest.api.compute.images.test_images_oneserver.ImagesOneServerTestJSON.test_create_delete_image[id-3731d080-d4c5-4872-b41a-64d0d0021314]
tempest.api.compute.images.test_images_oneserver.ImagesOneServerTestJSON.test_create_image_specify_multibyte_character_image_name[id-3b7c6fe4-dfe7-477c-9243-b06359db51e6]
+tempest.api.compute.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]
@@ -38,6 +38,7 @@ 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]
@@ -50,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]
@@ -87,7 +87,7 @@ tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_u
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_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]
@@ -95,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]
@@ -124,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]
@@ -136,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]
@@ -154,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]
@@ -168,8 +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_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]
@@ -190,6 +240,7 @@ tempest.api.network.test_security_groups_negative.NegativeSecGroupTest.test_dele
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]
@@ -200,17 +251,16 @@ tempest.api.volume.test_snapshot_metadata.SnapshotMetadataTestJSON.test_update_s
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.VolumesActionsTest.test_reserve_unreserve_volume[id-92c4ef64-51b2-40c0-9f7e-4749fbaaba33]
tempest.api.volume.test_volumes_actions.VolumesActionsTest.test_volume_bootable[id-63e21b4c-0a0c-41f6-bfc3-7c2816815599]
tempest.api.volume.test_volumes_actions.VolumesActionsTest.test_volume_readonly_update[id-fff74e1e-5bd3-4b33-9ea9-24c103bc3f59]
tempest.api.volume.test_volumes_actions.VolumesActionsTest.test_volume_upload[id-d8f1ca95-3d5b-44a3-b8ca-909691c9532d]
-tempest.api.volume.test_volumes_actions.VolumesV2ActionsTest.test_reserve_unreserve_volume[id-92c4ef64-51b2-40c0-9f7e-4749fbaaba33]
tempest.api.volume.test_volumes_actions.VolumesV2ActionsTest.test_volume_bootable[id-63e21b4c-0a0c-41f6-bfc3-7c2816815599]
tempest.api.volume.test_volumes_actions.VolumesV2ActionsTest.test_volume_readonly_update[id-fff74e1e-5bd3-4b33-9ea9-24c103bc3f59]
tempest.api.volume.test_volumes_actions.VolumesV2ActionsTest.test_volume_upload[id-d8f1ca95-3d5b-44a3-b8ca-909691c9532d]
@@ -262,9 +312,6 @@ tempest.api.volume.test_volumes_negative.VolumesNegativeTest.test_list_volumes_d
tempest.api.volume.test_volumes_negative.VolumesNegativeTest.test_list_volumes_detail_with_nonexistent_name[id-9ca17820-a0e7-4cbd-a7fa-f4468735e359]
tempest.api.volume.test_volumes_negative.VolumesNegativeTest.test_list_volumes_with_invalid_status[id-143b279b-7522-466b-81be-34a87d564a7c]
tempest.api.volume.test_volumes_negative.VolumesNegativeTest.test_list_volumes_with_nonexistent_name[id-0f4aa809-8c7b-418f-8fb3-84c7a5dfc52f]
-tempest.api.volume.test_volumes_negative.VolumesNegativeTest.test_reserve_volume_with_negative_volume_status[id-449c4ed2-ecdd-47bb-98dc-072aeccf158c]
-tempest.api.volume.test_volumes_negative.VolumesNegativeTest.test_reserve_volume_with_nonexistent_volume_id[id-ac6084c0-0546-45f9-b284-38a367e0e0e2]
-tempest.api.volume.test_volumes_negative.VolumesNegativeTest.test_unreserve_volume_with_nonexistent_volume_id[id-eb467654-3dc1-4a72-9b46-47c29d22654c]
tempest.api.volume.test_volumes_negative.VolumesNegativeTest.test_update_volume_with_empty_volume_id[id-72aeca85-57a5-4c1f-9057-f320f9ea575b]
tempest.api.volume.test_volumes_negative.VolumesNegativeTest.test_update_volume_with_invalid_volume_id[id-e66e40d6-65e6-4e75-bdc7-636792fa152d]
tempest.api.volume.test_volumes_negative.VolumesNegativeTest.test_update_volume_with_nonexistent_volume_id[id-0186422c-999a-480e-a026-6a665744c30c]
@@ -286,9 +333,6 @@ tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_list_volumes
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]
@@ -300,6 +344,17 @@ tempest.api.volume.test_volumes_snapshots.VolumesV2SnapshotTestJSON.test_snapsho
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]
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/functest/opnfv_tests/openstack/tempest/custom_tests/defcore_req.txt b/docker/smoke/platform.txt
index fbbee2ffc..4eca58790 100644
--- a/functest/opnfv_tests/openstack/tempest/custom_tests/defcore_req.txt
+++ b/docker/smoke/platform.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,116 @@ 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.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_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 +361,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 +391,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/testcases.yaml b/docker/smoke/testcases.yaml
index 5b1f56a9d..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: '^((?!odl_l3|odl-bgpvpn|gluon).)*$'
+ 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: '^((?!netvirt).)*$'
- 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:
+ 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:
- module: 'functest.opnfv_tests.openstack.tempest.tempest'
- class: 'TempestSmokeSerial'
+ name: tempest_common
+ args:
+ mode: "(?!.*test_autoscaling)(?!.*test_live)\
+ (^telemetry_tempest_plugin)"
+ services:
+ - aodh
+ - gnocchi
+ - panko
+ option:
+ - '--concurrency=4'
-
case_name: rally_sanity
@@ -64,88 +98,303 @@ tiers:
description: >-
This test case runs a sub group of tests of the OpenStack
Rally suite in smoke mode.
- dependencies:
- installer: ''
- scenario: ''
run:
- module: 'functest.opnfv_tests.openstack.rally.rally'
- class: 'RallySanity'
+ name: rally_sanity
+ args:
+ optional:
+ - 'gnocchi'
+ - 'barbican'
-
- case_name: refstack_defcore
+ case_name: refstack_compute
project_name: functest
criteria: 100
blocking: false
description: >-
This test case runs a sub group of tests of the OpenStack
- Defcore testcases by using refstack client.
+ Compute testcases.
dependencies:
- installer: ''
- scenario: ''
+ - NO_TENANT_NETWORK: '^(?![tT]rue$)'
run:
- module:
- 'functest.opnfv_tests.openstack.refstack_client.refstack_client'
- class: 'RefstackClient'
+ name: refstack
+ args:
+ target: compute
+ option:
+ - '--concurrency=4'
-
- case_name: odl
+ case_name: refstack_object
project_name: functest
criteria: 100
blocking: false
description: >-
- Test Suite for the OpenDaylight SDN Controller. It
- integrates some test suites from upstream using
- Robot as the test framework.
- dependencies:
- installer: ''
- scenario: 'odl'
+ This test case runs a sub group of tests of the OpenStack
+ Object testcases.
run:
- module: 'functest.opnfv_tests.sdn.odl.odl'
- class: 'ODLTests'
+ name: refstack
args:
- suites:
- - /src/odl_test/csit/suites/integration/basic
- - /src/odl_test/csit/suites/openstack/neutron
+ target: object
+ option:
+ - '--concurrency=4'
-
- case_name: odl_netvirt
+ case_name: refstack_platform
project_name: functest
criteria: 100
blocking: false
description: >-
- Test Suite for the OpenDaylight SDN Controller when
- the NetVirt features are installed. It integrates
- some test suites from upstream using Robot as the
- test framework.
+ This test case runs a sub group of tests of the OpenStack
+ Platform testcases.
dependencies:
- installer: 'apex'
- scenario: 'os-odl_l3-nofeature'
+ - NO_TENANT_NETWORK: '^(?![tT]rue$)'
run:
- module: 'functest.opnfv_tests.sdn.odl.odl'
- class: 'ODLTests'
+ name: refstack
args:
- suites:
- - /src/odl_test/csit/suites/integration/basic
- - /src/odl_test/csit/suites/openstack/neutron
- - /src/odl_test/csit/suites/openstack/connectivity
+ target: platform
+ option:
+ - '--concurrency=4'
-
- case_name: snaps_smoke
+ case_name: tempest_full
project_name: functest
criteria: 100
blocking: false
description: >-
- This test case contains tests that setup and destroy
- environments with VMs with and without Floating IPs
- with a newly created user and project. Set the config
- value snaps.use_floating_ips (True|False) to toggle
- this functionality. When the config value of
- snaps.use_keystone is True, functest must have access to
- the cloud's private network.
+ The list of test cases is generated by
+ Tempest automatically and depends on the parameters of
+ the OpenStack deployment.
+ https://github.com/openstack/tempest/blob/18.0.0/tox.ini#L83
+ run:
+ name: tempest_common
+ args:
+ mode: '(?!.*\[.*\bslow\b.*\])(^tempest\.api)'
+ option:
+ - '--concurrency=4'
- dependencies:
- installer: '^((?!netvirt).)*$'
- scenario: '^((?!lxd).)*$'
+ -
+ case_name: tempest_scenario
+ project_name: functest
+ criteria: 100
+ blocking: false
+ description: >-
+ The list of test cases is generated by
+ Tempest automatically and depends on the parameters of
+ the OpenStack deployment.
+ https://github.com/openstack/tempest/blob/18.0.0/tox.ini#L84
+ run:
+ 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.
+ run:
+ name: patrole
+ args:
+ roles: 'admin'
+ mode: "(?!.*test_unmanage_snapshot_rbac)\
+ (?!.*test_show_auto_allocated_topology)\
+ (?!.*test_delete_auto_allocated_topology)\
+ (?!.*test_create_network_provider_segmentation_id)\
+ (?!.*compute.test_floating_ips_rbac)\
+ (?!.*test_reset_network)\
+ (?!.*test_create_image_from_volume_backed_server)\
+ (?!.*test_network_ip_availability_rbac.NetworkIpAvailabilityExtRbacTest.test_get_network_ip_availabilities)\
+ (?!.*test_policy_bandwidth_limit_rule_rbac)\
+ (?!.*test_policy_minimum_bandwidth_rule_rbac)\
+ (?!.*test_group_type_specs)\
+ (?!.*test_groups_rbac.GroupTypesV3RbacTest.test_create_group_type)\
+ (?!.*test_groups_rbac.GroupTypesV3RbacTest.test_delete_group_type)\
+ (?!.*test_groups_rbac.GroupTypesV3RbacTest.test_update_group_type)\
+ (?!.*test_group_snapshots_rbac)\
+ (?!.*test_groups_rbac)\
+ (?!.*test_quota_classes_rbac)\
+ (?!.*test_server_misc_policy_actions_rbac.MiscPolicyActionsNetworkRbacTest.test_create_interface)\
+ (?!.*test_server_misc_policy_actions_rbac.MiscPolicyActionsNetworkRbacTest.test_delete_interface)\
+ (?!.*test_server_misc_policy_actions_rbac.MiscPolicyActionsNetworkRbacTest.test_show_interface)\
+ (?!.*test_user_messages_rbac)\
+ (?!.*test_volume_actions_rbac.VolumesActionsV310RbacTest)\
+ (?!.*test_volume_actions_rbac.VolumesActionsV312RbacTest)\
+ (?!.*test_volume_metadata_rbac.VolumeMetadataV3RbacTest.test_delete_volume_image_metadata)\
+ (?!.*test_volume_metadata_rbac.VolumeMetadataV3RbacTest.test_list_volumes_details_image_metadata)\
+ (?!.*test_volume_metadata_rbac.VolumeMetadataV3RbacTest.test_show_volume_details_image_metadata)\
+ (?!.*test_volume_metadata_rbac.VolumeMetadataV3RbacTest.test_update_volume_image_metadata)\
+ (?!.*test_volumes_backup_rbac.VolumesBackupsV318RbacTest)\
+ (?!.*test_volumes_backup_rbac.VolumesBackupsV39RbacTest)\
+ (?!.*test_volume_types_rbac)\
+ (?=.*[.*\bslow\b.*])\
+ (^patrole_tempest_plugin.tests.api.(compute|image|network|volume))"
+ option:
+ - '--concurrency=4'
+
+ -
+ case_name: patrole_member
+ project_name: functest
+ criteria: 100
+ blocking: false
+ description: >-
+ Test suite from Patrole project.
+ run:
+ name: patrole
+ args:
+ 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: patrole_reader
+ project_name: functest
+ criteria: 100
+ blocking: false
+ description: >-
+ Test suite from Patrole project.
run:
- module: 'functest.opnfv_tests.openstack.snaps.smoke'
- class: 'SnapsSmoke'
+ name: patrole
+ args:
+ roles: 'reader'
+ mode: "(?!.*test_unmanage_snapshot_rbac)\
+ (?!.*test_show_auto_allocated_topology)\
+ (?!.*test_delete_auto_allocated_topology)\
+ (?!.*test_create_network_provider_segmentation_id)\
+ (?!.*compute.test_floating_ips_rbac)\
+ (?!.*test_reset_network)\
+ (?!.*test_create_image_from_volume_backed_server)\
+ (?!.*test_network_ip_availability_rbac.NetworkIpAvailabilityExtRbacTest.test_get_network_ip_availabilities)\
+ (?!.*test_policy_bandwidth_limit_rule_rbac)\
+ (?!.*test_policy_minimum_bandwidth_rule_rbac)\
+ (?!.*test_group_type_specs)\
+ (?!.*test_groups_rbac.GroupTypesV3RbacTest.test_create_group_type)\
+ (?!.*test_groups_rbac.GroupTypesV3RbacTest.test_delete_group_type)\
+ (?!.*test_groups_rbac.GroupTypesV3RbacTest.test_update_group_type)\
+ (?!.*test_group_snapshots_rbac)\
+ (?!.*test_groups_rbac)\
+ (?!.*test_quota_classes_rbac)\
+ (?!.*test_server_misc_policy_actions_rbac.MiscPolicyActionsNetworkRbacTest.test_create_interface)\
+ (?!.*test_server_misc_policy_actions_rbac.MiscPolicyActionsNetworkRbacTest.test_delete_interface)\
+ (?!.*test_server_misc_policy_actions_rbac.MiscPolicyActionsNetworkRbacTest.test_show_interface)\
+ (?!.*test_user_messages_rbac)\
+ (?!.*test_volume_actions_rbac.VolumesActionsV310RbacTest)\
+ (?!.*test_volume_actions_rbac.VolumesActionsV312RbacTest)\
+ (?!.*test_volume_metadata_rbac.VolumeMetadataV3RbacTest.test_delete_volume_image_metadata)\
+ (?!.*test_volume_metadata_rbac.VolumeMetadataV3RbacTest.test_list_volumes_details_image_metadata)\
+ (?!.*test_volume_metadata_rbac.VolumeMetadataV3RbacTest.test_show_volume_details_image_metadata)\
+ (?!.*test_volume_metadata_rbac.VolumeMetadataV3RbacTest.test_update_volume_image_metadata)\
+ (?!.*test_volumes_backup_rbac.VolumesBackupsV318RbacTest)\
+ (?!.*test_volumes_backup_rbac.VolumesBackupsV39RbacTest)\
+ (?!.*test_volume_types_rbac)\
+ (?=.*[.*\bslow\b.*])\
+ (^patrole_tempest_plugin.tests.api.(compute|image|network|volume))"
+ option:
+ - '--concurrency=4'
+
+ -
+ case_name: 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:
+ name: barbican
+ args:
+ mode:
+ '^barbican_tempest_plugin.((?!test_signed_image_upload_boot_failure).)*$'
+ services:
+ - barbican
+ option:
+ - '--concurrency=4'
+
+ -
+ case_name: tempest_octavia
+ project_name: functest
+ criteria: 100
+ blocking: false
+ description: >-
+ It leverages on the tempest plugin containing tests used to
+ verify the functionality of an octavia installation.
+ run:
+ name: tempest_common
+ args:
+ mode: "(?!.*api.v2.test_availability_zone)\
+ (?!.*api.v2.test_availability_zone_profile)\
+ (?!.*api.v2.test_member.MemberAPITest.test_member_ipv4_create)\
+ (?!.*api.v2.test_member.MemberAPITest.test_member_ipv6_create)\
+ (^octavia_tempest_plugin.tests.(api|scenario))"
+ services:
+ - octavia
+ option:
+ - '--concurrency=2'
+
+ -
+ case_name: tempest_cyborg
+ project_name: functest
+ criteria: 100
+ blocking: false
+ description: >-
+ It leverages on the tempest plugin containing tests used to
+ verify the functionality of a cyborg installation.
+ run:
+ name: tempest_common
+ args:
+ mode: '^cyborg_tempest_plugin'
+ services:
+ - cyborg
+ option:
+ - '--concurrency=4'
diff --git a/docker/vnf/Dockerfile b/docker/vnf/Dockerfile
index 6d96d98a5..99f848fcd 100644
--- a/docker/vnf/Dockerfile
+++ b/docker/vnf/Dockerfile
@@ -1,25 +1,58 @@
FROM opnfv/functest-core
-ARG BRANCH=master
-ARG OPENSTACK_TAG=stable/pike
-ARG VIMS_TAG=stable
+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 && \
- (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/functest/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 417386b52..6b483af6a 100644
--- a/docker/vnf/testcases.yaml
+++ b/docker/vnf/testcases.yaml
@@ -2,73 +2,60 @@
tiers:
-
name: vnf
- order: 4
- ci_loop: '(daily)|(weekly)'
description: >-
Collection of VNF test cases.
testcases:
-
- case_name: cloudify_ims
+ case_name: cloudify
project_name: functest
- criteria: 80
+ criteria: 100
blocking: false
description: >-
- This test case deploys an OpenSource vIMS solution from
- Clearwater using the Cloudify orchestrator. It also runs
- some signaling traffic.
- dependencies:
- installer: ''
- scenario: 'os-nosdn-nofeature-ha'
+ This test case deploys the Cloudify orchestrator.
run:
- module: 'functest.opnfv_tests.vnf.ims.cloudify_ims'
- class: 'CloudifyIms'
-
+ name: cloudify
-
- case_name: vyos_vrouter
+ case_name: cloudify_ims
project_name: functest
criteria: 100
blocking: false
description: >-
- This test case is vRouter testing.
+ This test case deploys an OpenSource vIMS solution from
+ Clearwater using the Cloudify orchestrator. It also runs
+ some signaling traffic.
dependencies:
- installer: ''
- scenario: 'os-nosdn-nofeature-ha'
+ - NO_TENANT_NETWORK: '^(?![tT]rue$)'
run:
- module: 'functest.opnfv_tests.vnf.router.cloudify_vrouter'
- class: 'CloudifyVrouter'
+ name: cloudify_ims
-
- case_name: orchestra_openims
- project_name: orchestra
+ case_name: heat_ims
+ project_name: functest
criteria: 100
blocking: false
description: >-
- OpenIMS VNF deployment with Open Baton (Orchestra)
+ This test case deploys an OpenSource vIMS solution from
+ Clearwater using the OpenStack Heat orchestrator.
+ It also runs some signaling traffic.
dependencies:
- installer: 'daisy'
- scenario: 'os-nosdn-nofeature-ha'
+ - NO_TENANT_NETWORK: '^(?![tT]rue$)'
run:
- module: 'functest.opnfv_tests.vnf.ims.orchestra_openims'
- class: 'OpenImsVnf'
+ name: heat_ims
-
- case_name: orchestra_clearwaterims
- project_name: orchestra
+ case_name: vyos_vrouter
+ project_name: functest
criteria: 100
blocking: false
description: >-
- ClearwaterIMS VNF deployment with Open Baton (Orchestra)
+ This test case is vRouter testing.
dependencies:
- installer: 'daisy'
- scenario: 'os-nosdn-nofeature-ha'
+ - NO_TENANT_NETWORK: '^(?![tT]rue$)'
run:
- module:
- 'functest.opnfv_tests.vnf.ims.orchestra_clearwaterims'
- class: 'ClearwaterImsVnf'
+ name: vyos_vrouter
-
case_name: juju_epc
- enabled: true
project_name: functest
criteria: 100
blocking: false
@@ -76,8 +63,6 @@ tiers:
vEPC validation with Juju as VNF manager and ABoT as test
executor.
dependencies:
- installer: ''
- scenario: 'os-nosdn-nofeature-ha'
+ - NO_TENANT_NETWORK: '^(?![tT]rue$)'
run:
- module: 'functest.opnfv_tests.vnf.epc.juju_epc'
- class: 'JujuEpc'
+ name: juju_epc
diff --git a/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/gambiachallenges/gambia.md b/docs/com/pres/gambiachallenges/gambia.md
new file mode 100644
index 000000000..078ec61ce
--- /dev/null
+++ b/docs/com/pres/gambiachallenges/gambia.md
@@ -0,0 +1,79 @@
+# Functest Gambia, new challenges
+
+[Cédric Ollivier](mailto:cedric.ollivier@orange.com)
+
+2018/03/22
+
+
+
+## Gating
+
+
+### Our gating is very simple
+
+- today all test suites are run sequentially
+- all resources are not necessarily cleant until the next OpenStack deployment
+
+**It's fine for gating installers but not for verifying a production
+environment (e.g. multi users running the same testcase)**
+
+
+### Parallel and Live testing
+
+- all resources should be allocated in their own OpenStack projects (already
+ mostly the case)
+- no testcase should create singletons on resource attributes (name, ip, etc.)
+- all resources have to be cleant at the end
+
+**According to [Orange testing results](https://wiki.opnfv.org/pages/viewpage.action?pageId=13211751),
+Functest is already in a good shape to meet this goal**
+
+
+
+## Quality Assurance
+
+**Gambia release will match the OpenStack Quality Golden rules**
+
+
+### Pylint and coverage (started from E release)
+- 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**
+
+
+### releasing
+
+- Functest could be also released as a classical Python package (
+[PyPI](https://pypi.python.org/pypi))
+- its API docs could be published in [Read the Docs](https://readthedocs.org/)
+
+
+### Current technical debt
+- former python modules (e.g. cli) or containers (e.g. restapi) have to be
+removed
+- functest shouldn't contain any OPNFV Installer logic. **All Jenkins Jobs
+must set the right env vars as all endusers**
+- vnf descriptors should be hosted by Functest instead of using external github
+repositories
+
+
+
+## other challenges
+
+
+### proposals
+
+- ease integrating tempest plugins with a minimum effort (new tempest driver in
+Functest Framework and new opnfv/functest-tempest container)
+- add opnfv/functest-components in verify jobs
+- why not leveraging on OpenStack middlewares such as
+ [oslo.config](https://docs.openstack.org/oslo.config/latest/) or
+ [stevedore](https://docs.openstack.org/stevedore/latest/)?
+
+**Any new testcase is more than welcome!**
+
+
+
+## Thank you
diff --git a/docs/com/pres/gambiachallenges/index.html b/docs/com/pres/gambiachallenges/index.html
new file mode 100644
index 000000000..592ccf2f5
--- /dev/null
+++ b/docs/com/pres/gambiachallenges/index.html
@@ -0,0 +1,52 @@
+<html>
+<head>
+<title>Gambia challenges</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/gates/gates.md b/docs/com/pres/gates/gates.md
new file mode 100644
index 000000000..aaf087743
--- /dev/null
+++ b/docs/com/pres/gates/gates.md
@@ -0,0 +1,82 @@
+# Functest Gates
+
+[Cédric Ollivier](mailto:cedric.ollivier@orange.com)
+
+2018/04/19
+
+
+
+### Why gating?
+
+- maintain an overall high quality code whatever the skills involved in our
+open community
+- detect the errors as soon as possible (before merge operations)
+- verify automatically most of Functest milestones
+
+
+### Today's Verify -1
+
+- one error is detected by yamllint, pylint or doc8
+- one unit test fails (py27 and py35)
+- our Framework is not fully covered
+- specific modules are not rated 10/10 by pylint
+- 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
+
+
+### Gambia's Verify -1
+
+- enforce an overall 10/10 by pylint
+- check the full coverage of all third-party interfaces
+- integrate other linters like ShellScript (if they meet tox basics)
+
+Please see
+[Gambia Challenges](http://testresults.opnfv.org/functest/gambiachallenges/)
+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)
+
+
+### reference platform
+
+- it could be baremetal or virtual if all testcases (including all VNFs) can
+be tested successfully
+- any compliant Installer could be selected as long as the appropriate target
+VIM version is proposed at the beginning of the release:
+ - devstack (OpenStack gates)
+ - kolla-ansible (Orange ONAP OpenLab)
+ - XCI
+ - APEX
+
+
+### Verify +2
+
+Only the functional check will take hours once the patchset is accepted
+by core reviewers (each patchset will be verified in ~10 minutes).
+
+**Always stable!**
+
+
+
+## Thank you!
diff --git a/docs/com/pres/gates/index.html b/docs/com/pres/gates/index.html
new file mode 100644
index 000000000..b64e371f7
--- /dev/null
+++ b/docs/com/pres/gates/index.html
@@ -0,0 +1,52 @@
+<html>
+<head>
+<title>Functest Gates</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="gates.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/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/conf.py b/docs/conf.py
new file mode 100644
index 000000000..7a8d1858d
--- /dev/null
+++ b/docs/conf.py
@@ -0,0 +1,179 @@
+# -*- coding: utf-8 -*-
+#
+# 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.
+#
+# 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('.'))
+
+# -- 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'
+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 = '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 = {}
+
+# Add any paths that contain custom themes here, relative to this directory.
+# 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 = 'Functestdoc'
+
+
+# -- 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,
+ 'Functest.tex',
+ u'Functest 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,
+ 'functest',
+ u'Functest 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,
+ 'Functest',
+ u'Functest Documentation',
+ author,
+ '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/functest-release.rst b/docs/release/release-notes/functest-release.rst
index 78ec8f227..b5e228caa 100644
--- a/docs/release/release-notes/functest-release.rst
+++ b/docs/release/release-notes/functest-release.rst
@@ -1,83 +1,92 @@
-.. This work is licensed under a Creative Commons Attribution 4.0 International License.
.. SPDX-License-Identifier: CC-BY-4.0
-=======
-License
-=======
-
-OPNFV Euphrates release note for Functest Docs
-are licensed under a Creative Commons Attribution 4.0 International License.
-You should have received a copy of the license along with this.
-If not, see <http://creativecommons.org/licenses/by/4.0/>.
-
-=============================================
-OPNFV Euphrates 5.1 release note for Functest
-=============================================
+======================================
+OPNFV master release note for Functest
+======================================
Abstract
========
This document contains the release notes of the Functest project.
-
-OPNFV Euphrates Release
-======================
+OPNFV master Release
+====================
Functest deals with functional testing of the OPNFV solution.
It includes test cases developed within the project, test cases developed in
-other OPNFV projects and it also intgrates test cases from other upstream
+other OPNFV projects and it also integrates test cases from other upstream
communities.
+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
- * refstack_defcore
- * snaps_smoke
- * rally_sanity
+ * cinder_test
+ * tempest_smoke
+ * tempest_horizon
* odl
- * 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:
+Kubernetes
+----------
- * barometer
- * bgpvpn
- * doctor
- * domino
- * fds
- * odl-sfc
- * odl-netvirt
- * parser
- * promise
- * orchestra_openims
- * orchestra_clearwaterims
+The internal test cases are:
+ * k8s_quick
+ * k8s_smoke
+ * k8s_conformance
+ * xrally_kubernetes
+ * kube_hunter
+ * kube_bench_master
+ * kube_bench_node
+ * xrally_kubernetes_full
+ * k8s_vims
+ * helm_vims
+ * cnf_conformance
Release Data
============
+--------------------------------------+--------------------------------------+
| **Project** | functest |
-| | |
-+--------------------------------------+--------------------------------------+
-| **Repo/tag** | opnfv-5.1.0 |
-| | |
+--------------------------------------+--------------------------------------+
-| **Release designation** | Euphrates 5.1 release |
-| | |
-+--------------------------------------+--------------------------------------+
-| **Release date** | December 15th 2017 |
-| | |
-+--------------------------------------+--------------------------------------+
-| **Purpose of the delivery** | Euphrates second release |
-| | |
+| **Repository branch** | master |
+--------------------------------------+--------------------------------------+
Deliverables
@@ -86,164 +95,66 @@ Deliverables
Software
--------
- Functest Docker images:
+ Functest Docker images (OpenStack):
* 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-restapi
+ * https://hub.docker.com/r/opnfv/functest-smoke-cntt
+ * https://hub.docker.com/r/opnfv/functest-benchmarking-cntt
- TestAPI Docker image:
+ Functest Docker images (Kubernetes):
- * https://hub.docker.com/r/opnfv/testapi
+ * 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-security
+ * https://hub.docker.com/r/opnfv/functest-kubernetes-benchmarking
+ * https://hub.docker.com/r/opnfv/functest-kubernetes-cnf
-Docker tag for Euphrates 5.1 release: opnfv-5.1.0
-Docker tag for Euphrates with latest bugfixes: euphrates
+Docker tag for master: latest
Documents
---------
- - Installation/configuration guide: http://docs.opnfv.org/en/stable-euphrates/submodules/functest/docs/testing/user/configguide/index.html
-
- - User Guide: http://docs.opnfv.org/en/stable-euphrates/submodules/functest/docs/testing/user/userguide/index.html
-
- - Developer Guide: http://docs.opnfv.org/en/stable-euphrates/submodules/functest/docs/testing/developer/devguide/index.html
-
- - API Docs: http://artifacts.opnfv.org/functest/docs/index.html
-
- - Functest Framework presentation: http://testresults.opnfv.org/functest/framework/index.html
-
+ * Functest Guides: https://functest.readthedocs.io/en/latest/
+ * API Docs: https://functest-api.readthedocs.io/en/latest/
Version change
==============
-Functest now delivers light-weigth Docker images based on Alpine 3.7. The test cases are grouped into several categories
-or tiers and must be run from the corresponding container. For example, to run the test case healthcheck, the image
-opnfv/functest-healthcheck shall be used. The tiers and the tests within them are explained in detail in the User Guide.
-
-The former Ubuntu image is not longer maintained.
-
-The Parser test case has its own dedicated Docker image since it requires libraries released for OpenStack Pike and
-Euphrates is based on Ocata.
-
-The Docker images do not contain OS images (Cirros, Ubuntu, Centos, ..) anymore. A script has been created under the
-ci directory (download_images.sh) which contains all the needed images for all the tests. This file can be modified by
-the user since not all the images might be used. It must be executed before starting Functest and attach the needed
-images as a Docker volume. See Configuration Guide for more information.
-
-The requirements have been split into 3 files:
- * requirements.txt : lists all abstract dependencies of the OPNFV packages
- * test-requirements.txt : lists all abstract dependencies required by Functest Unit Tests
- * upper-constraints.txt : lists all concrete upstream dependencies required by Functest Docker container
-
-OPNFV (test-)requirements.txt have been updated according to stable/ocata global-requirements.txt.
-Functest uses (and completes) stable/ocata upper-constraints.txt in Dockerfiles and tox configuration.
-The project relies on pbr, which injects requirements into the install_requires, tests_require and/or dependency_links
-arguments to setup. It also supports conditional dependencies which can be added to the requirements (e.g. dnspython>=1.14.0;python_version=='2.7')
-
-The way to manage logging has been centralized to a configuration file (logging.ini) which might be modified by the user.
-By default, the output of executing the test cases is redirected to log files and is not displayed on the console, only result
-messages and summary tables are displayed.
-
-The framework has been refactored and all the test cases inherit from a core class TestCase. For Feature projects who develop
-test cases, 2 sub-classes have been created:
- - Feature: it implements all the needed functions and the developer must only overwrite the method "execute" (e.g. Barometer)
- - BashFeature: it is used if the third party test case is a shell script. This way, the execution command must be specified in
- testcases.yaml as the argument (e.g. Domino, Doctor)
+Key changes
+-----------
-An internal REST 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.
+ * update testcases and containers to `OpenStack master`_ and to
+ `Kubernetes master`_
-Euphrates 5.1 improvements
-==========================
+.. _`OpenStack master`: https://github.com/openstack/requirements/blob/master/upper-constraints.txt
+.. _`Kubernetes master`: https://github.com/kubernetes/kubernetes
-* Alpine images are now supported for ARM (arm64).
-* Added Vyos_router test case.
-* Updated of Rally 0.9.1 and fixed some bugs in cinder scenarios.
-* Patch to allow building containers from a gerrit change.
-* Selection of a subset of SNAPS test cases.
-* Reorder VNF test cases and adjust timeouts in VNFs.
+Key benefits
+------------
+ * 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
+.. _`Functest toolchains`: https://github.com/collivier/ansible-role-xtesting
+.. _`Raspberry PI`: https://github.com/opnfv/functest/blob/master/PI.md
-Euphrates 5.1 known restrictions/issues
-=======================================
-+--------------+-----------+----------------------------------------------+
-| Installer | Scenario | Issue |
-+==============+===========+==============================================+
-| fuel@aarch64 | any | VNF tier not supported yet. |
-+--------------+-----------+----------------------------------------------+
-| | | The test cases belonging to the VNF tier |
-| any | any | have been only tested on os-nosdn-nofeature |
-| | | scenarios and baremetal deployments. |
-+--------------+-----------+----------------------------------------------+
-| Joid | k8 | Functest does not offer test suites for |
-| Compass | | Kubernetes scenarios yet. |
-+--------------+-----------+----------------------------------------------+
-
-
-Test and installer/scenario dependencies
-========================================
-
-It is not always possible to run all the test cases on all the scenarios.
-The scenario dependencies (installer or scenario) are detailed
-in the different testcases.yaml for each tier:
-
- * https://git.opnfv.org/functest/tree/docker/healthcheck/testcases.yaml?h=stable/euphrates
- * https://git.opnfv.org/functest/tree/docker/smoke/testcases.yaml?h=stable/euphrates
- * https://git.opnfv.org/functest/tree/docker/features/testcases.yaml?h=stable/euphrates
- * https://git.opnfv.org/functest/tree/docker/components/testcases.yaml?h=stable/euphrates
- * https://git.opnfv.org/functest/tree/docker/vnf/testcases.yaml?h=stable/euphrates
- * https://git.opnfv.org/functest/tree/docker/parser/testcases.yaml?h=stable/euphrates
-
-
-Test results
-============
-
-The Functest scenario status on December 15, 2017 can be seen on
-http://testresults.opnfv.org/functest/euphrates/
-
-Test logs are available in:
-
- - test results logs from CI: http://artifacts.opnfv.org (within different directories 'logs_functest_X')
-
- - jenkins logs on CI: https://build.opnfv.org/ci/view/functest/
-
- - jenkins logs on ARM CI: https://build.opnfv.org/ci/view/armband/
-
-
-
-Open JIRA tickets
-=================
-
-+------------------+-----------------------------------------------+
-| JIRA | Description |
-+==================+===============================================+
-| | |
-| | |
-+------------------+-----------------------------------------------+
-
-All the tickets that are not blocking have been fixed or postponed
-the next release.
+Code quality
+------------
+ * pylint: 10.00/10
+ * code coverage: 70%
Useful links
============
- - wiki project page: https://wiki.opnfv.org/opnfv_functional_testing
-
- - wiki Functest Euphrates page: https://wiki.opnfv.org/display/functest/5.+Euphrates
-
- - Functest repo: https://git.opnfv.org/cgit/functest
-
- - Functest CI dashboard: https://build.opnfv.org/ci/view/functest/
-
- - JIRA dashboard: https://jira.opnfv.org/secure/Dashboard.jspa?selectPageId=10611
-
- - Functest IRC chan: #opnfv-functest
-
- - Reporting page: http://testresults.opnfv.org/reporting/euphrates.html
+ * 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 411e09bdf..25c2cbdfb 100644
--- a/docs/release/release-notes/index.rst
+++ b/docs/release/release-notes/index.rst
@@ -1,4 +1,3 @@
-.. This work is licensed under a Creative Commons Attribution 4.0 International License.
.. SPDX-License-Identifier: CC-BY-4.0
.. _functest-releasenotes:
@@ -8,13 +7,6 @@ Functest Release Notes
**********************
.. toctree::
- :numbered:
:maxdepth: 4
functest-release.rst
-
-Revision: _sha1_
-
-:Author: Jose Lausuch (jalausuch@suse.com)
-
-Build date: |today|
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/index.rst b/docs/testing/developer/devguide/index.rst
index 19a1bdcb8..da5485ef0 100644
--- a/docs/testing/developer/devguide/index.rst
+++ b/docs/testing/developer/devguide/index.rst
@@ -1,4 +1,3 @@
-.. This work is licensed under a Creative Commons Attribution 4.0 International License.
.. SPDX-License-Identifier: CC-BY-4.0
************************
@@ -6,7 +5,6 @@ Functest Developer Guide
************************
.. toctree::
- :numbered:
:maxdepth: 2
============
@@ -54,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
@@ -84,17 +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
- * odl_netvirt
* 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
@@ -108,59 +100,22 @@ The structure of this repository is detailed in `[1]`_.
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_netvirt, odl_fds
- * openstack: api_check, connection_check, snaps_health_check, vping_ssh, vping_userdata, tempest_*, rally_*
+ * sdn: odl, odl_fds
+ * 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.
-
+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 framework
==================
Functest is a framework.
-Historically Functest is released as a docker file, including tools, scripts and
-a CLI to prepare the environment and run tests.
-It simplifies the integration of external test suites in CI pipeline and provide
-commodity tools to collect and display results.
+Historically Functest is released as a docker file, including tools, scripts
+and a CLI to prepare the environment and run tests.
+It simplifies the integration of external test suites in CI pipeline and
+provide commodity tools to collect and display results.
Since Colorado, test categories also known as **tiers** have been created to
group similar tests, provide consistent sub-lists and at the end optimize
@@ -171,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
@@ -214,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
=====================
@@ -250,8 +176,8 @@ In order to simplify the creation of test cases, Functest develops also some
functions that are used by internal test cases.
Several features are supported such as logger, configuration management and
Openstack capabilities (tacker,..).
-These functions can be found under <repo>/functest/utils and can be described as
-follows::
+These functions can be found under <repo>/functest/utils and can be described
+as follows::
functest/utils/
|-- config.py
@@ -262,14 +188,11 @@ 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
@@ -281,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
==========
@@ -300,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/index.rst b/docs/testing/developer/internship/security_group/index.rst
deleted file mode 100644
index d1cdbdd8f..000000000
--- a/docs/testing/developer/internship/security_group/index.rst
+++ /dev/null
@@ -1,70 +0,0 @@
-=======
-License
-=======
-
-Functest Docs are licensed under a Creative Commons Attribution 4.0
-International License.
-You should have received a copy of the license along with this.
-If not, see <http://creativecommons.org/licenses/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 3038d0ac6..000000000
--- a/docs/testing/developer/internship/testapi_evolution/index.rst
+++ /dev/null
@@ -1,237 +0,0 @@
-=======
-License
-=======
-
-Functest Docs are licensed under a Creative Commons Attribution 4.0
-International License.
-You should have received a copy of the license along with this.
-If not, see <http://creativecommons.org/licenses/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/index.rst b/docs/testing/developer/internship/unit_tests/index.rst
deleted file mode 100644
index a117c8609..000000000
--- a/docs/testing/developer/internship/unit_tests/index.rst
+++ /dev/null
@@ -1,126 +0,0 @@
-=======
-License
-=======
-
-Functest Docs are licensed under a Creative Commons Attribution 4.0
-International License.
-You should have received a copy of the license along with this.
-If not, see <http://creativecommons.org/licenses/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/index.rst b/docs/testing/developer/internship/vnf_catalog/index.rst
deleted file mode 100644
index df7633391..000000000
--- a/docs/testing/developer/internship/vnf_catalog/index.rst
+++ /dev/null
@@ -1,170 +0,0 @@
-=======
-License
-=======
-
-Functest Docs are licensed under a Creative Commons Attribution 4.0
-International License.
-You should have received a copy of the license along with this.
-If not, see <http://creativecommons.org/licenses/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 f3901d867..000000000
--- a/docs/testing/user/configguide/ci.rst
+++ /dev/null
@@ -1,13 +0,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/configguide.rst b/docs/testing/user/configguide/configguide.rst
index d63286475..47c25adb1 100644
--- a/docs/testing/user/configguide/configguide.rst
+++ b/docs/testing/user/configguide/configguide.rst
@@ -1,4 +1,3 @@
-.. This work is licensed under a Creative Commons Attribution 4.0 International License.
.. SPDX-License-Identifier: CC-BY-4.0
Installation and configuration
@@ -10,201 +9,348 @@ the refactoring on dependency management should allow the creation of light and
fully customized docker images.
-Functest Dockers
-----------------
+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
- * opnfv/functest-restapi
-
-The tag "opnfv-5.0.0" is the official release image in Euphrates, but you can also pull "euphrates"
-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
---------------------------
+^^^^^^^^^^^^^^^^^^^^^^^^^^
cat env::
- INSTALLER_TYPE=XXX
- INSTALLER_IP=XXX
- EXTERNAL_NETWORK=XXX
- DEPLOY_SCENARIO=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.
-cat openstack.creds::
+cat env_file::
export OS_AUTH_URL=XXX
export OS_USER_DOMAIN_NAME=XXX
export OS_PROJECT_DOMAIN_NAME=XXX
export OS_USERNAME=XXX
- export OS_TENANT_NAME=XXX
export OS_PROJECT_NAME=XXX
export OS_PASSWORD=XXX
- export OS_VOLUME_API_VERSION=XXX
- export OS_IDENTITY_API_VERSION=XXX
- export OS_IMAGE_API_VERSION=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/euphrates | 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
- images/img
- images/trusty-server-cloudimg-amd64-disk1.img
+ 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
---------------------------
+^^^^^^^^^^^^^^^^^^^^^^^^^
Run healthcheck suite::
sudo docker run --env-file env \
- -v $(pwd)/openstack.creds:/home/opnfv/functest/conf/openstack.creds \
- -v $(pwd)/images:/home/opnfv/functest/images \
+ -v $(pwd)/openstack.creds:/home/opnfv/functest/conf/env_file \
+ -v $(pwd)/images:/home/opnfv/functest/images \
opnfv/functest-healthcheck
Results shall be displayed as follows::
- +----------------------------+------------------+---------------------+------------------+----------------+
- | TEST CASE | PROJECT | TIER | DURATION | RESULT |
- +----------------------------+------------------+---------------------+------------------+----------------+
- | connection_check | functest | healthcheck | 00:02 | PASS |
- | api_check | functest | healthcheck | 04:57 | PASS |
- | snaps_health_check | functest | healthcheck | 00:51 | 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
--------------------
+^^^^^^^^^^^^^^^^^^^
Run smoke suite::
sudo docker run --env-file env \
- -v $(pwd)/openstack.creds:/home/opnfv/functest/conf/openstack.creds \
- -v $(pwd)/images:/home/opnfv/functest/images \
+ -v $(pwd)/openstack.creds:/home/opnfv/functest/conf/env_file \
+ -v $(pwd)/images:/home/opnfv/functest/images \
opnfv/functest-smoke
Results shall be displayed as follows::
- +------------------------------+------------------+---------------+------------------+----------------+
- | TEST CASE | PROJECT | TIER | DURATION | RESULT |
- +------------------------------+------------------+---------------+------------------+----------------+
- | vping_ssh | functest | smoke | 01:19 | PASS |
- | vping_userdata | functest | smoke | 01:56 | PASS |
- | tempest_smoke_serial | functest | smoke | 26:30 | PASS |
- | rally_sanity | functest | smoke | 19:42 | PASS |
- | refstack_defcore | functest | smoke | 22:00 | PASS |
- | snaps_smoke | functest | smoke | 41:14 | PASS |
- | odl | functest | smoke | 00:16 | PASS |
- | odl_netvirt | functest | smoke | 00:00 | SKIP |
- | fds | 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
-----------------------
-
-Run 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 smoke-cntt suite::
sudo docker run --env-file env \
- -v $(pwd)/openstack.creds:/home/opnfv/functest/conf/openstack.creds \
- -v $(pwd)/images:/home/opnfv/functest/images \
- opnfv/functest-features
+ -v $(pwd)/openstack.creds:/home/opnfv/functest/conf/env_file \
+ -v $(pwd)/images:/home/opnfv/functest/images \
+ opnfv/functest-smoke-cntt
Results shall be displayed as follows::
- +---------------------------+--------------------------+------------------+------------------+----------------+
- | TEST CASE | PROJECT | TIER | DURATION | RESULT |
- +---------------------------+--------------------------+------------------+------------------+----------------+
- | promise | promise | features | 00:00 | SKIP |
- | bgpvpn | sdnvpn | features | 00:00 | SKIP |
- | security_scan | securityscanning | features | 00:00 | SKIP |
- | functest-odl-sfc | sfc | features | 00:00 | SKIP |
- | domino-multinode | domino | features | 00:00 | SKIP |
- | barometercollectd | barometer | features | 00:00 | SKIP |
- +---------------------------+--------------------------+------------------+------------------+----------------+
- Note: if the scenario does not support some tests, they are indicated as SKIP.
- See User guide for details.
+ +-------------------------------+------------------+---------------+------------------+----------------+
+ | 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 components suite
-------------------------
+Testing benchmarking suite
+^^^^^^^^^^^^^^^^^^^^^^^^^^
-Run components suite::
+Run benchmarking suite::
sudo docker run --env-file env \
- -v $(pwd)/openstack.creds:/home/opnfv/functest/conf/openstack.creds \
- -v $(pwd)/images:/home/opnfv/functest/images \
- opnfv/functest-components
+ -v $(pwd)/openstack.creds:/home/opnfv/functest/conf/env_file \
+ -v $(pwd)/images:/home/opnfv/functest/images \
+ opnfv/functest-benchmarking
Results shall be displayed as follows::
- +-------------------------------+------------------+--------------------+------------------+----------------+
- | TEST CASE | PROJECT | TIER | DURATION | RESULT |
- +-------------------------------+------------------+--------------------+------------------+----------------+
- | tempest_full_parallel | functest | components | 102:48 | PASS |
- | rally_full | functest | components | 160:58 | 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
------------------
+^^^^^^^^^^^^^^^^^
Run vnf suite::
-sudo docker run --env-file env \
- -v $(pwd)/openstack.creds:/home/opnfv/functest/conf/openstack.creds \
- -v $(pwd)/images:/home/opnfv/functest/images \
- opnfv/functest-vnf
+ 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
+
+Results shall be displayed as follows::
+
+ +----------------------+------------------+--------------+------------------+----------------+
+ | 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 |
+ +----------------------+------------------+--------------+------------------+----------------+
+
+Functest Dockers for Kubernetes deployment
+------------------------------------------
+Docker images are available on the dockerhub:
+
+ * 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::
+
+ DEPLOY_SCENARIO=k8s-XXX
+
+Testing healthcheck suite
+^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Run healthcheck suite::
+
+ sudo docker run -it --env-file env \
+ -v $(pwd)/config:/root/.kube/config \
+ opnfv/functest-kubernetes-healthcheck
+
+A config file in the current dir 'config' is also required, which should be
+volume mapped to ~/.kube/config inside kubernetes container.
+
+Results shall be displayed as follows::
+
+ +-------------------+------------------+---------------------+------------------+----------------+
+ | TEST CASE | PROJECT | TIER | DURATION | RESULT |
+ +-------------------+------------------+---------------------+------------------+----------------+
+ | k8s_quick | functest | healthcheck | 00:18 | PASS |
+ | k8s_smoke | functest | healthcheck | 01:14 | PASS |
+ +-------------------+------------------+---------------------+------------------+----------------+
+
+Testing smoke suite
+^^^^^^^^^^^^^^^^^^^
+
+Run smoke suite::
+
+ sudo docker run -it --env-file env \
+ -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 | 94:26 | PASS |
+ | xrally_kubernetes | functest | smoke | 13:05 | PASS |
+ +---------------------------+------------------+---------------+------------------+----------------+
+
+Testing security suite
+^^^^^^^^^^^^^^^^^^^^^^
+
+Run smoke suite::
+
+ sudo docker run -it --env-file env \
+ -v $(pwd)/config:/root/.kube/config \
+ opnfv/functest-kubernetes-security
+
+Results shall be displayed as follows::
+
+ +---------------------------+------------------+------------------+------------------+----------------+
+ | 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 |
- +---------------------------------+------------------+--------------+------------------+----------------+
- | cloudify_ims | functest | vnf | 21:25 | PASS |
- | orchestra_openims | functest | vnf | 11:02 | FAIL |
- | orchestra_clearwaterims | functest | vnf | 09:13 | FAIL |
- +---------------------------------+------------------+--------------+------------------+----------------+
+ +--------------------------------+------------------+----------------------+------------------+----------------+
+ | 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 may be required by some test cases like SFC or Barometer in order
-to access the installer node and the deployment.
+INSTALLER_IP is required by Barometer in order to access the installer node and
+the deployment.
The format for the DEPLOY_SCENARIO env variable can be described as follows:
* vim: (os|k8s) = OpenStack or Kubernetes
@@ -221,8 +367,8 @@ release note.
**NOTE:** The scenario name is mainly used to automatically detect
if a test suite is runnable or not (e.g. it will prevent ODL test suite to be
-run on 'nosdn' scenarios). If not set, Functest will try to run the default test
-cases that might not include SDN controller or a specific feature
+run on 'nosdn' scenarios). If not set, Functest will try to run the default
+test cases that might not include SDN controller or a specific feature.
**NOTE:** An HA scenario means that 3 OpenStack controller nodes are
deployed. It does not necessarily mean that the whole system is HA. See
@@ -234,9 +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>
- * CI_DEBUG = <DebugTraceValue>
+ * INSTALLER_TYPE=(apex|compass|daisy|fuel)
+ * NODE_NAME=<Test POD Name>
+ * BUILD_TAG=<Jenkins Build Tag>
where:
@@ -256,11 +402,6 @@ where:
which are independently pushed to the results database
from different Jenkins jobs.
DO NOT USE THIS OPTION IN MANUAL TEST SCENARIOS.
- * <DebugTraceValue> = "true" or "false"
- Default = "false", if not specified
- If "true" is specified, then additional debug trace
- text can be sent to the test results file / log files
- and also to the standard console output.
Openstack credentials
@@ -268,7 +409,7 @@ Openstack credentials
OpenStack credentials are mandatory and must be provided to Functest.
When running the command "functest env prepare", the framework will
automatically look for the Openstack credentials file
-"/home/opnfv/functest/conf/openstack.creds" and will exit with
+"/home/opnfv/functest/conf/env_file" and will exit with
error if it is not present or is empty.
There are 2 ways to provide that file:
@@ -276,7 +417,7 @@ There are 2 ways to provide that file:
* by using a Docker volume with -v option when creating the Docker container.
This is referred to in docker documentation as "Bind Mounting".
See the usage of this parameter in the following chapter.
- * or creating manually the file '/home/opnfv/functest/conf/openstack.creds'
+ * or creating manually the file '/home/opnfv/functest/conf/env_file'
inside the running container and pasting the credentials in it. Consult
your installer guide for further details. This is however not
instructed in this document.
@@ -317,194 +458,6 @@ be::
export OS_INSECURE=true
-Functest docker container directory structure
-=============================================
-Inside the Functest docker container, the following directory structure
-should now be in place::
-
- `--
- |- home
- | |-- opnfv
- | | `- functest
- | | |-- conf
- | | `-- results
- | `-- repos
- | `-- vnfs
- |- src
- | |-- tempest
- | |-- vims-test
- | |-- odl_test
- | `-- fds
- `- usr
- `- lib
- `- python2.7
- `- site-packages
- `- functest
- |-- ...
-
-Underneath the '/home/opnfv/functest' directory, the Functest docker container
-includes two main directories:
-
- * The **conf** directory stores configuration files (e.g. the
- OpenStack creds are stored in path '/home/opnfv/functest/conf/openstack.creds'),
- * the **results** directory stores some temporary result log files
-
-src and repos directories are used to host third party code used for the tests.
-
-The structure of functest repo can be described as follows::
-
- |-- INFO
- |-- LICENSE
- |-- api
- | `-- apidoc
- |-- build.sh
- |-- commons
- |-- docker
- | |-- components
- | |-- core
- | |-- features
- | |-- healthcheck
- | |-- smoke
- | |-- vnf
- | |-- parser
- | |-- restapi
- | |-- thirdparty-requirements.txt
- |-- docs
- | |-- com
- | |-- images
- | |-- release
- | | `-- release-notes
- | |-- results
- | | testing
- | | |-- developer
- | | `-- user
- | | |-- configguide
- | | `-- userguide
- `-- functest
- |-- api
- | |-- base.py
- | |-- server.py
- | |-- urls.py
- | |-- common
- | | |-- api_utils.py
- | | |-- thread.py
- | `-- resources
- | `-- v1
- | |-- creds.py
- | |-- envs.py
- | |-- testcases.py
- | |-- tiers.py
- | |-- tasks.py
- | `-- database
- | |-- db.py
- | `-- v1
- | |-- handlers.py
- | |-- models.py
- | `-- swagger
- |-- ci
- │   |-- check_deployment.py
- │   |-- config_aarch64_patch.yaml
- │   |-- config_functest.yaml
- │   |-- config_patch.yaml
- │   |-- download_images.sh
- │   |-- logging.ini
- │   |-- rally_aarch64_patch.conf
- │   |-- run_tests.py
- │   |-- testcases.yaml
- │   |-- tier_builder.py
- │   |-- tier_handler.py
- |-- cli
- │   |-- cli_base.py
- │   |-- commands
- │   │   |-- cli_env.py
- │   │   |-- cli_os.py
- │   │   |-- cli_testcase.py
- │   │   |-- cli_tier.py
- │   |-- functest-complete.sh
- |-- core
- │   |-- feature.py
- │   |-- robotframework.py
- │   |-- testcase.py
- │   |-- unit.py
- │   |-- vnf.py
- |-- energy
- │   |-- energy.py
- |-- opnfv_tests
- │   `-- openstack
- │      |-- rally
- │      |-- refstack_client
- │      |-- snaps
- │      |-- tempest
- │      |-- vping
- │   `-- sdn
- │   │   `-- odl
- │   `-- vnf
- │   |-- ims
- │   `-- router
- |-- tests
- │   `-- unit
- │   |-- ci
- │   |-- cli
- │   |-- core
- │   |-- energy
- │   |-- features
- │   |-- odl
- │   |-- openstack
- │   |-- opnfv_tests
- │   |-- test_utils.py
- │   |-- utils
- │   `-- vnf
- |-- utils
- | |-- config.py
- | |-- constants.py
- | |-- decorators.py
- | |-- env.py
- | |-- functest_utils.py
- | |-- functest_vacation.py
- | |-- openstack_clean.py
- | |-- openstack_tacker.py
- | `-- openstack_utils.py
- |-- requirements.txt
- |-- setup.cfg
- |-- setup.py
- |-- test-requirements.txt
- |-- tox.ini
- |-- upper-constraints.txt
-
- (Note: All *.pyc files removed from above list for brevity...)
-
-We may distinguish several directories, the first level has 5 directories:
-
-* **api**: This directory is dedicated to the API (framework) documentations.
-* **commons**: This directory is dedicated for storage of traffic profile or
- any other test inputs that could be reused by any test project.
-* **docker**: This directory includes the needed files and tools to
- build the Functest Docker images.
-* **docs**: This directory includes documentation: Release Notes,
- User Guide, Configuration Guide and Developer Guide.
-* **functest**: This directory contains all the code needed to run
- functest internal cases and OPNFV onboarded feature or VNF test cases.
-
-Functest directory has 7 sub-directories, which is located under
-/usr/lib/python2.7/site-packages/functest:
- * **api**: This directory is dedicated for the internal Functest API.
- * **ci**: This directory contains test structure definition files
- (e.g <filename>.yaml) and bash shell/python scripts used to
- configure and execute Functional tests. The test execution script
- can be executed under the control of Jenkins CI jobs.
- * **cli**: This directory holds the python based Functest CLI utility
- source code, which is based on the Python 'click' framework.
- * **core**: This directory holds the python based Functest core
- source code. Three abstraction classes have been created to ease
- the integration of internal, feature or vnf cases.
- * **opnfv_tests**: This directory includes the scripts required by
- Functest internal test cases and other feature projects test cases.
- * **tests**: This directory includes the functest unit tests.
- * **utils**: this directory holds Python source code for some general
- purpose helper utilities, which testers can also re-use in their
- own test code. See for an example the Openstack helper utility:
- 'openstack_utils.py'.
-
Logs
====
@@ -512,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/functest/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.
@@ -522,7 +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/functest
+/usr/lib/python3.8/site-packages/xtesting and
+/usr/lib/python3.8/site-packages/functest
Tips
@@ -580,7 +534,7 @@ and credentials are working as expected.
Once the credentials are there inside the container, they should be
sourced before running any Openstack commands::
- source /home/opnfv/functest/conf/openstack.creds
+ source /home/opnfv/functest/conf/env_file
After this, try to run any OpenStack command to see if you get any
output, for instance::
@@ -614,6 +568,8 @@ If the OpenStack command still does not show anything or complains
about connectivity issues, it could be due to an incorrect url given to
the OS_AUTH_URL environment variable. Check the deployment settings.
+.. _`Proxy support`:
+
Proxy support
-------------
If your Jumphost node is operating behind a http proxy, then there are
@@ -623,7 +579,7 @@ succeed:
#. Initial installation of docker engine First, try following the
official Docker documentation for Proxy settings. Some issues were
experienced on CentOS 7 based Jumphost. Some tips are documented
- in section: `Docker Installation on CentOS behind http proxy`_
+ in section: :ref:`Docker Installation on CentOS behind http proxy`
below.
If that is the case, make sure the resolv.conf and the needed
@@ -631,14 +587,14 @@ http_proxy and https_proxy environment variables, as well as the
'no_proxy' environment variable are set correctly::
# Make double sure that the 'no_proxy=...' line in the
- # 'openstack.creds' file is commented out first. Otherwise, the
+ # 'env_file' file is commented out first. Otherwise, the
# values set into the 'no_proxy' environment variable below will
# be ovewrwritten, each time the command
- # 'source ~/functest/conf/openstack.creds' is issued.
+ # 'source ~/functest/conf/env_file' is issued.
cd ~/functest/conf/
- sed -i 's/export no_proxy/#export no_proxy/' openstack.creds
- source ./openstack.creds
+ sed -i 's/export no_proxy/#export no_proxy/' env_file
+ source ./env_file
# Next calculate some IP addresses for which http_proxy
# usage should be excluded:
@@ -669,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"
.
@@ -686,6 +642,8 @@ commands might not work. You can use the **curl** command instead.
(Ignore the content. If command returns a valid HTML page, it proves
the connection.)
+.. _`Docker Installation on CentOS behind http proxy`:
+
Docker Installation on CentOS behind http proxy
-----------------------------------------------
This section is applicable for CentOS family OS on Jumphost which
@@ -725,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` http://download.cirros-cloud.net/0.4.0/cirros-0.4.0-x86_64-disk.img
-.. _`images/cirros-0.4.0-x86_64-disk.img` https://cloud-images.ubuntu.com/releases/14.04/release/ubuntu-14.04-server-cloudimg-amd64-disk1.img
-.. _`images/ubuntu-14.04-server-cloudimg-amd64-disk1.img` https://cloud.centos.org/centos/7/images/CentOS-7-x86_64-GenericCloud.qcow2
+.. _`images/CentOS-7-x86_64-GenericCloud.qcow2`: https://cloud.centos.org/centos/7/images/CentOS-7-x86_64-GenericCloud.qcow2
+.. _`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 fd997344b..e5963435e 100644
--- a/docs/testing/user/configguide/index.rst
+++ b/docs/testing/user/configguide/index.rst
@@ -1,130 +1,22 @@
-.. This work is licensed under a Creative Commons Attribution 4.0 International License.
-.. http://creativecommons.org/licenses/by/4.0
+.. SPDX-License-Identifier: CC-BY-4.0
+.. _functest-install-guide:
***************************
Functest Installation Guide
***************************
.. toctree::
- :numbered:
:maxdepth: 2
-
-Introduction
-============
-This document describes how to install and configure Functest in OPNFV.
-
-High level architecture
------------------------
-
-The high level architecture of Functest within OPNFV can be described as
-follows::
-
- CIMC/Lights+out management Admin Mgmt/API Public Storage Private
- PXE
- + + + + + +
- | | | | | |
- | +----------------------------+ | | | | |
- | | | | | | | |
- +-----+ Jumphost | | | | | |
- | | | | | | | |
- | | +--------------------+ | | | | | |
- | | | | | | | | | |
- | | | Tools | +----------------+ | | |
- | | | - Rally | | | | | | |
- | | | - Robot | | | | | | |
- | | | - RefStack | | | | | | |
- | | | | |-------------------------+ | |
- | | | Testcases | | | | | | |
- | | | - VIM | | | | | | |
- | | | | | | | | | |
- | | | - SDN Controller | | | | | | |
- | | | | | | | | | |
- | | | - Features | | | | | | |
- | | | | | | | | | |
- | | | - VNF | | | | | | |
- | | | | | | | | | |
- | | +--------------------+ | | | | | |
- | | Functest Docker + | | | | |
- | | | | | | | |
- | | | | | | | |
- | | | | | | | |
- | +----------------------------+ | | | | |
- | | | | | |
- | +----------------+ | | | | |
- | | 1 | | | | | |
- +----+ +--------------+-+ | | | | |
- | | | 2 | | | | | |
- | | | +--------------+-+ | | | | |
- | | | | 3 | | | | | |
- | | | | +--------------+-+ | | | | |
- | | | | | 4 | | | | | |
- | +-+ | | +--------------+-+ | | | | |
- | | | | | 5 +-------------+ | | | |
- | +-+ | | nodes for | | | | | |
- | | | | deploying +---------------------+ | | |
- | +-+ | OPNFV | | | | | |
- | | | +------------------------------+ | |
- | +-+ SUT | | | | | |
- | | +--------------------------------------+ |
- | | | | | | | |
- | | +----------------------------------------------+
- | +----------------+ | | | | |
- | | | | | |
- + + + + + +
- 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.
-
-The automated mechanisms inside the Functest Docker containers will:
-
- * Prepare the environment according to the System Under Test (SUT)
- * Perform the appropriate functional tests
- * Push the test results into the OPNFV test result database (optional)
-
-The OpenStack credentials file must be provided to the container.
-
-These Docker images can be integrated into CI or deployed independently.
-
-Please note that the Functest Docker images have been designed for OPNFV,
-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 Guide `[2]`_
-
-.. include:: ./prerequisites.rst
-
-.. include:: ./configguide.rst
-
-.. include:: ./ci.rst
-
+ intro.rst
+ prerequisites.rst
+ configguide.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
new file mode 100644
index 000000000..02329995c
--- /dev/null
+++ b/docs/testing/user/configguide/intro.rst
@@ -0,0 +1,86 @@
+.. SPDX-License-Identifier: CC-BY-4.0
+
+Introduction
+============
+This document describes how to install and configure Functest in OPNFV.
+
+High level architecture
+-----------------------
+
+The high level architecture of Functest within OPNFV can be described as
+follows::
+
+ CIMC/Lights+out management Admin Mgmt/API Public Storage Private
+ PXE
+ + + + + + +
+ | | | | | |
+ | +----------------------------+ | | | | |
+ | | | | | | | |
+ +-----+ Jumphost | | | | | |
+ | | | | | | | |
+ | | +--------------------+ | | | | | |
+ | | | | | | | | | |
+ | | | Tools | +----------------+ | | |
+ | | | - Rally | | | | | | |
+ | | | - Robot | | | | | | |
+ | | | - RefStack | | | | | | |
+ | | | | |-------------------------+ | |
+ | | | Testcases | | | | | | |
+ | | | - VIM | | | | | | |
+ | | | | | | | | | |
+ | | | - SDN Controller | | | | | | |
+ | | | | | | | | | |
+ | | | - Features | | | | | | |
+ | | | | | | | | | |
+ | | | - VNF | | | | | | |
+ | | | | | | | | | |
+ | | +--------------------+ | | | | | |
+ | | Functest Docker + | | | | |
+ | | | | | | | |
+ | | | | | | | |
+ | | | | | | | |
+ | +----------------------------+ | | | | |
+ | | | | | |
+ | +----------------+ | | | | |
+ | | 1 | | | | | |
+ +----+ +--------------+-+ | | | | |
+ | | | 2 | | | | | |
+ | | | +--------------+-+ | | | | |
+ | | | | 3 | | | | | |
+ | | | | +--------------+-+ | | | | |
+ | | | | | 4 | | | | | |
+ | +-+ | | +--------------+-+ | | | | |
+ | | | | | 5 +-------------+ | | | |
+ | +-+ | | nodes for | | | | | |
+ | | | | deploying +---------------------+ | | |
+ | +-+ | OPNFV | | | | | |
+ | | | +------------------------------+ | |
+ | +-+ SUT | | | | | |
+ | | +--------------------------------------+ |
+ | | | | | | | |
+ | | +----------------------------------------------+
+ | +----------------+ | | | | |
+ | | | | | |
+ + + + + + +
+ SUT = System Under Test
+
+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.
+
+The automated mechanisms inside the Functest Docker containers will:
+
+ * Prepare the environment according to the System Under Test (SUT)
+ * Perform the appropriate functional tests
+ * Push the test results into the OPNFV test result database (optional)
+
+The OpenStack credentials file must be provided to the container.
+
+These Docker images can be integrated into CI or deployed independently.
+
+Please note that the Functest Docker images have been designed for OPNFV,
+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 :ref:`functest-userguide`
diff --git a/docs/testing/user/configguide/prerequisites.rst b/docs/testing/user/configguide/prerequisites.rst
index 8289803bb..dab4a9e6b 100644
--- a/docs/testing/user/configguide/prerequisites.rst
+++ b/docs/testing/user/configguide/prerequisites.rst
@@ -1,7 +1,9 @@
+.. SPDX-License-Identifier: CC-BY-4.0
+
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:
@@ -12,12 +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
@@ -29,7 +25,7 @@ deployment has been triggered previously, but it could be any server
with proper connectivity to the SUT.
NOTE: If your Jumphost is operating behind a company http proxy and/or
-firewall, please consult first the section `Proxy Support`_, towards
+firewall, please consult first the section :ref:`Proxy support`, towards
the end of this document. The section details some tips/tricks which
*may* be of help in a proxified environment.
@@ -44,8 +40,8 @@ commands below are offered as a short reference.
*Tip:* For running docker containers behind the proxy, you need first
some extra configuration which is described in section
-`Docker Installation on CentOS behind http proxy`_. You should follow
-that section before installing the docker engine.
+:ref:`Docker Installation on CentOS behind http proxy`. You should follow that
+section before installing the docker engine.
Docker installation needs to be done as root user. You may use other
userid's to create and run the actual containers later if so desired.
@@ -96,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/index.rst b/docs/testing/user/userguide/index.rst
index 66dfd3e7b..1e73cd622 100644
--- a/docs/testing/user/userguide/index.rst
+++ b/docs/testing/user/userguide/index.rst
@@ -1,8 +1,7 @@
-.. _functest-userguide:
-
-.. This work is licensed under a Creative Commons Attribution 4.0 International License.
.. SPDX-License-Identifier: CC-BY-4.0
+.. _functest-userguide:
+
*******************
Functest User Guide
*******************
@@ -10,39 +9,17 @@ Functest User Guide
.. toctree::
:maxdepth: 2
-
-
-Introduction
-============
-
-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]`_.
-
-.. include:: ./test_overview.rst
-
-.. include:: ./test_details.rst
-
-.. include:: ./runfunctest.rst
-
-.. include:: ./test_results.rst
-
-.. include:: ./reporting.rst
-
-.. figure:: ../../../images/functest-reporting-status.png
- :align: center
- :alt: Functest reporting portal Fuel status page
-
-.. include:: ./troubleshooting.rst
+ intro.rst
+ test_overview.rst
+ test_details.rst
+ test_results.rst
+ reporting.rst
+ troubleshooting.rst
References
==========
-`[1]`_: Functest configuration guide
-
`[2]`_: OpenStack Tempest documentation
`[3]`_: Rally documentation
@@ -51,7 +28,7 @@ References
`[5]`_: Clearwater vIMS blueprint
-`[6]`_: NIST web site
+`[6]`_: Security Content Automation Protocol
`[7]`_: OpenSCAP web site
@@ -63,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
@@ -81,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
new file mode 100644
index 000000000..c001afb2f
--- /dev/null
+++ b/docs/testing/user/userguide/intro.rst
@@ -0,0 +1,10 @@
+.. SPDX-License-Identifier: CC-BY-4.0
+
+Introduction
+============
+
+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 :ref:`functest-install-guide`.
diff --git a/docs/testing/user/userguide/reporting.rst b/docs/testing/user/userguide/reporting.rst
index 88f5e865a..8fad55d33 100644
--- a/docs/testing/user/userguide/reporting.rst
+++ b/docs/testing/user/userguide/reporting.rst
@@ -1,4 +1,3 @@
-.. This work is licensed under a Creative Commons Attribution 4.0 International License.
.. http://creativecommons.org/licenses/by/4.0
Test reporting
@@ -26,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 |
+---------------------+---------+---------+---------+---------+
@@ -42,12 +41,14 @@ and features) corresponding to this scenario.
+---------------------+---------+---------+---------+---------+
| copper | X | | | X |
+---------------------+---------+---------+---------+---------+
- src: os-odl_l2-nofeature-ha Colorado (see release note for the last matrix version)
+
+ src: os-odl_l2-nofeature-ha Colorado (see release note for the last matrix
+ version)
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.
@@ -69,16 +70,20 @@ scoring. In fact the success criteria are not always easy to define and may
require specific hardware configuration.
Please also note that all the test cases have the same "weight" for the score
-calculation whatever the complexity of the test case. Concretely a vping has the
-same weith than the 200 tempst tests.
+calculation whatever the complexity of the test case. Concretely a vping has
+the same weight than the 200 tempest tests.
Moreover some installers support more features than others. The more cases your
scenario is dealing with, the most difficult to rich a good scoring.
Therefore the scoring provides 3 types of indicators:
- * the richness of the scenario: if the target scoring is high, it means that the scenario includes lots of features
- * 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 more than 4 iterations over the last 10 days in CI)
+ * the richness of the scenario: if the target scoring is high, it means that
+ the scenario includes lots of features
+ * 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 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
does not represent an absolute value of the scenario.
@@ -86,5 +91,8 @@ does not represent an absolute value of the scenario.
See `reporting page`_ for details. For the status, click on the version,
Functest then the Status menu.
-
.. _`reporting page`: http://testresults.opnfv.org/reporting/
+
+.. figure:: ../../../images/functest-reporting-status.png
+ :align: center
+ :alt: Functest reporting portal Fuel status page
diff --git a/docs/testing/user/userguide/runfunctest.rst b/docs/testing/user/userguide/runfunctest.rst
deleted file mode 100644
index 89580e564..000000000
--- a/docs/testing/user/userguide/runfunctest.rst
+++ /dev/null
@@ -1,140 +0,0 @@
-.. This work is licensed under a Creative Commons Attribution 4.0 International License.
-.. http://creativecommons.org/licenses/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/openstack.creds \
- -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/openstack.creds \
- -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/openstack.creds
-
-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 | ^((?!netvirt).)*$ |
- | | 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 97c4688cc..98247d488 100644
--- a/docs/testing/user/userguide/test_details.rst
+++ b/docs/testing/user/userguide/test_details.rst
@@ -1,8 +1,7 @@
-.. This work is licensed under a Creative Commons Attribution 4.0 International License.
-.. http://creativecommons.org/licenses/by/4.0
+.. SPDX-License-Identifier: CC-BY-4.0
-
-The different test cases are described in the remaining sections of this document.
+The different test cases are described in the remaining sections of this
+document.
VIM (Virtualized Infrastructure Manager)
----------------------------------------
@@ -25,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.
@@ -59,8 +48,8 @@ Given the script **ping.sh**::
The goal of this test is to establish an SSH connection using a floating IP
-on the Public/External network and verify that 2 instances can talk over a Private
-Tenant network::
+on the Public/External network and verify that 2 instances can talk over a
+Private Tenant network::
vPing_ssh test case
+-------------+ +-------------+
@@ -105,7 +94,8 @@ vPing_userdata
This test case is similar to vPing_ssh but without the use of Floating IPs
and the Public/External network to transfer the ping script.
-Instead, it uses Nova metadata service to pass it to the instance at booting time.
+Instead, it uses Nova metadata service to pass it to the instance at booting
+time.
As vPing_ssh, it checks that 2 instances can talk to
each other on a Private Tenant network::
@@ -158,17 +148,32 @@ updates the appropriate parameters into the configuration file.
When the Tempest suite is executed, each test duration is measured and the full
console output is stored to a *log* file for further analysis.
-The Tempest testcases are distributed across two
+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' 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
+been supported by Apex, Fuel and Compass, so the tempest testcases have been
+integrated normally.
-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: Rally is also used to run Openstack Interop testcases `[9]`_, which focus
+on testing interoperability between OpenStack clouds.
+
+NOTE: Patrole is a tempest plugin for testing and verifying RBAC policy
+enforcement. It runs Tempest-based API tests using specified RBAC roles, thus
+allowing deployments to verify that only intended roles have access to those
+APIs. Patrole currently offers testing for the following OpenStack services:
+Nova, Neutron, Glance, Cinder and Keystone. Currently in functest, only neutron
+and glance are tested.
The goal of the Tempest test suite is to check the basic functionalities of the
different OpenStack components on an OPNFV fresh installation, using the
@@ -182,10 +187,11 @@ Rally `[3]`_ is a benchmarking tool that answers the question:
*How does OpenStack work at scale?*
-The goal of this test suite is to benchmark all the different OpenStack modules and
-get significant figures that could help to define Telco Cloud KPIs.
+The goal of this test suite is to benchmark all the different OpenStack modules
+and get significant figures that could help to define Telco Cloud KPIs.
-The OPNFV Rally scenarios are based on the collection of the actual Rally scenarios:
+The OPNFV Rally scenarios are based on the collection of the actual Rally
+scenarios:
* authenticate
* cinder
@@ -195,7 +201,6 @@ The OPNFV Rally scenarios are based on the collection of the actual Rally scenar
* neutron
* nova
* quotas
- * ceilometer
A basic SLA (stop test on errors) has been implemented.
@@ -208,104 +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.
-Refstack-client to run OpenStack interop testcases
---------------------------------------------------
-
-Refstack-client `[8]`_ is a command line utility that allows you to
-execute Tempest test runs based on configurations you specify.
-It is the official tool to run Openstack Interop (previously known as Defcore)
-testcases `[9]`_, which focus on testing interoperability between OpenStack
-clouds.
-
-Refstack-client is integrated in Functest, consumed by Dovetail, which
-intends to define and provide a set of OPNFV related validation criteria
-that will provide input for the evaluation of the use of OPNFV trademarks.
-This progress is under the guideline of Compliance Verification Program(CVP).
-
-Running methods
-^^^^^^^^^^^^^^^
-
-Two running methods are provided after refstack-client integrated into
-Functest, Functest command line and manually, respectively.
-
-By default, for Defcore test cases run by Functest command line,
-are run followed with automatically generated
-configuration file, i.e., refstack_tempest.conf. In some circumstances,
-the automatic configuration file may not quite satisfied with the SUT,
-Functest also inherits the refstack-client command line and provides a way
-for users to set its configuration file according to its own SUT manually.
-
-*command line*
-
-Inside the Functest container, first to prepare Functest environment:
-
-::
-
- functest env prepare
-
-then to run default defcore testcases by using refstack-client:
-
-::
-
- functest testcase run refstack_defcore
-
-In OPNFV Continuous Integration(CI) system, the command line method is used.
-
-*manually*
-
-Prepare the tempest configuration file and the testcases want to run with the SUT,
-run the testcases with:
-
-::
-
- ./refstack-client test -c <Path of the tempest configuration file to use> -v --test-list <Path or URL of test list>
-
-using help for more information:
-
-::
-
- ./refstack-client --help
- ./refstack-client test --help
-
-Reference tempest configuration
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-*command line method*
-
-When command line method is used, the default tempest configuration file
-is generated by Rally.
-
-*manually*
-
-When running manually is used, recommended way to generate tempest configuration
-file is:
-
-::
-
- cd /usr/lib/python2.7/site-packages/functest/opnfv_tests/openstack/refstack_client
- python tempest_conf.py
-
-a file called tempest.conf is stored in the current path by default, users can do
-some adjustment according to the SUT:
-
-::
-
- vim refstack_tempest.conf
-
-a reference article can be used `[15]`_.
-
-
-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 38 tests (test duration < 10 minutes)
-
-
SDN Controllers
---------------
@@ -320,31 +227,40 @@ OpenDaylight and Neutron.
The list of tests can be described as follows:
* Basic Restconf test cases
+
* Connect to Restconf URL
* Check the HTTP code status
* Neutron Reachability test cases
+
* Get the complete list of neutron resources (networks, subnets, ports)
* Neutron Network test cases
+
* Check OpenStack networks
* Check OpenDaylight networks
- * Create a new network via OpenStack and check the HTTP status code returned by Neutron
+ * Create a new network via OpenStack and check the HTTP status code returned
+ by Neutron
* Check that the network has also been successfully created in OpenDaylight
* Neutron Subnet test cases
+
* Check OpenStack subnets
* Check OpenDaylight subnets
- * Create a new subnet via OpenStack and check the HTTP status code returned by Neutron
+ * Create a new subnet via OpenStack and check the HTTP status code returned
+ by Neutron
* Check that the subnet has also been successfully created in OpenDaylight
* Neutron Port test cases
+
* Check OpenStack Neutron for known ports
* Check OpenDaylight ports
- * Create a new port via OpenStack and check the HTTP status code returned by Neutron
+ * Create a new port via OpenStack and check the HTTP status code returned by
+ Neutron
* Check that the new port has also been successfully created in OpenDaylight
* Delete operations
+
* Delete the port previously created via OpenStack
* Check that the port has been also successfully deleted in OpenDaylight
* Delete previously subnet created via OpenStack
@@ -356,49 +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 Brahpamutra:
-
-
-+-----------------+---------+----------+--------+-----------+
-| Test | Brahma | Colorado | Danube | Euphrates |
-+=================+=========+==========+========+===========+
-| barometer | | | X | X |
-+-----------------+---------+----------+--------+-----------+
-| bgpvpn | | X | X | X |
-+-----------------+---------+----------+--------+-----------+
-| copper | | X | | |
-+-----------------+---------+----------+--------+-----------+
-| doctor | X | X | X | X |
-+-----------------+---------+----------+--------+-----------+
-| domino | | X | X | X |
-+-----------------+---------+----------+--------+-----------+
-| fds | | | X | X |
-+-----------------+---------+----------+--------+-----------+
-| moon | | X | | |
-+-----------------+---------+----------+--------+-----------+
-| multisite | | X | X | |
-+-----------------+---------+----------+--------+-----------+
-| netready | | | X | |
-+-----------------+---------+----------+--------+-----------+
-| odl_sfc | | X | X | X |
-+-----------------+---------+----------+--------+-----------+
-| opera | | | X | |
-+-----------------+---------+----------+--------+-----------+
-| orchestra | | | X | X |
-+-----------------+---------+----------+--------+-----------+
-| parser | | | X | X |
-+-----------------+---------+----------+--------+-----------+
-| promise | X | X | X | X |
-+-----------------+---------+----------+--------+-----------+
-| security_scan | | X | X | |
-+-----------------+---------+----------+--------+-----------+
-
-Please refer to the dedicated feature user guides for details.
-
-
VNF
---
@@ -409,9 +282,9 @@ The IP Multimedia Subsystem or IP Multimedia Core Network Subsystem (IMS) is an
architectural framework for delivering IP multimedia services.
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.
+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:
@@ -422,48 +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'
-
-orchestra_openims
-^^^^^^^^^^^^^^^^^
-Orchestra test case deals with the deployment of OpenIMS with OpenBaton
-orchestrator.
+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.
-orchestra_clearwaterims
-^^^^^^^^^^^^^^^^^^^^^^^
-Orchestra test case deals with the deployment of Clearwater vIMS with OpenBaton
-orchestrator.
+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
^^^^^^^^^^^^
@@ -484,14 +340,73 @@ The Workflow is as follows:
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 `[16]`_.
+
+The kubernetes testcases are distributed across various Tiers:
+
+ * Healthcheck Tier
+
+ * k8s_smoke Test Case: Creates a Guestbook application that contains redis
+ server, 2 instances of redis slave, frontend application, frontend service
+ and redis master service and redis slave service. Using frontend service,
+ the test will write an entry into the guestbook application which will
+ store the entry into the backend redis database. Application flow MUST
+ work as expected and the data written MUST be available to read.
+
+ * Smoke Tier
+
+ * k8s_conformance Test Case: Runs a series of k8s e2e tests expected to
+ pass on any Kubernetes cluster. It is a subset of tests necessary to
+ demonstrate conformance grows with each release. Conformance is thus
+ considered versioned, with backwards compatibility guarantees and are
+ 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/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/
+.. _`[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 a22a5067f..bc3e79dcb 100644
--- a/docs/testing/user/userguide/test_overview.rst
+++ b/docs/testing/user/userguide/test_overview.rst
@@ -1,5 +1,4 @@
-.. This work is licensed under a Creative Commons Attribution 4.0 International License.
-.. http://creativecommons.org/licenses/by/4.0
+.. SPDX-License-Identifier: CC-BY-4.0
Overview of the Functest suites
===============================
@@ -9,158 +8,114 @@ In the Continuous Integration pipeline, it is launched after an OPNFV fresh
installation to validate and verify the basic functions of the
infrastructure.
-The current list of test suites can be distributed over 4 main domains:
+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_health | basic instance creation, check |
-| | | \_check | DHCP |
-| +---------------+----------------+----------------------------------+
-| | smoke | vping_ssh | NFV "Hello World" using an SSH |
-| | | | connection to a destination VM |
-| | | | over a created floating IP |
-| | | | address on the SUT Public / |
-| | | | External network. Using the SSH |
-| | | | connection a test script is then |
-| | | | copied to the destination |
-| | | | VM and then executed via SSH. |
-| | | | The script will ping another |
-| | | | VM on a specified IP address over|
-| | | | the SUT Private Tenant network |
-| | +----------------+----------------------------------+
-| | | vping_userdata | Uses Ping with given userdata |
-| | | | to test intra-VM connectivity |
-| | | | over the SUT Private Tenant |
-| | | | network. The correct operation |
-| | | | of the NOVA Metadata service is |
-| | | | also verified in this test |
-| | +----------------+----------------------------------+
-| | | tempest_smoke | Generate and run a relevant |
-| | | \_serial | Tempest Test Suite in smoke mode.|
-| | | | The generated test set is |
-| | | | dependent on the OpenStack |
-| | | | deployment environment |
-| | +----------------+----------------------------------+
-| | | rally_sanity | Run a subset of the OpenStack |
-| | | | Rally Test Suite in smoke mode |
-| | +----------------+----------------------------------+
-| | | snaps_smoke | Run the SNAPS-OO integration |
-| | | | tests |
-| | +----------------+----------------------------------+
-| | | refstack | Reference RefStack suite |
-| | | \_defcore | tempest selection for NFV |
-| +---------------+----------------+----------------------------------+
-| | components | tempest_full | Generate and run a full set of |
-| | | \_parallel | the OpenStack Tempest Test Suite.|
-| | | | See the OpenStack reference test |
-| | | | suite `[2]`_. The generated |
-| | | | test set is dependent on the |
-| | | | OpenStack deployment environment |
-| | +----------------+----------------------------------+
-| | | rally_full | Run the OpenStack testing tool |
-| | | | benchmarking OpenStack modules |
-| | | | See the Rally documents `[3]`_ |
-+-------------+---------------+----------------+----------------------------------+
-| Controllers | smoke | odl | Opendaylight Test suite |
-| | | | Limited test suite to check the |
-| | | | basic neutron (Layer 2) |
-| | | | operations mainly based on |
-| | | | upstream testcases. See below |
-| | | | for details |
-| | +----------------+----------------------------------+
-| | | odl_netvirt | Test Suite for the OpenDaylight |
-| | | | SDN Controller when the NetVirt |
-| | | | features are installed. It |
-| | | | integrates some test suites from |
-| | | | upstream using Robot as the test |
-| | | | framework |
-+-------------+---------------+----------------+----------------------------------+
-| 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_ims | Example of a real VNF deployment |
-| | | | to show the NFV capabilities of |
-| | | | the platform. The IP Multimedia |
-| | | | Subsytem is a typical Telco test |
-| | | | case, referenced by ETSI. |
-| | | | It provides a fully functional |
-| | | | VoIP System |
-| | +----------------+----------------------------------+
-| | | orchestra | OpenIMS deployment using |
-| | | \_openims | Openbaton orchestrator |
-| | +----------------+----------------------------------+
-| | | orchestra | Cleawater IMS deployment using |
-| | | \_cleawaterims | Openbaton orchestrator |
-| | +----------------+----------------------------------+
-| | | vyos_vrouter | vRouter testing |
-| | +----------------+----------------------------------+
-| | | cloudify_ims | Based on cloudify_ims test case |
-| | | 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) |
-+-------------+---------------+----------------+----------------------------------+
++-------------+---------------+------------+----------------------------------+
+| Domain | Tier | Test case | Comments |
++=============+===============+============+==================================+
+| VIM | healthcheck | connection | Check OpenStack connectivity |
+| | | \_check | |
+| +---------------+------------+----------------------------------+
+| | smoke | vping_ssh | NFV "Hello World" using an SSH |
+| | | | connection to a destination VM |
+| | | | over a created floating IP |
+| | | | address on the SUT Public / |
+| | | | External network. Using the SSH |
+| | | | connection a test script is then |
+| | | | copied to the destination |
+| | | | VM and then executed via SSH. |
+| | | | The script will ping another |
+| | | | VM on a specified IP address over|
+| | | | the SUT Private Tenant network |
+| | +------------+----------------------------------+
+| | | vping | Uses Ping with given userdata |
+| | | \_userdata | to test intra-VM connectivity |
+| | | | over the SUT Private Tenant |
+| | | | network. The correct operation |
+| | | | of the NOVA Metadata service is |
+| | | | also verified in this test |
+| | +------------+----------------------------------+
+| | | tempest | Generate and run a relevant |
+| |               | \_smoke | Tempest Test Suite in smoke mode.|
+| | | | 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 |
+| | +------------+----------------------------------+
+| | | refstack | Reference RefStack suite |
+| | | \_defcore | tempest selection for NFV |
+| | +------------+----------------------------------+
+| | | patrole | Patrole is a tempest plugin for |
+| | | | testing and verifying RBAC policy|
+| | | | enforcement, which offers testing|
+| | | | for the following OpenStack |
+| | | | services: Nova, Neutron, Glance, |
+| | | | Cinder and Keystone |
+| +---------------+------------+----------------------------------+
+| | | neutron | The neutron trunk port testcases |
+| | | \_trunk | have been introduced and they are|
+| | | | supported by installers : |
+| | | | Apex, Fuel and Compass. |
+| +---------------+------------+----------------------------------+
+| | components | tempest | Generate and run a full set of |
+| | | \_full | the OpenStack Tempest Test Suite.|
+| | | \_parallel | See the OpenStack reference test |
+| | | | suite `[2]`_. The generated |
+| | | | test set is dependent on the |
+| | | | OpenStack deployment environment |
+| | +------------+----------------------------------+
+| | | rally_full | Run the OpenStack testing tool |
+| | | | benchmarking OpenStack modules |
+| | | | See the Rally documents `[3]`_ |
++-------------+---------------+------------+----------------------------------+
+| Controllers | smoke | odl | Opendaylight Test suite |
+| | | | Limited test suite to check the |
+| | | | basic neutron (Layer 2) |
+| | | | operations mainly based on |
+| | | | upstream testcases. See below |
+| | | | for details |
++-------------+---------------+------------+----------------------------------+
+| VNF | vnf | cloudify | Example of a real VNF deployment |
+| | | \_ims | to show the NFV capabilities of |
+| | | | the platform. The IP Multimedia |
+| | | | Subsystem is a typical Telco test|
+| | | | case, referenced by ETSI. |
+| | | | It provides a fully functional |
+| | | | VoIP System |
+| | +------------+----------------------------------+
+| | | vyos | vRouter testing |
+| | | \_vrouter | |
+| | +------------+----------------------------------+
+| | | 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 |
+| | | | minimal functional requirements |
+| +---------------+------------+----------------------------------+
+| | smoke | k8s\_ | Run a subset of Kubernetes |
+| | | conformance| End-to-End tests, expected to |
+| | | | pass on any Kubernetes cluster |
++-------------+---------------+------------+----------------------------------+
As shown in the above table, Functest is structured into different 'domains',
@@ -169,29 +124,30 @@ As shown in the above table, Functest is structured into different 'domains',
Test cases also have an implicit execution order. For example, if the early
'healthcheck' Tier testcase fails, or if there are any failures in the 'smoke'
-Tier testcases, there is little point to launch a full testcase execution round.
+Tier testcases, there is little point to launch a full testcase execution
+round.
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.
-The Tempest test suite is the default OpenStack smoke test suite but no new test
-cases have been created in OPNFV Functest.
+The Tempest test suite is the default OpenStack smoke test suite but no new
+test cases have been created in OPNFV Functest.
The results produced by the tests run from CI are pushed and collected into a
-NoSQL database. The goal is to populate the database with results from different
-sources and scenarios and to show them on a `Functest Dashboard`_. A screenshot
-of a live Functest Dashboard is shown below:
+NoSQL database. The goal is to populate the database with results from
+different sources and scenarios and to show them on a `Functest Dashboard`_. A
+screenshot of a live Functest Dashboard is shown below:
.. figure:: ../../../images/FunctestDashboardEuphrates.png
:align: center
@@ -217,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
@@ -230,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 3941ba0a1..10f87d8ec 100644
--- a/docs/testing/user/userguide/test_results.rst
+++ b/docs/testing/user/userguide/test_results.rst
@@ -1,3 +1,5 @@
+.. SPDX-License-Identifier: CC-BY-4.0
+
Test results
============
@@ -8,40 +10,154 @@ 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/functest/ci.
+/usr/lib/python3.8/site-packages/xtesting/ci.
Automated testing
---------------
+-----------------
+
+In automated mode, tests are run within split Alpine containers, and test
+results are displayed in jenkins logs. The result summary is provided at the
+end of each suite and can be described as follow.
+
+Healthcheck suite::
+
+ +--------------------------+------------------+---------------------+------------------+----------------+
+ | 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 |
+ +---------------------------+------------------+---------------+------------------+----------------+
+ | 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 | 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_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 | 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::
-In automated mode, test results are displayed in jenkins logs, a summary is provided
-at the end of the job and can be described as follow::
-
- +-------------------------+----------------------------------------------------------+
- | ENV VAR | VALUE |
- +-------------------------+----------------------------------------------------------+
- | INSTALLER_TYPE | daisy |
- | DEPLOY_SCENARIO | os-nosdn-nofeature-ha |
- | BUILD_TAG | jenkins-functest-daisy-baremetal-daily-master-67 |
- | CI_LOOP | daily |
- +-------------------------+----------------------------------------------------------+
-
- +------------------------------+------------------+---------------------+------------------+----------------+
- | TEST CASE | PROJECT | TIER | DURATION | RESULT |
- +------------------------------+------------------+---------------------+------------------+----------------+
- | connection_check | functest | healthcheck | 00:08 | PASS |
- | api_check | functest | healthcheck | 04:22 | PASS |
- | snaps_health_check | functest | healthcheck | 00:35 | PASS |
- | vping_ssh | functest | smoke | 00:54 | PASS |
- | vping_userdata | functest | smoke | 00:27 | PASS |
- | tempest_smoke_serial | functest | smoke | 19:39 | FAIL |
- | rally_sanity | functest | smoke | 15:16 | PASS |
- | refstack_defcore | functest | smoke | 15:55 | PASS |
- | snaps_smoke | functest | smoke | 26:45 | FAIL |
- | cloudify_ims | functest | vnf | 23:56 | PASS |
- | orchestra_openims | orchestra | vnf | 15:07 | PASS |
- | orchestra_clearwaterims | orchestra | vnf | 19:10 | PASS |
- | vyos_vrouter | functest | vnf | 00:00 | SKIP |
- +------------------------------+------------------+---------------------+------------------+----------------+
+ +-------------------------+------------------+--------------+------------------+----------------+
+ | 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 1e342b653..d857ed4c4 100644
--- a/docs/testing/user/userguide/troubleshooting.rst
+++ b/docs/testing/user/userguide/troubleshooting.rst
@@ -1,5 +1,4 @@
-.. This work is licensed under a Creative Commons Attribution 4.0 International License.
-.. http://creativecommons.org/licenses/by/4.0
+.. SPDX-License-Identifier: CC-BY-4.0
Troubleshooting
===============
@@ -15,19 +14,18 @@ credentials::
or::
- source /home/opnfv/functest/conf/openstack.creds
+ source /home/opnfv/functest/conf/env_file
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
^^^^^^^^^^^^
-For both vPing test cases (**vPing_ssh**, and **vPing_userdata**), the first steps are
-similar:
+For both vPing test cases (**vPing_ssh**, and **vPing_userdata**), the first
+steps are similar:
* Create Glance image
* Create Network
@@ -37,15 +35,17 @@ similar:
After these actions, the test cases differ and will be explained in their
respective section.
-These test cases can be run inside the container, using new Functest CLI as follows::
+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
-and /usr/lib/python2.7/site-packages/functest/opnfv_tests/openstack/vping/vping_userdata.py
+python scripts, located in paths::
+
+ /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:
@@ -73,10 +73,11 @@ Some of the common errors that can appear in this test case are::
vPing_ssh- ERROR - There has been a problem when creating the neutron network....
-This means that there has been some problems with Neutron, even before creating the
-instances. Try to create manually a Neutron network and a Subnet to see if that works.
-The debug messages will also help to see when it failed (subnet and router creation).
-Example of Neutron commands (using 10.6.0.0/24 range for example)::
+This means that there has been some problems with Neutron, even before creating
+the instances. Try to create manually a Neutron network and a Subnet to see if
+that works. The debug messages will also help to see when it failed (subnet and
+router creation). Example of Neutron commands (using 10.6.0.0/24 range for
+example)::
neutron net-create net-test
neutron subnet-create --name subnet-test --allocation-pool start=10.6.0.2,end=10.6.0.100 \
@@ -85,7 +86,8 @@ Example of Neutron commands (using 10.6.0.0/24 range for example)::
neutron router-interface-add <ROUTER_ID> test_subnet
neutron router-gateway-set <ROUTER_ID> <EXT_NET_NAME>
-Another related error can occur while creating the Security Groups for the instances::
+Another related error can occur while creating the Security Groups for the
+instances::
vPing_ssh- ERROR - Failed to create the security group...
@@ -100,9 +102,9 @@ 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 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::
+*/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::
nova list
nova show <INSTANCE_ID>
@@ -113,7 +115,8 @@ It might show some messages about the booting failure. To try that manually::
This will spawn a VM using the network created previously manually.
In all the OPNFV tested scenarios from CI, it never has been a problem with the
-previous actions. Further possible problems are explained in the following sections.
+previous actions. Further possible problems are explained in the following
+sections.
vPing_SSH
@@ -122,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::
@@ -130,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
@@ -143,19 +146,21 @@ from the DHCP agent. It can be checked by doing::
nova console-log opnfv-vping-2
If the message *Sending discover* and *No lease, failing* is shown, it probably
-means that the Neutron dhcp-agent failed to assign an IP or even that it was not
-responding. At this point it does not make sense to try to ping the floating IP.
+means that the Neutron dhcp-agent failed to assign an IP or even that it was
+not responding. At this point it does not make sense to try to ping the
+floating IP.
-If the instance got an IP properly, try to ping manually the VM from the container::
+If the instance got an IP properly, try to ping manually the VM from the
+container::
nova list
<grab the public IP>
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 rules because
-there might be some rules rejecting ICMP or TCP traffic coming/going from/to the
-container.
+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 iptables
+rules because there might be some rules rejecting ICMP or TCP traffic
+coming/going from/to the container.
At this point, if the ping does not work either, try to reproduce the test
manually with the steps described above in the vPing common section with the
@@ -176,7 +181,8 @@ vPing_userdata
This test case does not create any floating IP neither establishes an SSH
connection. Instead, it uses nova-metadata service when creating an instance
to pass the same script as before (ping.sh) but as 1-line text. This script
-will be executed automatically when the second instance **opnfv-vping-2** is booted.
+will be executed automatically when the second instance **opnfv-vping-2** is
+booted.
The only known problem here for this test to fail is mainly the lack of support
of cloud-init (nova-metadata service). Check the console of the instance::
@@ -219,79 +225,69 @@ In the upstream OpenStack CI all the Tempest test cases are supposed to pass.
If some test cases fail in an OPNFV deployment, the reason is very probably one
of the following
-+-----------------------------+-----------------------------------------------------+
-| Error | Details |
-+=============================+=====================================================+
-| Resources required for test | Such resources could be e.g. an external network |
-| case execution are missing | and access to the management subnet (adminURL) from |
-| | the Functest docker container. |
-+-----------------------------+-----------------------------------------------------+
-| OpenStack components or | Check running services in the controller and compute|
-| services are missing or not | nodes (e.g. with "systemctl" or "service" commands).|
-| configured properly | Configuration parameters can be verified from the |
-| | related .conf files located under '/etc/<component>'|
-| | directories. |
-+-----------------------------+-----------------------------------------------------+
-| Some resources required for | The tempest.conf file, automatically generated by |
-| execution test cases are | Rally in Functest, does not contain all the needed |
-| missing | parameters or some parameters are not set properly. |
-| | The tempest.conf file is located in directory |
-| | 'root/.rally/verification/verifier-<UUID> |
-| | /for-deployment-<UUID>' |
-| | in the Functest Docker container. Use the "rally |
-| | deployment list" command in order to check the UUID |
-| | the UUID of the current deployment. |
-+-----------------------------+-----------------------------------------------------+
++----------------------------+------------------------------------------------+
+| Error | Details |
++============================+================================================+
+| Resources required for | Such resources could be e.g. an external |
+| testcase execution are | network and access to the management subnet |
+| missing | (adminURL) from the Functest docker container. |
++----------------------------+------------------------------------------------+
+| OpenStack components or | Check running services in the controller and |
+| services are missing or | compute nodes (e.g. with "systemctl" or |
+| not configured properly | "service" commands). |
+| | Configuration parameters can be verified from |
+| | the related .conf files located under |
+| | '/etc/<component>' directories. |
++----------------------------+------------------------------------------------+
+| Some resources required | The tempest.conf file, automatically generated |
+| for execution test cases | by Rally in Functest, does not contain all the |
+| are missing | needed parameters or some parameters are not |
+| | set properly. |
+| | The tempest.conf file is located in directory |
+| | 'root/.rally/verification/verifier-<UUID> |
+| | /for-deployment-<UUID>' |
+| | in the Functest Docker container. Use the |
+| | "rally deployment list" command in order to |
+| | check the UUID of the current deployment. |
++----------------------------+------------------------------------------------+
When some Tempest test case fails, captured traceback and possibly also the
-related REST API requests/responses are output to the console. More detailed debug
-information can be found from tempest.log file stored into related Rally deployment
-folder.
+related REST API requests/responses are output to the console. More detailed
+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/openstack.creds \
+ -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
^^^^^
-The same error causes which were mentioned above for Tempest test cases, may also
-lead to errors in Rally as well.
+The same error causes which were mentioned above for Tempest test cases, may
+also lead to errors in Rally as well.
Possible scenarios are:
* authenticate
@@ -301,18 +297,19 @@ Possible scenarios are:
* keystone
* neutron
* nova
- * ceilometer
* quotas
* vm
-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
-For more info about Rally scenario definition please refer to the Rally official
-documentation. `[3]`_
+To know more about what those scenarios are doing, they are defined in
+directory:
+/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.io/en/latest/index.html
Controllers
-----------
@@ -372,7 +369,7 @@ described in the following table:
| the VM | the vIMS VNF installation fails |
+-----------------------------------+------------------------------------+
-Please note that this test case requires resources (8 VM (2Go) + 1 VM (4Go)), it
-is there fore not recommended to run it on a light configuration.
+Please note that this test case requires resources (8 VM (2Go) + 1 VM (4Go)),
+it is there fore not recommended to run it on a light configuration.
.. _`OPNFV Functest Developer Guide`: http://artifacts.opnfv.org/functest/docs/testing_developer_devguide/index.html#
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 75f059b74..000000000
--- a/functest/api/base.py
+++ /dev/null
@@ -1,71 +0,0 @@
-#!/usr/bin/env python
-
-# Copyright (c) 2017 Huawei Technologies Co.,Ltd and others.
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-
-"""
-The base class to dispatch request
-
-"""
-
-import logging
-
-from flask import request
-from flask_restful import Resource
-
-from functest.api.common import api_utils
-
-
-LOGGER = logging.getLogger(__name__)
-
-
-class ApiResource(Resource):
- """ API Resource class"""
-
- def __init__(self):
- super(ApiResource, self).__init__()
-
- def _post_args(self): # pylint: disable=no-self-use
- # pylint: disable=maybe-no-member
- """ Return action and args after parsing request """
-
- data = request.json if request.json else {}
- params = api_utils.change_to_str_in_dict(data)
- action = params.get('action', request.form.get('action', ''))
- args = params.get('args', {})
- try:
- args['file'] = request.files['file']
- except KeyError:
- pass
- LOGGER.debug('Input args are: action: %s, args: %s', action, args)
-
- return action, args
-
- def _get_args(self): # pylint: disable=no-self-use
- """ Convert the unicode to string for request.args """
- args = api_utils.change_to_str_in_dict(request.args)
- return args
-
- def _dispatch_post(self):
- """ Dispatch request """
- action, args = self._post_args()
- return self._dispatch(args, action)
-
- def _dispatch(self, args, action):
- """
- Dynamically load the classes with reflection and
- obtain corresponding methods
- """
- try:
- return getattr(self, action)(args)
- except AttributeError:
- api_utils.result_handler(status=1, data='No such action')
-
-
-# Import modules from package "functest.api.resources"
-# and append them into sys.modules
-api_utils.import_modules_from_package("functest.api.resources")
diff --git a/functest/api/common/api_utils.py b/functest/api/common/api_utils.py
deleted file mode 100644
index d85acf927..000000000
--- a/functest/api/common/api_utils.py
+++ /dev/null
@@ -1,101 +0,0 @@
-#!/usr/bin/env python
-
-# Copyright (c) 2017 Huawei Technologies Co.,Ltd and others.
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-
-"""
-Utils for functest restapi
-
-"""
-
-import collections
-import logging
-import os
-import sys
-from oslo_utils import importutils
-
-from flask import jsonify
-import six
-
-import functest
-
-LOGGER = logging.getLogger(__name__)
-
-
-def change_to_str_in_dict(obj):
- """
- Return a dict with key and value both in string if they are in Unicode
- """
- if isinstance(obj, collections.Mapping):
- return {str(k): change_to_str_in_dict(v) for k, v in obj.items()}
- elif isinstance(obj, list):
- return [change_to_str_in_dict(ele) for ele in obj]
- elif isinstance(obj, six.text_type):
- return str(obj)
- return obj
-
-
-def itersubclasses(cls, _seen=None):
- """ Generator over all subclasses of a given class in depth first order """
-
- if not isinstance(cls, type):
- raise TypeError("itersubclasses must be called with "
- "new-style classes, not %.100r" % cls)
- _seen = _seen or set()
- try:
- subs = cls.__subclasses__()
- except TypeError: # fails only when cls is type
- subs = cls.__subclasses__(cls)
- for sub in subs:
- if sub not in _seen:
- _seen.add(sub)
- yield sub
- for itersub in itersubclasses(sub, _seen):
- yield itersub
-
-
-def import_modules_from_package(package):
- """
- Import modules from package and append into sys.modules
- :param: package - Full package name. For example: functest.api.resources
- """
- path = [os.path.dirname(functest.__file__), ".."] + package.split(".")
- path = os.path.join(*path)
- for root, _, files in os.walk(path):
- for filename in files:
- if filename.startswith("__") or not filename.endswith(".py"):
- continue
- new_package = ".".join(root.split(os.sep)).split("....")[1]
- module_name = "%s.%s" % (new_package, filename[:-3])
- try:
- try_append_module(module_name, sys.modules)
- except ImportError:
- LOGGER.exception("unable to import %s", module_name)
-
-
-def try_append_module(name, modules):
- """ Append the module into specified module system """
-
- if name not in modules:
- modules[name] = importutils.import_module(name)
-
-
-def change_obj_to_dict(obj):
- """ Transfer the object into dict """
- dic = {}
- for key, value in vars(obj).items():
- dic.update({key: value})
- return dic
-
-
-def result_handler(status, data):
- """ Return the json format of result in dict """
- result = {
- 'status': status,
- 'result': data
- }
- return jsonify(result)
diff --git a/functest/api/common/thread.py b/functest/api/common/thread.py
deleted file mode 100644
index fb60aaac7..000000000
--- a/functest/api/common/thread.py
+++ /dev/null
@@ -1,52 +0,0 @@
-#!/usr/bin/env python
-
-# Copyright (c) 2017 Huawei Technologies Co.,Ltd and others.
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-
-"""
-Used to handle multi-thread tasks
-"""
-
-import logging
-import threading
-
-from oslo_serialization import jsonutils
-
-
-LOGGER = logging.getLogger(__name__)
-
-
-class TaskThread(threading.Thread):
- """ Task Thread Class """
-
- def __init__(self, target, args, handler):
- super(TaskThread, self).__init__(target=target, args=args)
- self.target = target
- self.args = args
- self.handler = handler
-
- def run(self):
- """ Override the function run: run testcase and update database """
- update_data = {'task_id': self.args.get('task_id'),
- 'status': 'IN PROGRESS'}
- self.handler.insert(update_data)
-
- LOGGER.info('Starting running test case')
-
- try:
- data = self.target(self.args)
- except Exception as err: # pylint: disable=broad-except
- LOGGER.exception('Task Failed')
- update_data = {'status': 'FAIL', 'error': str(err)}
- self.handler.update_attr(self.args.get('task_id'), update_data)
- else:
- LOGGER.info('Task Finished')
- LOGGER.debug('Result: %s', data)
- new_data = {'status': 'FINISHED',
- 'result': jsonutils.dumps(data.get('result', {}))}
-
- self.handler.update_attr(self.args.get('task_id'), new_data)
diff --git a/functest/api/database/db.py b/functest/api/database/db.py
deleted file mode 100644
index ea861ddbd..000000000
--- a/functest/api/database/db.py
+++ /dev/null
@@ -1,26 +0,0 @@
-#!/usr/bin/env python
-
-# Copyright (c) 2017 Huawei Technologies Co.,Ltd and others.
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-
-"""
-Create database to store task results using sqlalchemy
-"""
-
-from sqlalchemy import create_engine
-from sqlalchemy.ext.declarative import declarative_base
-from sqlalchemy.orm import scoped_session, sessionmaker
-
-
-SQLITE = 'sqlite:////tmp/functest.db'
-
-ENGINE = create_engine(SQLITE, convert_unicode=True)
-DB_SESSION = scoped_session(sessionmaker(autocommit=False,
- autoflush=False,
- bind=ENGINE))
-BASE = declarative_base()
-BASE.query = DB_SESSION.query_property()
diff --git a/functest/api/database/v1/handlers.py b/functest/api/database/v1/handlers.py
deleted file mode 100644
index 7bd286ded..000000000
--- a/functest/api/database/v1/handlers.py
+++ /dev/null
@@ -1,43 +0,0 @@
-#!/usr/bin/env python
-
-# Copyright (c) 2017 Huawei Technologies Co.,Ltd and others.
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-
-"""
-Used to handle tasks: insert the task info into database and update it
-"""
-
-from functest.api.database.db import DB_SESSION
-from functest.api.database.v1.models import Tasks
-
-
-class TasksHandler(object):
- """ Tasks Handler Class """
-
- def insert(self, kwargs): # pylint: disable=no-self-use
- """ To insert the task info into database """
- task = Tasks(**kwargs)
- DB_SESSION.add(task) # pylint: disable=maybe-no-member
- DB_SESSION.commit() # pylint: disable=maybe-no-member
- return task
-
- def get_task_by_taskid(self, task_id): # pylint: disable=no-self-use
- """ Obtain the task by task id """
- # pylint: disable=maybe-no-member
- task = Tasks.query.filter_by(task_id=task_id).first()
- if not task:
- raise ValueError
-
- return task
-
- def update_attr(self, task_id, attr):
- """ Update the required attributes of the task """
- task = self.get_task_by_taskid(task_id)
-
- for key, value in attr.items():
- setattr(task, key, value)
- DB_SESSION.commit() # pylint: disable=maybe-no-member
diff --git a/functest/api/database/v1/models.py b/functest/api/database/v1/models.py
deleted file mode 100644
index c5de91bca..000000000
--- a/functest/api/database/v1/models.py
+++ /dev/null
@@ -1,33 +0,0 @@
-#!/usr/bin/env python
-
-# Copyright (c) 2017 Huawei Technologies Co.,Ltd and others.
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-
-"""
-Define tables for tasks
-"""
-
-from sqlalchemy import Column
-from sqlalchemy import Integer
-from sqlalchemy import String
-from sqlalchemy import Text
-
-from functest.api.database.db import BASE
-
-
-class Tasks(BASE): # pylint: disable=too-few-public-methods, no-init
- """ Create a table for tasks"""
-
- __tablename__ = 'tasks'
- id = Column(Integer, primary_key=True) # pylint: disable=invalid-name
- task_id = Column(String(50))
- status = Column(Integer)
- error = Column(String(120))
- result = Column(Text)
-
- def __repr__(self):
- return '<Task %r>' % Tasks.task_id
diff --git a/functest/api/resources/v1/creds.py b/functest/api/resources/v1/creds.py
deleted file mode 100644
index f445017dc..000000000
--- a/functest/api/resources/v1/creds.py
+++ /dev/null
@@ -1,80 +0,0 @@
-#!/usr/bin/env python
-
-# Copyright (c) 2017 Huawei Technologies Co.,Ltd and others.
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-
-"""
-Resources to handle openstack related requests
-"""
-
-import collections
-import logging
-import pkg_resources
-import socket
-
-from flask import jsonify
-from flasgger.utils import swag_from
-
-from functest.api.base import ApiResource
-from functest.api.common import api_utils
-from functest.cli.commands.cli_os import OpenStack
-from functest.utils import openstack_utils as os_utils
-from functest.utils.constants import CONST
-
-LOGGER = logging.getLogger(__name__)
-
-ADDRESS = socket.gethostbyname(socket.gethostname())
-ENDPOINT_CREDS = ('http://{}:5000/api/v1/functest/openstack'.format(ADDRESS))
-
-
-class V1Creds(ApiResource):
- """ V1Creds Resource class"""
-
- @swag_from(
- pkg_resources.resource_filename('functest', 'api/swagger/creds.yaml'),
- endpoint='{0}/credentials'.format(ENDPOINT_CREDS))
- def get(self): # pylint: disable=no-self-use
- """ Get credentials """
- os_utils.source_credentials(CONST.__getattribute__('openstack_creds'))
- credentials_show = OpenStack.show_credentials()
- return jsonify(credentials_show)
-
- @swag_from(
- pkg_resources.resource_filename('functest',
- 'api/swagger/creds_action.yaml'),
- endpoint='{0}/action'.format(ENDPOINT_CREDS))
- def post(self):
- """ Used to handle post request """
- return self._dispatch_post()
-
- def update_openrc(self, args): # pylint: disable=no-self-use
- """ Used to update the OpenStack RC file """
- try:
- openrc_vars = args['openrc']
- except KeyError:
- return api_utils.result_handler(
- status=0, data='openrc must be provided')
- else:
- if not isinstance(openrc_vars, collections.Mapping):
- return api_utils.result_handler(
- status=0, data='args should be a dict')
-
- lines = ['export {}={}\n'.format(k, v) for k, v in openrc_vars.items()]
-
- rc_file = CONST.__getattribute__('openstack_creds')
- with open(rc_file, 'w') as creds_file:
- creds_file.writelines(lines)
-
- LOGGER.info("Sourcing the OpenStack RC file...")
- try:
- os_utils.source_credentials(rc_file)
- except Exception as err: # pylint: disable=broad-except
- LOGGER.exception('Failed to source the OpenStack RC file')
- return api_utils.result_handler(status=0, data=str(err))
-
- return api_utils.result_handler(
- status=0, data='Update openrc successfully')
diff --git a/functest/api/resources/v1/envs.py b/functest/api/resources/v1/envs.py
deleted file mode 100644
index 3e6f05ac9..000000000
--- a/functest/api/resources/v1/envs.py
+++ /dev/null
@@ -1,83 +0,0 @@
-#!/usr/bin/env python
-#
-# Copyright (c) 2017 Huawei Technologies Co.,Ltd and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-
-"""
-Resources to handle environment related requests
-"""
-
-import pkg_resources
-import socket
-
-import IPy
-from flask import jsonify
-from flasgger.utils import swag_from
-
-from functest.api.base import ApiResource
-from functest.api.common import api_utils
-from functest.cli.commands.cli_env import Env
-
-ADDRESS = socket.gethostbyname(socket.gethostname())
-ENDPOINT_ENVS = ('http://{}:5000/api/v1/functest/envs'.format(ADDRESS))
-
-
-class V1Envs(ApiResource):
- """ V1Envs Resource class"""
-
- @swag_from(
- pkg_resources.resource_filename('functest', 'api/swagger/envs.yaml'),
- endpoint=ENDPOINT_ENVS)
- def get(self): # pylint: disable=no-self-use
- """ Get environment """
- environment_show = Env().show()
- return jsonify(environment_show)
-
- @swag_from(
- pkg_resources.resource_filename('functest',
- 'api/swagger/envs_action.yaml'),
- endpoint='{0}/action'.format(ENDPOINT_ENVS))
- def post(self):
- """ Used to handle post request """
- return self._dispatch_post()
-
- def update_hosts(self, hosts_info): # pylint: disable=no-self-use
- """ Update hosts info """
-
- if not isinstance(hosts_info, dict):
- return api_utils.result_handler(
- status=1, data='Error, args should be a dict')
-
- for key, value in hosts_info.items():
- if key:
- try:
- IPy.IP(value)
- except Exception: # pylint: disable=broad-except
- return api_utils.result_handler(
- status=1, data='The IP %s is invalid' % value)
- else:
- return api_utils.result_handler(
- status=1, data='Domain name is absent')
-
- try:
- functest_flag = "# SUT hosts info for Functest"
- hosts_list = ('\n{} {} {}'.format(ip, host_name, functest_flag)
- for host_name, ip in hosts_info.items())
-
- with open("/etc/hosts", 'r') as file_hosts:
- origin_lines = [line for line in file_hosts
- if functest_flag not in line]
-
- with open("/etc/hosts", 'w') as file_hosts:
- file_hosts.writelines(origin_lines)
- file_hosts.write(functest_flag)
- file_hosts.writelines(hosts_list)
- except Exception: # pylint: disable=broad-except
- return api_utils.result_handler(
- status=1, data='Error when updating hosts info')
- else:
- return api_utils.result_handler(
- status=0, data='Update hosts info successfully')
diff --git a/functest/api/resources/v1/tasks.py b/functest/api/resources/v1/tasks.py
deleted file mode 100644
index 6bf625a88..000000000
--- a/functest/api/resources/v1/tasks.py
+++ /dev/null
@@ -1,111 +0,0 @@
-#!/usr/bin/env python
-
-# Copyright (c) 2017 Huawei Technologies Co.,Ltd and others.
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-
-"""
-Resources to retrieve the task results
-"""
-
-import errno
-import json
-import logging
-import os
-import pkg_resources
-import uuid
-
-from flask import jsonify
-from flasgger.utils import swag_from
-
-from functest.api.base import ApiResource
-from functest.api.common import api_utils
-from functest.api.database.v1.handlers import TasksHandler
-from functest.utils.constants import CONST
-
-
-LOGGER = logging.getLogger(__name__)
-
-
-class V1Task(ApiResource):
- """ V1Task Resource class"""
-
- @swag_from(pkg_resources.resource_filename(
- 'functest', 'api/swagger/task.yaml'))
- def get(self, task_id): # pylint: disable=no-self-use
- """ GET the result of the task id """
- try:
- uuid.UUID(task_id)
- except ValueError:
- return api_utils.result_handler(status=1, data='Invalid task id')
-
- task_handler = TasksHandler()
- try:
- task = task_handler.get_task_by_taskid(task_id)
- except ValueError:
- return api_utils.result_handler(status=1, data='No such task id')
-
- status = task.status
- LOGGER.debug('Task status is: %s', status)
-
- if status not in ['IN PROGRESS', 'FAIL', 'FINISHED']:
- return api_utils.result_handler(status=1,
- data='internal server error')
-
- switcher = {'IN PROGRESS': 0, 'FAIL': 1, 'FINISHED': 2}
- if status == 'IN PROGRESS':
- result = {'status': switcher.get(status), 'result': ''}
- elif status == 'FAIL':
- result = {'status': switcher.get(status), 'error': task.error}
- else:
- result = {'status': switcher.get(status),
- 'result': json.loads(task.result)}
-
- return jsonify(result)
-
-
-class V1TaskLog(ApiResource):
- """ V1TaskLog Resource class"""
-
- @swag_from(pkg_resources.resource_filename(
- 'functest', 'api/swagger/task_log.yaml'))
- def get(self, task_id): # pylint: disable=no-self-use
- """ GET the log of the task id """
- try:
- uuid.UUID(task_id)
- except ValueError:
- return api_utils.result_handler(status=1, data='Invalid task id')
-
- task_handler = TasksHandler()
- try:
- task = task_handler.get_task_by_taskid(task_id)
- except ValueError:
- return api_utils.result_handler(status=1, data='No such task id')
-
- task_log_dir = CONST.__getattribute__('dir_results')
- # pylint: disable=maybe-no-member
- index = int(self._get_args().get('index', 0))
-
- try:
- with open(os.path.join(task_log_dir,
- '{}.log'.format(task_id)), 'r') as log_file:
- log_file.seek(index)
- data = log_file.readlines()
- index = log_file.tell()
- except OSError as err:
- if err.errno == errno.ENOENT:
- return api_utils.result_handler(
- status=1, data='Log file does not exist')
-
- return api_utils.result_handler(
- status=1, data='Error with log file')
-
- return_data = {'data': data, 'index': index}
-
- switcher = {'IN PROGRESS': 0, 'FAIL': 1, 'FINISHED': 2}
-
- return api_utils.result_handler(status=switcher.get(task.status),
- data=return_data)
diff --git a/functest/api/resources/v1/testcases.py b/functest/api/resources/v1/testcases.py
deleted file mode 100644
index 01571548d..000000000
--- a/functest/api/resources/v1/testcases.py
+++ /dev/null
@@ -1,156 +0,0 @@
-#!/usr/bin/env python
-
-# Copyright (c) 2017 Huawei Technologies Co.,Ltd and others.
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-
-"""
-Resources to handle testcase related requests
-"""
-
-import logging
-import os
-import re
-import pkg_resources
-import socket
-import uuid
-
-import ConfigParser
-from flask import jsonify
-from flasgger.utils import swag_from
-
-from functest.api.base import ApiResource
-from functest.api.common import api_utils, thread
-from functest.cli.commands.cli_testcase import Testcase
-from functest.api.database.v1.handlers import TasksHandler
-from functest.utils.constants import CONST
-import functest.utils.functest_utils as ft_utils
-
-LOGGER = logging.getLogger(__name__)
-
-ADDRESS = socket.gethostbyname(socket.gethostname())
-ENDPOINT_TESTCASES = ('http://{}:5000/api/v1/functest/testcases'
- .format(ADDRESS))
-
-
-class V1Testcases(ApiResource):
- """ V1Testcases Resource class"""
-
- @swag_from(pkg_resources.resource_filename(
- 'functest', 'api/swagger/testcases.yaml'))
- def get(self): # pylint: disable=no-self-use
- """ GET all testcases """
- testcases_list = Testcase().list()
- result = {'testcases': re.split(' |\n ', testcases_list)[1:]}
- return jsonify(result)
-
-
-class V1Testcase(ApiResource):
- """ V1Testcase Resource class"""
-
- @swag_from(
- pkg_resources.resource_filename('functest',
- 'api/swagger/testcase.yaml'),
- endpoint='{0}/<testcase_name>'.format(ENDPOINT_TESTCASES))
- def get(self, testcase_name): # pylint: disable=no-self-use
- """ GET the info of one testcase"""
- testcase = Testcase().show(testcase_name)
- if not testcase:
- return api_utils.result_handler(
- status=1,
- data="The test case '%s' does not exist or is not supported"
- % testcase_name)
-
- testcase_info = api_utils.change_obj_to_dict(testcase)
- dependency_dict = api_utils.change_obj_to_dict(
- testcase_info.get('dependency'))
- testcase_info.pop('name')
- testcase_info.pop('dependency')
- result = {'testcase': testcase_name}
- result.update(testcase_info)
- result.update({'dependency': dependency_dict})
- return jsonify(result)
-
- @swag_from(
- pkg_resources.resource_filename('functest',
- 'api/swagger/testcase_run.yaml'),
- endpoint='{0}/action'.format(ENDPOINT_TESTCASES))
- def post(self):
- """ Used to handle post request """
- return self._dispatch_post()
-
- def run_test_case(self, args):
- """ Run a testcase """
- try:
- case_name = args['testcase']
- except KeyError:
- return api_utils.result_handler(
- status=1, data='testcase name must be provided')
-
- testcase = Testcase().show(case_name)
- if not testcase:
- return api_utils.result_handler(
- status=1,
- data="The test case '%s' does not exist or is not supported"
- % case_name)
-
- task_id = str(uuid.uuid4())
-
- task_args = {'testcase': case_name, 'task_id': task_id}
-
- task_args.update(args.get('opts', {}))
-
- task_thread = thread.TaskThread(self._run, task_args, TasksHandler())
- task_thread.start()
-
- result = {'testcase': case_name, 'task_id': task_id}
- return jsonify({'result': result})
-
- def _run(self, args): # pylint: disable=no-self-use
- """ The built_in function to run a test case """
-
- case_name = args.get('testcase')
- self._update_logging_ini(args.get('task_id'))
-
- try:
- cmd = "run_tests -t {}".format(case_name)
- runner = ft_utils.execute_command(cmd)
- except Exception: # pylint: disable=broad-except
- result = 'FAIL'
- LOGGER.exception("Running test case %s failed!", case_name)
- if runner == os.EX_OK:
- result = 'PASS'
- else:
- result = 'FAIL'
-
- env_info = {
- 'installer': CONST.__getattribute__('INSTALLER_TYPE'),
- 'scenario': CONST.__getattribute__('DEPLOY_SCENARIO'),
- 'build_tag': CONST.__getattribute__('BUILD_TAG'),
- 'ci_loop': CONST.__getattribute__('CI_LOOP')
- }
- result = {
- 'task_id': args.get('task_id'),
- 'testcase': case_name,
- 'env_info': env_info,
- 'result': result
- }
-
- return {'result': result}
-
- def _update_logging_ini(self, task_id): # pylint: disable=no-self-use
- """ Update the log file for each task"""
- config = ConfigParser.RawConfigParser()
- config.read(
- pkg_resources.resource_filename('functest', 'ci/logging.ini'))
- log_path = os.path.join(CONST.__getattribute__('dir_results'),
- '{}.log'.format(task_id))
- config.set('handler_file', 'args', '("{}",)'.format(log_path))
-
- with open(
- pkg_resources.resource_filename(
- 'functest', 'ci/logging.ini'), 'wb') as configfile:
- config.write(configfile)
diff --git a/functest/api/resources/v1/tiers.py b/functest/api/resources/v1/tiers.py
deleted file mode 100644
index 523df130e..000000000
--- a/functest/api/resources/v1/tiers.py
+++ /dev/null
@@ -1,82 +0,0 @@
-#!/usr/bin/env python
-
-# Copyright (c) 2017 Huawei Technologies Co.,Ltd and others.
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-
-"""
-Resources to handle tier related requests
-"""
-
-import pkg_resources
-import re
-
-from flask import jsonify
-from flasgger.utils import swag_from
-
-from functest.api.base import ApiResource
-from functest.api.common import api_utils
-from functest.cli.commands.cli_tier import Tier
-
-
-class V1Tiers(ApiResource):
- """ V1Tiers Resource class """
-
- @swag_from(pkg_resources.resource_filename(
- 'functest', 'api/swagger/tiers.yaml'))
- def get(self):
- # pylint: disable=no-self-use
- """ GET all tiers """
- tiers_list = Tier().list()
- data = re.split("[\n\t]", tiers_list)
- data = [i.strip() for i in data if i != '']
- data_dict = dict()
- for i in range(len(data) / 2):
- one_data = {data[i * 2].lstrip('- ').rstrip(':'): data[i * 2 + 1]}
- if i == 0:
- data_dict = one_data
- else:
- data_dict.update(one_data)
- result = {'tiers': data_dict}
- return jsonify(result)
-
-
-class V1Tier(ApiResource):
- """ V1Tier Resource class """
-
- @swag_from(pkg_resources.resource_filename(
- 'functest', 'api/swagger/tier.yaml'))
- def get(self, tier_name): # pylint: disable=no-self-use
- """ GET the info of one tier """
- tier_info = Tier().show(tier_name)
- if not tier_info:
- return api_utils.result_handler(
- status=1,
- data="The tier with name '%s' does not exist." % tier_name)
- tier_info.__dict__.pop('name')
- tier_info.__dict__.pop('tests_array')
- tier_info.__dict__.pop('skipped_tests_array')
- testcases = Tier().gettests(tier_name)
- result = {'tier': tier_name, 'testcases': testcases}
- result.update(tier_info.__dict__)
- return jsonify(result)
-
-
-class V1TestcasesinTier(ApiResource):
- """ V1TestcasesinTier Resource class """
-
- @swag_from(pkg_resources.resource_filename(
- 'functest', 'api/swagger/testcases_in_tier.yaml'))
- def get(self, tier_name): # pylint: disable=no-self-use
- """ GET all testcases within given tier """
- tier_info = Tier().show(tier_name)
- if not tier_info:
- return api_utils.result_handler(
- status=1,
- data="The tier with name '%s' does not exist." % tier_name)
- testcases = Tier().gettests(tier_name)
- result = {'tier': tier_name, 'testcases': testcases}
- return jsonify(result)
diff --git a/functest/api/server.py b/functest/api/server.py
deleted file mode 100644
index 3200c1a2f..000000000
--- a/functest/api/server.py
+++ /dev/null
@@ -1,106 +0,0 @@
-#!/usr/bin/env python
-
-# Copyright (c) 2017 Huawei Technologies Co.,Ltd and others.
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-
-"""
-Used to launch Functest RestApi
-
-"""
-
-import inspect
-import logging
-import socket
-from urlparse import urljoin
-import pkg_resources
-
-from flask import Flask
-from flask_restful import Api
-from flasgger import Swagger
-
-from functest.api.base import ApiResource
-from functest.api.common import api_utils
-from functest.api.database.db import BASE
-from functest.api.database.db import DB_SESSION
-from functest.api.database.db import ENGINE
-from functest.api.database.v1 import models
-from functest.api.urls import URLPATTERNS
-
-
-LOGGER = logging.getLogger(__name__)
-
-APP = Flask(__name__)
-API = Api(APP)
-Swagger(APP)
-
-
-@APP.teardown_request
-def shutdown_session(exception=None): # pylint: disable=unused-argument
- """
- To be called at the end of each request whether it is successful
- or an exception is raised
- """
- DB_SESSION.remove()
-
-
-def get_resource(resource_name):
- """ Obtain the required resource according to resource name """
- name = ''.join(resource_name.split('_'))
- return next((r for r in api_utils.itersubclasses(ApiResource)
- if r.__name__.lower() == name))
-
-
-def get_endpoint(url):
- """ Obtain the endpoint of url """
- address = socket.gethostbyname(socket.gethostname())
- return urljoin('http://{}:5000'.format(address), url)
-
-
-def api_add_resource():
- """
- The resource has multiple URLs and you can pass multiple URLs to the
- add_resource() method on the Api object. Each one will be routed to
- your Resource
- """
- for url_pattern in URLPATTERNS:
- try:
- API.add_resource(
- get_resource(url_pattern.target), url_pattern.url,
- endpoint=get_endpoint(url_pattern.url))
- except StopIteration:
- LOGGER.error('url resource not found: %s', url_pattern.url)
-
-
-def init_db():
- """
- Import all modules here that might define models so that
- they will be registered properly on the metadata, and then
- create a database
- """
- def func(subcls):
- """ To check the subclasses of BASE"""
- try:
- if issubclass(subcls[1], BASE):
- return True
- except TypeError:
- pass
- return False
- # pylint: disable=bad-builtin
- subclses = filter(func, inspect.getmembers(models, inspect.isclass))
- LOGGER.debug('Import models: %s', [subcls[1] for subcls in subclses])
- BASE.metadata.create_all(bind=ENGINE)
-
-
-def main():
- """Entry point"""
- logging.config.fileConfig(pkg_resources.resource_filename(
- 'functest', 'ci/logging.ini'))
- logging.captureWarnings(True)
- LOGGER.info('Starting Functest server')
- api_add_resource()
- init_db()
- APP.run(host='0.0.0.0')
diff --git a/functest/api/swagger/creds.yaml b/functest/api/swagger/creds.yaml
deleted file mode 100644
index eec7cb345..000000000
--- a/functest/api/swagger/creds.yaml
+++ /dev/null
@@ -1,36 +0,0 @@
----
-Show credentials
-
-This api offers the interface to show credentials.
-The credentials dict will be returned.
----
-tags:
- - Creds
-definitions:
- Credentials:
- type: object
- properties:
- creds_name:
- $ref: '#/definitions/Name'
- Name:
- type: dict
-responses:
- 200:
- description: Show credentials
- schema:
- $ref: '#/definitions/Credentials'
- examples:
- "OS_AUTH_URL": "https://192.16.1.222:5000/v3"
- "OS_AUTH_VERSION": "3"
- "OS_CACERT": "/home/opnfv/functest/conf/os_cacert"
- "OS_ENDPOINT_TYPE": "publicURL"
- "OS_IDENTITY_API_VERSION": "3"
- "OS_INTERFACE": "publicURL"
- "OS_NO_CACHE": "1"
- "OS_PASSWORD": "990232e0885da343ac805528522d"
- "OS_PROJECT_DOMAIN_NAME": "Default"
- "OS_PROJECT_NAME": "admin"
- "OS_REGION_NAME": "RegionOne"
- "OS_TENANT_NAME": "admin"
- "OS_USERNAME": "admin"
- "OS_USER_DOMAIN_NAME": "Default"
diff --git a/functest/api/swagger/creds_action.yaml b/functest/api/swagger/creds_action.yaml
deleted file mode 100644
index 7e7653bb5..000000000
--- a/functest/api/swagger/creds_action.yaml
+++ /dev/null
@@ -1,56 +0,0 @@
----
-Update openrc
-
-This api offers the interface to Update openstack.creds.
----
-tags:
- - Creds
-parameters:
- - in: body
- name: body
- description: this is the input json dict
- schema:
- required:
- - action
- - args
- properties:
- action:
- type: string
- description: this is action for creds
- default: update_openrc
- args:
- schema:
- required:
- - openrc
- properties:
- openrc:
- type: string
- description: this is the test case name
- default:
- "OS_AUTH_URL": "http://192.16.1.222:5000/v3"
- "OS_ENDPOINT_TYPE": "publicURL"
- "OS_IDENTITY_API_VERSION": "3"
- "OS_INTERFACE": "publicURL"
- "OS_PASSWORD": "admn"
- "OS_PROJECT_DOMAIN_NAME": "Default"
- "OS_PROJECT_NAME": "admin"
- "OS_REGION_NAME": "RegionOne"
- "OS_TENANT_NAME": "admin"
- "OS_USERNAME": "admin"
- "OS_USER_DOMAIN_NAME": "Default"
-definitions:
- Credentials:
- type: object
- properties:
- creds_name:
- $ref: '#/definitions/Name'
- Name:
- type: dict
-responses:
- 200:
- description: Update openrc
- schema:
- $ref: '#/definitions/Credentials'
- examples:
- 'status': 0
- 'result': 'Update openrc successfully'
diff --git a/functest/api/swagger/envs.yaml b/functest/api/swagger/envs.yaml
deleted file mode 100644
index 4ff50c86c..000000000
--- a/functest/api/swagger/envs.yaml
+++ /dev/null
@@ -1,27 +0,0 @@
----
-Show environment
-
-This api offers the interface to show environment.
-The environment dict will be returned.
----
-tags:
- - Envs
-definitions:
- Environment:
- type: object
- properties:
- creds_name:
- $ref: '#/definitions/Name'
- Name:
- type: dict
-responses:
- 200:
- description: Show environment
- schema:
- $ref: '#/definitions/Environment'
- examples:
- "DEBUG FLAG": "false"
- "INSTALLER": "compass, 192.168.200.2"
- "POD": "unknown_pod"
- "SCENARIO": "os-nosdn-nofeature-noha"
- "STATUS": "ready"
diff --git a/functest/api/swagger/envs_action.yaml b/functest/api/swagger/envs_action.yaml
deleted file mode 100644
index 3ad6c880d..000000000
--- a/functest/api/swagger/envs_action.yaml
+++ /dev/null
@@ -1,42 +0,0 @@
----
-Update hosts info
-
-This api offers the interface to update hosts info.
----
-tags:
- - Envs
-parameters:
- - in: body
- name: body
- description: this is the input json dict
- schema:
- required:
- - action
- - args
- properties:
- action:
- type: string
- description: this is action for envs
- default: update_hosts
- args:
- type: string
- description: Hosts info to be updated
- default:
- "identity.ac.dz.com": "8.20.11.22"
- "image.ac.dz.com": "8.20.11.22"
-definitions:
- Environment:
- type: object
- properties:
- creds_name:
- $ref: '#/definitions/Name'
- Name:
- type: dict
-responses:
- 200:
- description: Update hosts info
- schema:
- $ref: '#/definitions/Environment'
- examples:
- 'status': 0
- 'result': 'Update hosts info successfully'
diff --git a/functest/api/swagger/task.yaml b/functest/api/swagger/task.yaml
deleted file mode 100644
index 3375b9065..000000000
--- a/functest/api/swagger/task.yaml
+++ /dev/null
@@ -1,37 +0,0 @@
----
-Get the result of the specified task
-
-This api offers the interface to get the result of the specified task.
----
-tags:
- - Tasks
-parameters:
- - name: task_id
- description: task id
- in: path
- type: string
- required: true
-definitions:
- Task:
- type: object
- properties:
- creds_name:
- $ref: '#/definitions/Result'
- Result:
- type: dict
-responses:
- 200:
- description: Get the result of the specified task
- schema:
- $ref: '#/definitions/Task'
- examples:
- "result": {
- "case_name": "vping_ssh",
- "env_info": {
- "build_tag": null,
- "ci_loop": "weekly",
- "installer": "compass",
- "scenario": "os-nosdn-nofeature-noha"},
- "result": "PASS",
- "task_id": "1a9f3c5d-ce0b-4354-862e-dd08b26fc484"}
- "status": 2
diff --git a/functest/api/swagger/task_log.yaml b/functest/api/swagger/task_log.yaml
deleted file mode 100644
index 120a8f6f7..000000000
--- a/functest/api/swagger/task_log.yaml
+++ /dev/null
@@ -1,37 +0,0 @@
----
-Get the log of the specified task
-
-This api offers the interface to get the log of the specified task.
----
-tags:
- - Tasks
-parameters:
- - name: task_id
- description: task id
- in: path
- type: string
- required: true
-definitions:
- Task:
- type: object
- properties:
- creds_name:
- $ref: '#/definitions/Result'
- Result:
- type: dict
-responses:
- 200:
- description: Get the log of the specified task
- schema:
- $ref: '#/definitions/Task'
- examples:
- "result": {
- "data": [
- "2017-09-14 06:46:26,106 - functest.ci.run_tests - DEBUG ",
- "- Sourcing the OpenStack RC file... ",
- "2017-09-14 06:46:26,107 - functest.ci.run_tests - DEBUG ",
- "- Test args: connection_check ",
- "2017-09-14 06:46:26,107 - functest.ci.run_tests - INFO ",
- "- Running test case 'connection_check'... ",
- "..."]}
- "status": 2
diff --git a/functest/api/swagger/testcase.yaml b/functest/api/swagger/testcase.yaml
deleted file mode 100644
index 34c13d217..000000000
--- a/functest/api/swagger/testcase.yaml
+++ /dev/null
@@ -1,36 +0,0 @@
----
-Show the info of one testcase
-
-This api offers the interface to show the detailed info of one testcase.
-The info of one testcase will be returned.
----
-tags:
- - Testcases
-parameters:
- - name: testcase_name
- description: testcase name
- in: path
- type: string
- required: true
-definitions:
- Testcases:
- type: object
- properties:
- case_name:
- $ref: '#/definitions/Tests'
- Tests:
- type: dict
-responses:
- 200:
- description: Show the detailed info of one testcase
- schema:
- $ref: '#/definitions/Testcases'
- examples:
- "testcase": ""
- "blocking":
- "criteria":
- "dependency": {
- "installer": "",
- "scenario": ""}
- "description": ""
- "enabled":
diff --git a/functest/api/swagger/testcase_run.yaml b/functest/api/swagger/testcase_run.yaml
deleted file mode 100644
index 7b254c86b..000000000
--- a/functest/api/swagger/testcase_run.yaml
+++ /dev/null
@@ -1,46 +0,0 @@
----
-Run a test case
-
-This api offers the interface to run a test case
----
-tags:
- - Testcases
-parameters:
- - in: body
- name: body
- description: this is the input json dict
- schema:
- required:
- - action
- - args
- properties:
- action:
- type: string
- description: this is action for creds
- default: run_test_case
- args:
- schema:
- required:
- - testcase
- properties:
- testcase:
- type: string
- description: this is the test case name
- default:
- vping_ssh
-definitions:
- Testcases:
- type: object
- properties:
- creds_name:
- $ref: '#/definitions/Tests'
- Tests:
- type: dict
-responses:
- 200:
- description: Run a test case
- schema:
- $ref: '#/definitions/Testcases'
- examples:
- 'task_id': '94c8ec94-d873-466f-a205-bf592f31ff5b'
- 'testcase': 'vping_ssh'
diff --git a/functest/api/swagger/testcases.yaml b/functest/api/swagger/testcases.yaml
deleted file mode 100644
index 1dea21524..000000000
--- a/functest/api/swagger/testcases.yaml
+++ /dev/null
@@ -1,23 +0,0 @@
----
-List all test cases
-
-This api offers the interface to list all test cases
-The testcases list will be returned
----
-tags:
- - Testcases
-definitions:
- Testcases:
- type: object
- properties:
- creds_name:
- $ref: '#/definitions/Tests'
- Tests:
- type: dict
-responses:
- 200:
- description: List all test cases
- schema:
- $ref: '#/definitions/Testcases'
- examples:
- "testcases": []
diff --git a/functest/api/swagger/testcases_in_tier.yaml b/functest/api/swagger/testcases_in_tier.yaml
deleted file mode 100644
index af195ceb5..000000000
--- a/functest/api/swagger/testcases_in_tier.yaml
+++ /dev/null
@@ -1,30 +0,0 @@
----
-List all testcases within given tier
-
-This api offers the interface to list all testcases within given tier.
-All testcases within given tier will be returned.
----
-tags:
- - Tiers
-parameters:
- - name: tier_name
- description: tier name
- in: path
- type: string
- required: true
-definitions:
- Testcases:
- type: object
- properties:
- creds_name:
- $ref: '#/definitions/Tests'
- Tests:
- type: dict
-responses:
- 200:
- description: List all testcases within given tier
- schema:
- $ref: '#/definitions/Testcases'
- examples:
- "tier": ""
- "testcases": []
diff --git a/functest/api/swagger/tier.yaml b/functest/api/swagger/tier.yaml
deleted file mode 100644
index 250cddf77..000000000
--- a/functest/api/swagger/tier.yaml
+++ /dev/null
@@ -1,33 +0,0 @@
----
-Show the info of one tier
-
-This api offers the interface to show the detailed info of one tier.
-The info of one tier will be returned.
----
-tags:
- - Tiers
-parameters:
- - name: tier_name
- description: tier name
- in: path
- type: string
- required: true
-definitions:
- Tiers:
- type: object
- properties:
- creds_name:
- $ref: '#/definitions/Name'
- Name:
- type: string
-responses:
- 200:
- description: Show the detailed info of one tier
- schema:
- $ref: '#/definitions/Tiers'
- examples:
- "tier": ""
- "ci_loop": ""
- "description": ""
- "order":
- "testcases": []
diff --git a/functest/api/swagger/tiers.yaml b/functest/api/swagger/tiers.yaml
deleted file mode 100644
index d42b2cd98..000000000
--- a/functest/api/swagger/tiers.yaml
+++ /dev/null
@@ -1,23 +0,0 @@
----
-List all tiers
-
-This api offers the interface to list all tiers.
-The tiers list will be returned.
----
-tags:
- - Tiers
-definitions:
- Tiers:
- type: object
- properties:
- creds_name:
- $ref: '#/definitions/Tier'
- Tier:
- type: dict
-responses:
- 200:
- description: List all tiers
- schema:
- $ref: '#/definitions/Tiers'
- examples:
- "tiers": ""
diff --git a/functest/api/urls.py b/functest/api/urls.py
deleted file mode 100644
index 10b7b2936..000000000
--- a/functest/api/urls.py
+++ /dev/null
@@ -1,70 +0,0 @@
-#!/usr/bin/env python
-
-# Copyright (c) 2017 Huawei Technologies Co.,Ltd and others.
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-
-"""
-Define multiple URLs
-"""
-
-
-class Url(object): # pylint: disable=too-few-public-methods
- """ Url Class """
-
- def __init__(self, url, target):
- super(Url, self).__init__()
- self.url = url
- self.target = target
-
-
-URLPATTERNS = [
- # GET /api/v1/functest/envs => GET environment
- Url('/api/v1/functest/envs', 'v1_envs'),
-
- # POST /api/v1/functest/envs/action
- # {"action":"update_hosts", "args": {}} => Update hosts info
- Url('/api/v1/functest/envs/action', 'v1_envs'),
-
- # GET /api/v1/functest/openstack/credentials => GET credentials
- Url('/api/v1/functest/openstack/credentials', 'v1_creds'),
-
- # POST /api/v1/functest/openstack/action
- # {"action":"update_openrc", "args": {"openrc": {}}} => Update openrc
- Url('/api/v1/functest/openstack/action', 'v1_creds'),
-
- # GET /api/v1/functest/testcases => GET all testcases
- Url('/api/v1/functest/testcases', 'v1_test_cases'),
-
- # GET /api/v1/functest/testcases/<testcase_name>
- # => GET the info of one testcase
- Url('/api/v1/functest/testcases/<testcase_name>', 'v1_testcase'),
-
- # POST /api/v1/functest/testcases/action
- # {"action":"run_test_case", "args": {"opts": {}, "testcase": "vping_ssh"}}
- # => Run a testcase
- Url('/api/v1/functest/testcases/action', 'v1_testcase'),
-
- # GET /api/v1/functest/testcases => GET all tiers
- Url('/api/v1/functest/tiers', 'v1_tiers'),
-
- # GET /api/v1/functest/tiers/<tier_name>
- # => GET the info of one tier
- Url('/api/v1/functest/tiers/<tier_name>', 'v1_tier'),
-
- # GET /api/v1/functest/tiers/<tier_name>/testcases
- # => GET all testcases within given tier
- Url('/api/v1/functest/tiers/<tier_name>/testcases',
- 'v1_testcases_in_tier'),
-
- # GET /api/v1/functest/tasks/<task_id>
- # => GET the result of the task id
- Url('/api/v1/functest/tasks/<task_id>', 'v1_task'),
-
- # GET /api/v1/functest/tasks/<task_id>/log
- # => GET the log of the task
- Url('/api/v1/functest/tasks/<task_id>/log', 'v1_task_log')
-]
diff --git a/functest/ci/add_proxy.sh b/functest/ci/add_proxy.sh
new file mode 100644
index 000000000..9d7db22e4
--- /dev/null
+++ b/functest/ci/add_proxy.sh
@@ -0,0 +1,138 @@
+#!/bin/sh
+
+set -e
+
+initdir=$(pwd)
+cd "${1:-/home/opnfv/functest/images}"
+
+http_proxy_host=${http_proxy_host:-proxy}
+http_proxy_port=${http_proxy_port:-8080}
+
+http_proxy=http://${http_proxy_host}:${http_proxy_port}
+https_proxy=${https_proxy:-${http_proxy:-http://proxy:8080}}
+ftp_proxy=${ftp_proxy:-${http_proxy:-http://proxy:8080}}
+no_proxy=${no_proxy:-"10.0.0.0/8,172.16.0.0/12,192.168.0.0/16"}
+
+images=${images-"\
+ubuntu-14.04-server-cloudimg-amd64-disk1.img \
+ubuntu-16.04-server-cloudimg-amd64-disk1.img"}
+
+add_proxy () {
+ cat << EOF >> "$1"
+http_proxy=${http_proxy}
+HTTP_PROXY=${http_proxy}
+https_proxy=${https_proxy}
+HTTPS_PROXY=${https_proxy}
+ftp_proxy=${ftp_proxy}
+FTP_PROXY=${ftp_proxy}
+no_proxy=${no_proxy}
+NO_PROXY=${no_proxy}
+EOF
+}
+
+add_proxy_apt () {
+ cat << EOF >> "$1"
+Acquire::http::Proxy "${http_proxy}";
+Acquire::https::Proxy "${https_proxy}";
+EOF
+}
+
+add_proxy_juju_env () {
+ cat << EOF >> "$1"
+export no_proxy="${no_proxy}";
+export NO_PROXY="${no_proxy}";
+EOF
+}
+
+add_proxy_juju_systemd () {
+ cat << EOF >> "$1"
+[Manager]
+DefaultEnvironment="no_proxy='${no_proxy}'" "NO_PROXY='${no_proxy}'"
+EOF
+}
+
+add_proxy_maven () {
+ cat << EOF >> "$1"
+<settings>
+ <proxies>
+ <proxy>
+ <id>example-proxy</id>
+ <active>true</active>
+ <protocol>http</protocol>
+ <host>"${http_proxy_host}"</host>
+ <port>"${http_proxy_port}"</port>
+ </proxy>
+ </proxies>
+</settings>
+EOF
+}
+
+add_proxy_svn () {
+ cat << EOF >> "$1"
+[global]
+http-proxy-host = "${http_proxy_host}"
+http-proxy-port = "${http_proxy_port}"
+EOF
+}
+
+add_proxy_pip () {
+ cat << EOF >> "$1"
+[global]
+proxy="${http_proxy}"
+EOF
+}
+
+tmpdir=$(mktemp -d)
+for image in $images; do
+ if [ ! -f "$image" ]; then
+ echo "skip ${image} ($(pwd)/${image} not found)"
+ continue
+ fi
+ guestmount -a "${image}" -i --rw "${tmpdir}"
+ add_proxy "${tmpdir}/etc/environment"
+ if expr "$image" : 'ubuntu' ; then
+ add_proxy_apt "${tmpdir}/etc/apt/apt.conf"
+ add_proxy_juju_env "${tmpdir}/etc/juju-proxy.conf"
+ add_proxy_juju_systemd "${tmpdir}/etc/juju-proxy-systemd.conf"
+ mkdir -p ${tmpdir}/root/.m2
+ mkdir -p ${tmpdir}/root/.subversion
+ add_proxy_maven "${tmpdir}/root/.m2/settings.xml"
+ add_proxy_svn "${tmpdir}/root/.subversion/servers"
+ add_proxy_pip "${tmpdir}/etc/pip.conf"
+ fi
+ guestunmount "${tmpdir}"
+done
+
+if [ -f cloudify-docker-manager-community-19.01.24.tar ]; then
+ sudo docker load -i cloudify-docker-manager-community-19.01.24.tar
+ dockerfile=${tmpdir}/Dockerfile
+ cat << EOF > $dockerfile
+FROM docker-cfy-manager:latest
+ENV HTTP_PROXY "${http_proxy}"
+ENV HTTPS_PROXY "${https_proxy}"
+ENV NO_PROXY "${no_proxy}"
+EOF
+ for f in /etc/sysconfig/cloudify-mgmtworker /etc/sysconfig/cloudify-restservice; do \
+ cat << EOF >> $dockerfile
+RUN echo >> $f
+RUN echo "http_proxy=${http_proxy}" >> $f
+RUN echo "https_proxy=${https_proxy}" >> $f
+RUN echo "HTTP_PROXY=${http_proxy}" >> $f
+RUN echo "HTTPS_PROXY=${https_proxy}" >> $f
+RUN echo "no_proxy=${no_proxy}" >> $f
+EOF
+ done
+ sudo docker build -t docker-cfy-manager -f $dockerfile ${tmpdir}
+ sudo docker save \
+ docker-cfy-manager > cloudify-docker-manager-community-19.01.24.tar
+ sudo docker rmi docker-cfy-manager
+
+ rm "${dockerfile}"
+else
+ echo "skip cloudify-docker-manager-community-19.01.24.tar \
+ ($(pwd)/cloudify-docker-manager-community-19.01.24.tar not found)"
+fi
+
+rmdir "${tmpdir}"
+cd initdir
+
diff --git a/functest/ci/check_deployment.py b/functest/ci/check_deployment.py
deleted file mode 100644
index 9453c6d49..000000000
--- a/functest/ci/check_deployment.py
+++ /dev/null
@@ -1,184 +0,0 @@
-#!/usr/bin/env python
-
-# Copyright (c) 2017 Ericsson and others.
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-
-"""
-OpenStack deployment checker
-
-Verifies that:
- - Credentials file is given and contains the right information
- - OpenStack endpoints are reachable
-"""
-
-import logging
-import logging.config
-import os
-import pkg_resources
-from six.moves import urllib
-import socket
-
-from functest.opnfv_tests.openstack.snaps import snaps_utils
-
-from snaps.openstack.tests import openstack_tests
-from snaps.openstack.utils import glance_utils
-from snaps.openstack.utils import keystone_utils
-from snaps.openstack.utils import neutron_utils
-from snaps.openstack.utils import nova_utils
-
-__author__ = "Jose Lausuch <jose.lausuch@ericsson.com>"
-
-LOGGER = logging.getLogger(__name__)
-
-
-def verify_connectivity(endpoint):
- """ Returns true if an hostname/port is reachable"""
- connection = socket.socket()
- connection.settimeout(10)
- hostname = urllib.parse.urlparse(endpoint).hostname
- port = urllib.parse.urlparse(endpoint).port
- if not port:
- port = 443 if urllib.parse.urlparse(endpoint).scheme == "https" else 80
- try:
- connection.connect((hostname, port))
- LOGGER.debug('%s:%s is reachable!', hostname, port)
- return True
- except socket.error:
- LOGGER.exception('%s:%s is not reachable.', hostname, port)
- return False
-
-
-def get_auth_token(os_creds):
- """ Get auth token """
- sess = keystone_utils.keystone_session(os_creds)
- try:
- return sess.get_token()
- except Exception as error:
- LOGGER.error("Got token ...FAILED")
- raise error
-
-
-class CheckDeployment(object):
- """ Check deployment class."""
-
- def __init__(self, rc_file='/home/opnfv/functest/conf/openstack.creds'):
- self.rc_file = rc_file
- self.services = ('compute', 'network', 'image')
- self.os_creds = None
-
- def check_rc(self):
- """ Check if RC file exists and contains OS_AUTH_URL """
- if not os.path.isfile(self.rc_file):
- raise IOError('RC file {} does not exist!'.format(self.rc_file))
- if 'OS_AUTH_URL' not in open(self.rc_file).read():
- raise SyntaxError('OS_AUTH_URL not defined in {}.'.
- format(self.rc_file))
-
- def check_auth_endpoint(self):
- """ Verifies connectivity to the OS_AUTH_URL given in the RC file
- and get auth token"""
- rc_endpoint = self.os_creds.auth_url
- if not verify_connectivity(rc_endpoint):
- raise Exception("OS_AUTH_URL {} is not reachable.".
- format(rc_endpoint))
- LOGGER.info("Connectivity to OS_AUTH_URL %s ...OK", rc_endpoint)
- if get_auth_token(self.os_creds):
- LOGGER.info("Got token ...OK")
-
- def check_public_endpoint(self):
- """ Gets the public endpoint and verifies connectivity to it """
- public_endpoint = keystone_utils.get_endpoint(self.os_creds,
- 'identity',
- interface='public')
- if not verify_connectivity(public_endpoint):
- raise Exception("Public endpoint {} is not reachable.".
- format(public_endpoint))
- LOGGER.info("Connectivity to the public endpoint %s ...OK",
- public_endpoint)
-
- def check_service_endpoint(self, service):
- """ Verifies connectivity to a given openstack service """
- endpoint = keystone_utils.get_endpoint(self.os_creds,
- service,
- interface='public')
- if not verify_connectivity(endpoint):
- raise Exception("{} endpoint {} is not reachable.".
- format(service, endpoint))
- LOGGER.info("Connectivity to endpoint '%s' %s ...OK",
- service, endpoint)
-
- def check_nova(self):
- """ checks that a simple nova operation works """
- try:
- client = nova_utils.nova_client(self.os_creds)
- client.servers.list()
- LOGGER.info("Nova service ...OK")
- except Exception as error:
- LOGGER.error("Nova service ...FAILED")
- raise error
-
- def check_neutron(self):
- """ checks that a simple neutron operation works """
- try:
- client = neutron_utils.neutron_client(self.os_creds)
- client.list_networks()
- LOGGER.info("Neutron service ...OK")
- except Exception as error:
- LOGGER.error("Neutron service ...FAILED")
- raise error
-
- def check_glance(self):
- """ checks that a simple glance operation works """
- try:
- client = glance_utils.glance_client(self.os_creds)
- client.images.list()
- LOGGER.info("Glance service ...OK")
- except Exception as error:
- LOGGER.error("Glance service ...FAILED")
- raise error
-
- def check_ext_net(self):
- """ checks if external network exists """
- ext_net = snaps_utils.get_ext_net_name(self.os_creds)
- if ext_net:
- LOGGER.info("External network found: %s", ext_net)
- else:
- raise Exception("ERROR: No external networks in the deployment.")
-
- def check_all(self):
- """
- Calls all the class functions and returns 0 if all of them succeed.
- This is the method called by CLI
- """
- self.check_rc()
- try:
- self.os_creds = openstack_tests.get_credentials(
- os_env_file=self.rc_file,
- proxy_settings_str=None,
- ssh_proxy_cmd=None)
- except:
- raise Exception("Problem while getting credentials object.")
- if self.os_creds is None:
- raise Exception("Credentials is None.")
- self.check_auth_endpoint()
- self.check_public_endpoint()
- for service in self.services:
- self.check_service_endpoint(service)
- self.check_nova()
- self.check_neutron()
- self.check_glance()
- self.check_ext_net()
- return 0
-
-
-def main():
- """Entry point"""
- logging.config.fileConfig(pkg_resources.resource_filename(
- 'functest', 'ci/logging.ini'))
- logging.captureWarnings(True)
- deployment = CheckDeployment()
- return deployment.check_all()
diff --git a/functest/ci/config_aarch64_patch.yaml b/functest/ci/config_aarch64_patch.yaml
index a87fe25be..278265620 100644
--- a/functest/ci/config_aarch64_patch.yaml
+++ b/functest/ci/config_aarch64_patch.yaml
@@ -1,56 +1,99 @@
---
os:
- general:
- openstack:
- image_name: TestVM
- image_file_name: cirros-d161201-aarch64-disk.img
- image_password: gocubsgo
- extra_properties:
- hw_firmware_type: 'uefi'
- hw_video_model: 'vga'
- short_id: 'ubuntu16.04'
- snaps:
- images:
- glance_tests:
- disk_file:
- /home/opnfv/functest/images/cirros-d161201-aarch64-disk.img
- extra_properties:
- hw_firmware_type: 'uefi'
- short_id: 'ubuntu16.04'
- hw_video_model: 'vga'
- cirros:
- disk_file:
- /home/opnfv/functest/images/cirros-d161201-aarch64-disk.img
- extra_properties:
- hw_firmware_type: 'uefi'
- short_id: 'ubuntu16.04'
- hw_video_model: 'vga'
- ubuntu:
- disk_file:
- /home/opnfv/functest/images/ubuntu-14.04-server-cloudimg-arm64-uefi1.img
- extra_properties:
- hw_firmware_type: 'uefi'
- hw_video_model: 'vga'
- centos:
- disk_file:
- /home/opnfv/functest/images/CentOS-7-aarch64-GenericCloud.qcow2
- extra_properties:
- hw_firmware_type: 'uefi'
- hw_video_model: 'vga'
-
- vping:
- image_name: TestVM
-
- tempest:
- use_custom_flavors: 'True'
-
- odl_sfc:
- image_base_url: "http://artifacts.opnfv.org/sfc/demo"
- image_name: sfc_nsh_danube
- image_file_name: sf_nsh_danube_arm64.img
- image_initrd: sf_nsh_danube_arm64-initrd
- image_kernel: sf_nsh_danube_arm64-kernel
- image_format: ami
- os_cmd_line: 'root=LABEL=cloudimg-rootfs ro'
- doctor:
- image_name: TestVM
+ vmready1:
+ image: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img
+ vmready2:
+ image: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img
+ singlevm1:
+ image: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img
+ singlevm2:
+ image: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img
+ vping_ssh:
+ image: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img
+ vping_userdata:
+ image: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img
+ cinder_test:
+ image: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img
+ tempest_smoke:
+ image: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img
+ image_alt: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img
+ tempest_horizon:
+ image: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img
+ image_alt: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img
+ tempest_neutron:
+ image: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img
+ image_alt: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img
+ tempest_cinder:
+ image: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img
+ image_alt: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img
+ tempest_keystone:
+ image: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img
+ image_alt: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img
+ tempest_heat:
+ image: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img
+ image_alt:
+ /home/opnfv/functest/images/Fedora-Cloud-Base-30-1.2.aarch64.qcow2
+ tempest_telemetry:
+ image: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img
+ image_alt: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img
+ rally_sanity:
+ image: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img
+ refstack_compute:
+ image: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img
+ image_alt: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img
+ refstack_object:
+ image: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img
+ image_alt: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img
+ refstack_platform:
+ image: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img
+ image_alt: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img
+ tempest_full:
+ image: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img
+ image_alt: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img
+ tempest_scenario:
+ image: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img
+ image_alt: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img
+ tempest_slow:
+ image: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img
+ image_alt: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img
+ patrole:
+ image: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img
+ image_alt: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img
+ tempest_barbican:
+ image: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img
+ image_alt: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img
+ tempest_octavia:
+ image: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img
+ image_alt: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img
+ tempest_neutron_cntt:
+ image: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img
+ image_alt: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img
+ tempest_cinder_cntt:
+ image: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img
+ image_alt: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img
+ tempest_keystone_cntt:
+ image: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img
+ image_alt: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img
+ tempest_heat_cntt:
+ image: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img
+ image_alt:
+ /home/opnfv/functest/images/Fedora-Cloud-Base-30-1.2.aarch64.qcow2
+ rally_sanity_cntt:
+ image: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img
+ tempest_full_cntt:
+ image: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img
+ image_alt: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img
+ tempest_scenario_cntt:
+ image: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img
+ image_alt: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img
+ tempest_slow_cntt:
+ image: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img
+ image_alt: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img
+ rally_full:
+ image: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img
+ rally_jobs:
+ image: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img
+ rally_full_cntt:
+ image: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img
+ rally_jobs_cntt:
+ image: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img
diff --git a/functest/ci/config_functest.yaml b/functest/ci/config_functest.yaml
index cf6b13287..647301ab4 100644
--- a/functest/ci/config_functest.yaml
+++ b/functest/ci/config_functest.yaml
@@ -11,18 +11,17 @@ general:
functest_conf: /home/opnfv/functest/conf
functest_data: /home/opnfv/functest/data
ims_data: /home/opnfv/functest/data/ims/
- router_data: /home/opnfv/functest/data/router/
+ rally_data: /home/opnfv/functest/data/rally
+ refstack_data: /home/opnfv/functest/data/refstack
+ router_data: /home/opnfv/functest/data/router/opnfv-vnf-data
functest_images: /home/opnfv/functest/images
rally_inst: /root/.rally
openstack:
- creds: /home/opnfv/functest/conf/openstack.creds
-
- image_name: Cirros-0.4.0
- image_name_alt: Cirros-0.4.0-1
- image_file_name: cirros-0.4.0-x86_64-disk.img
- image_url:
- http://download.cirros-cloud.net/0.4.0/cirros-0.4.0-x86_64-disk.img
+ image_name: Cirros-0.5.1
+ image_name_alt: Cirros-0.5.1-1
+ image_file_name: cirros-0.5.1-x86_64-disk.img
+ image_url: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.img
image_user: cirros
image_disk_format: qcow2
image_username: cirros
@@ -43,45 +42,6 @@ general:
neutron_private_subnet_gateway: 192.168.120.254
neutron_router_name: functest-router
-snaps:
- use_keystone: 'True'
- use_floating_ips: 'True'
- images:
- glance_tests:
- disk_file: /home/opnfv/functest/images/cirros-0.4.0-x86_64-disk.img
- cirros:
- disk_file: /home/opnfv/functest/images/cirros-0.4.0-x86_64-disk.img
- ubuntu:
- disk_file:
- /home/opnfv/functest/images/ubuntu-14.04-server-cloudimg-amd64-disk1.img
- centos:
- disk_file:
- /home/opnfv/functest/images/CentOS-7-x86_64-GenericCloud.qcow2
- # netconf_override:
- # network_type: vlan
- # physical_network: physnet2
- # segmentation_id: 2366
-
-# All of these values are optional and will override the values retrieved
-# by the RC file
-# os_creds_override:
-# username: {user}
-# password: {password}
-# auth_url: {auth_url}
-# project_name: {project_name}
-# identity_api_version: {2|3}
-# network_api_version: {2}
-# compute_api_version: {2}
-# image_api_version: {1|2}
-# user_domain_id: {user_domain_id}
-# project_domain_id: {projects_domain_id}
-# interface: {interface}
-# cacert: {True|False}
-# proxy_settings:
-# host: {proxy_host}
-# port: {proxy_port}
-# ssh_proxy_cmd: {OpenSSH -o ProxyCommand value}
-
vping:
ping_timeout: 200
vm_flavor: m1.tiny # adapt to your environment
@@ -95,9 +55,9 @@ vping:
private_subnet_name: vping-subnet
private_subnet_cidr: 192.168.130.0/24
router_name: vping-router
- sg_name: vPing-sg
+ sg_name: vping-sg
sg_desc: Security group for vPing test case
- keypair_name: vPing-keypair
+ keypair_name: vping-keypair
keypair_priv_file: /tmp/vPing-keypair
keypair_pub_file: /tmp/vPing-keypair.pub
vm_boot_timeout: 180
@@ -105,6 +65,24 @@ vping:
vm_ssh_connect_timeout: 60
cleanup_objects: 'True'
+cinder:
+ vm_name_1: opnfv-cinder-1
+ vm_name_2: opnfv-cinder-2
+ image_name: functest-cinder
+ private_net_name: cinder-net
+ private_subnet_name: cinder-subnet
+ private_subnet_cidr: 192.168.130.0/24
+ router_name: cinder-router
+ sg_name: cinder-sg
+ sg_desc: Security group for CinderCheck test case
+ keypair_name: cinder-keypair
+ keypair_priv_file: /tmp/CinderCheck-keypair
+ keypair_pub_file: /tmp/CinderCheck-keypair.pub
+ vm_boot_timeout: 180
+ vm_delete_timeout: 100
+ vm_ssh_connect_timeout: 60
+ cleanup_objects: 'True'
+
odl_sfc:
image_base_url: "http://artifacts.opnfv.org/sfc/images"
image_name: sfc_nsh_danube
@@ -113,36 +91,9 @@ odl_sfc:
tempest:
verifier_name: opnfv-tempest
- identity:
- tenant_name: tempest
- tenant_description: Tenant for Tempest test suite
- user_name: tempest
- user_password: Tempest123!
- validation:
- ssh_timeout: 130
- object_storage:
- operator_role: SwiftOperator
- # network_type: vlan
- # physical_network: physnet2
- # segmentation_id: 2366
- private_net_name: tempest-net
- private_subnet_name: tempest-subnet
- private_subnet_cidr: 192.168.150.0/24
- router_name: tempest-router
- use_custom_flavors: 'False'
- volume_device_name: vdc
rally:
deployment_name: opnfv-rally
- network_name: rally-net
- # network_type: vlan
- # physical_network: physnet2
- # segmentation_id: 2366
- subnet_name: rally-subnet
- subnet_cidr: 192.168.140.0/24
- router_name: rally-router
- flavor_name: rally-tiny
- flavor_alt_name: rally-mini
vnf:
juju_epc:
@@ -153,17 +104,12 @@ vnf:
private_subnet_cidr: 172.16.0.0/24
private_subnet_name: abot-subnet
external_router: abot-router
- external_network_name: ext-net
- dns_nameserver: ['8.8.8.8']
-
cloudify_ims:
tenant_name: cloudify_ims
tenant_description: vIMS
config: cloudify_ims.yaml
- cloudify_ims_perf:
- tenant_name: cloudify_ims_perf
- tenant_description: vIMS
- config: cloudify_ims_perf.yaml
+ heat_ims:
+ config: heat_ims.yaml
orchestra_openims:
tenant_name: orchestra_openims
tenant_description: OpenIMS deployed with Open Baton
@@ -187,14 +133,3 @@ example:
router_name: example-router
sg_name: example-sg
sg_desc: Example Security group
-
-results:
- # you can also set a file (e.g. /home/opnfv/functest/results/dump.txt)
- # to dump results
- # test_db_url: file:///home/opnfv/functest/results/dump.txt
- test_db_url: http://testresults.opnfv.org/test/api/v1/results
-
-energy_recorder:
- api_url: http://energy.opnfv.fr/resources
- api_user: ""
- api_password: ""
diff --git a/functest/ci/config_patch.yaml b/functest/ci/config_patch.yaml
index 32b67057f..d5335c3ab 100644
--- a/functest/ci/config_patch.yaml
+++ b/functest/ci/config_patch.yaml
@@ -1,20 +1,504 @@
---
-lxd:
- general:
- openstack:
- image_name: Cirros-0.4.0
- image_file_name: cirros-0.4.0-x86_64-lxc.tar.gz
- image_disk_format: raw
+gsma:
+ tempest_smoke:
+ flavor_alt_ram: 2048
+ flavor_alt_vcpus: 1
+ flavor_alt_disk: 40
+ tempest_horizon:
+ flavor_alt_ram: 2048
+ flavor_alt_vcpus: 1
+ flavor_alt_disk: 40
+ tempest_neutron:
+ flavor_alt_ram: 2048
+ flavor_alt_vcpus: 1
+ flavor_alt_disk: 40
+ tempest_cinder:
+ flavor_alt_ram: 2048
+ flavor_alt_vcpus: 1
+ flavor_alt_disk: 40
+ tempest_keystone:
+ flavor_alt_ram: 2048
+ flavor_alt_vcpus: 1
+ flavor_alt_disk: 40
+ tempest_heat:
+ flavor_alt_ram: 2048
+ flavor_alt_vcpus: 1
+ flavor_alt_disk: 40
+ tempest_telemetry:
+ flavor_alt_ram: 2048
+ flavor_alt_vcpus: 1
+ flavor_alt_disk: 40
+ rally_sanity:
+ flavor_alt_ram: 2048
+ flavor_alt_vcpus: 1
+ flavor_alt_disk: 40
+ refstack_compute:
+ flavor_alt_ram: 2048
+ flavor_alt_vcpus: 1
+ flavor_alt_disk: 40
+ refstack_object:
+ flavor_alt_ram: 2048
+ flavor_alt_vcpus: 1
+ flavor_alt_disk: 40
+ refstack_platform:
+ flavor_alt_ram: 2048
+ flavor_alt_vcpus: 1
+ flavor_alt_disk: 40
+ tempest_full:
+ flavor_alt_ram: 2048
+ flavor_alt_vcpus: 1
+ flavor_alt_disk: 40
+ tempest_scenario:
+ flavor_alt_ram: 2048
+ flavor_alt_vcpus: 1
+ flavor_alt_disk: 40
+ tempest_slow:
+ flavor_alt_ram: 2048
+ flavor_alt_vcpus: 1
+ flavor_alt_disk: 40
+ patrole:
+ flavor_alt_ram: 2048
+ flavor_alt_vcpus: 1
+ flavor_alt_disk: 40
+ tempest_barbican:
+ flavor_alt_ram: 2048
+ flavor_alt_vcpus: 1
+ flavor_alt_disk: 40
+ tempest_octavia:
+ flavor_alt_ram: 2048
+ flavor_alt_vcpus: 1
+ flavor_alt_disk: 40
+ tempest_neutron_cntt:
+ flavor_alt_ram: 2048
+ flavor_alt_vcpus: 1
+ flavor_alt_disk: 40
+ tempest_cinder_cntt:
+ flavor_alt_ram: 2048
+ flavor_alt_vcpus: 1
+ flavor_alt_disk: 40
+ tempest_keystone_cntt:
+ flavor_alt_ram: 2048
+ flavor_alt_vcpus: 1
+ flavor_alt_disk: 40
+ tempest_heat_cntt:
+ flavor_alt_ram: 2048
+ flavor_alt_vcpus: 1
+ flavor_alt_disk: 40
+ rally_sanity_cntt:
+ flavor_alt_ram: 2048
+ flavor_alt_vcpus: 1
+ flavor_alt_disk: 40
+ tempest_full_cntt:
+ flavor_alt_ram: 2048
+ flavor_alt_vcpus: 1
+ flavor_alt_disk: 40
+ tempest_scenario_cntt:
+ flavor_alt_ram: 2048
+ flavor_alt_vcpus: 1
+ flavor_alt_disk: 40
+ tempest_slow_cntt:
+ flavor_alt_ram: 2048
+ flavor_alt_vcpus: 1
+ flavor_alt_disk: 40
+ rally_full:
+ flavor_alt_ram: 2048
+ flavor_alt_vcpus: 1
+ flavor_alt_disk: 40
+ rally_jobs:
+ flavor_alt_ram: 2048
+ flavor_alt_vcpus: 1
+ flavor_alt_disk: 40
+ vmtp:
+ flavor_ram: 2048
+ flavor_vcpus: 1
+ flavor_disk: 40
+ shaker:
+ flavor_ram: 2048
+ flavor_vcpus: 1
+ flavor_disk: 40
+ rally_full_cntt:
+ flavor_alt_ram: 2048
+ flavor_alt_vcpus: 1
+ flavor_alt_disk: 40
+ rally_jobs_cntt:
+ flavor_alt_ram: 2048
+ flavor_alt_vcpus: 1
+ flavor_alt_disk: 40
+ cloudify:
+ flavor_ram: 4096
+ flavor_vcpus: 2
+ flavor_disk: 40
+ cloudify_ims:
+ flavor_ram: 4096
+ flavor_vcpus: 2
+ flavor_disk: 40
+ flavor_alt_ram: 2048
+ flavor_alt_vcpus: 1
+ flavor_alt_disk: 40
+ heat_ims:
+ flavor_ram: 2048
+ flavor_vcpus: 1
+ flavor_disk: 40
+ vyos_vrouter:
+ flavor_ram: 4096
+ flavor_vcpus: 2
+ flavor_disk: 40
+ flavor_alt_ram: 2048
+ flavor_alt_vcpus: 1
+ flavor_alt_disk: 40
+ juju_epc:
+ flavor_ram: 2048
+ flavor_vcpus: 1
+ flavor_disk: 40
+ flavor_alt_ram: 4096
+ flavor_alt_vcpus: 2
+ flavor_alt_disk: 40
fdio:
- general:
- flavor_extra_specs: {'hw:mem_page_size':'large'}
- image_properties: {'hw_mem_page_size':'large'}
- tempest:
- use_custom_flavors: 'True'
+ vmready1:
+ flavor_ram: 1024
+ vmready2:
+ flavor_ram: 1024
+ singlevm1:
+ flavor_ram: 1024
+ singlevm2:
+ flavor_ram: 1024
+ vping_ssh:
+ flavor_ram: 1024
+ vping_userdata:
+ flavor_ram: 1024
+ cinder_test:
+ flavor_ram: 1024
+ tempest_smoke:
+ flavor_ram: 1024
+ tempest_horizon:
+ flavor_ram: 1024
+ tempest_neutron:
+ flavor_ram: 1024
+ tempest_cinder:
+ flavor_ram: 1024
+ tempest_keystone:
+ flavor_ram: 1024
+ tempest_heat:
+ flavor_ram: 1024
+ tempest_telemetry:
+ flavor_ram: 1024
+ rally_sanity:
+ flavor_ram: 1024
+ refstack_compute:
+ flavor_ram: 1024
+ refstack_object:
+ flavor_ram: 1024
+ refstack_platform:
+ flavor_ram: 1024
+ tempest_full:
+ flavor_ram: 1024
+ tempest_scenario:
+ flavor_ram: 1024
+ tempest_slow:
+ flavor_ram: 1024
+ patrole:
+ flavor_ram: 1024
+ tempest_barbican:
+ flavor_ram: 1024
+ tempest_octavia:
+ flavor_ram: 1024
+ tempest_neutron_cntt:
+ flavor_ram: 1024
+ tempest_cinder_cntt:
+ flavor_ram: 1024
+ tempest_keystone_cntt:
+ flavor_ram: 1024
+ tempest_heat_cntt:
+ flavor_ram: 1024
+ rally_sanity_cntt:
+ flavor_ram: 1024
+ tempest_full_cntt:
+ flavor_ram: 1024
+ tempest_scenario_cntt:
+ flavor_ram: 1024
+ tempest_slow_cntt:
+ flavor_ram: 1024
+ rally_full:
+ flavor_ram: 1024
+ rally_jobs:
+ flavor_ram: 1024
+ vmtp:
+ flavor_ram: 2048
+ shaker:
+ flavor_ram: 1024
+ rally_full_cntt:
+ flavor_ram: 1024
+ rally_jobs_cntt:
+ flavor_ram: 1024
+
ovs:
- general:
- flavor_extra_specs: {'hw:mem_page_size':'large'}
- image_properties: {'hw_mem_page_size':'large'}
- tempest:
- use_custom_flavors: 'True'
+ vmready1:
+ flavor_ram: 1024
+ vmready2:
+ flavor_ram: 1024
+ singlevm1:
+ flavor_ram: 1024
+ singlevm2:
+ flavor_ram: 1024
+ vping_ssh:
+ flavor_ram: 1024
+ vping_userdata:
+ flavor_ram: 1024
+ cinder_test:
+ flavor_ram: 1024
+ tempest_smoke:
+ flavor_ram: 1024
+ tempest_horizon:
+ flavor_ram: 1024
+ tempest_neutron:
+ flavor_ram: 1024
+ tempest_cinder:
+ flavor_ram: 1024
+ tempest_keystone:
+ flavor_ram: 1024
+ tempest_heat:
+ flavor_ram: 1024
+ tempest_telemetry:
+ flavor_ram: 1024
+ rally_sanity:
+ flavor_ram: 1024
+ refstack_compute:
+ flavor_ram: 1024
+ refstack_object:
+ flavor_ram: 1024
+ refstack_platform:
+ flavor_ram: 1024
+ tempest_full:
+ flavor_ram: 1024
+ tempest_scenario:
+ flavor_ram: 1024
+ tempest_slow:
+ flavor_ram: 1024
+ patrole:
+ flavor_ram: 1024
+ tempest_barbican:
+ flavor_ram: 1024
+ tempest_octavia:
+ flavor_ram: 1024
+ tempest_neutron_cntt:
+ flavor_ram: 1024
+ tempest_cinder_cntt:
+ flavor_ram: 1024
+ tempest_keystone_cntt:
+ flavor_ram: 1024
+ tempest_heat_cntt:
+ flavor_ram: 1024
+ rally_sanity_cntt:
+ flavor_ram: 1024
+ tempest_full_cntt:
+ flavor_ram: 1024
+ tempest_scenario_cntt:
+ flavor_ram: 1024
+ tempest_slow_cntt:
+ flavor_ram: 1024
+ rally_full:
+ flavor_ram: 1024
+ rally_jobs:
+ flavor_ram: 1024
+ vmtp:
+ flavor_ram: 2048
+ shaker:
+ flavor_ram: 1024
+ rally_full_cntt:
+ flavor_ram: 1024
+ rally_jobs_cntt:
+ flavor_ram: 1024
+
+vio:
+ vmready1:
+ image: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk
+ image_format: vmdk
+ vmready2:
+ image: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk
+ image_format: vmdk
+ singlevm1:
+ image: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk
+ image_format: vmdk
+ singlevm2:
+ image: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk
+ image_format: vmdk
+ vping_ssh:
+ image: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk
+ image_format: vmdk
+ vping_userdata:
+ image: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk
+ image_format: vmdk
+ cinder_test:
+ image: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk
+ image_format: vmdk
+ tempest_smoke:
+ image: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk
+ image_format: vmdk
+ image_alt: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk
+ image_alt_format: vmdk
+ tempest_horizon:
+ image: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk
+ image_format: vmdk
+ image_alt: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk
+ image_alt_format: vmdk
+ tempest_neutron:
+ image: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk
+ image_format: vmdk
+ image_alt: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk
+ image_alt_format: vmdk
+ tempest_cinder:
+ image: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk
+ image_format: vmdk
+ image_alt: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk
+ image_alt_format: vmdk
+ tempest_keystone:
+ image: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk
+ image_format: vmdk
+ image_alt: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk
+ image_alt_format: vmdk
+ tempest_heat:
+ image: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk
+ image_format: vmdk
+ image_alt:
+ /home/opnfv/functest/images/Fedora-Cloud-Base-30-1.2.x86_64.vmdk
+ image_alt_format: vmdk
+ tempest_telemetry:
+ image: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk
+ image_format: vmdk
+ image_alt: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk
+ image_alt_format: vmdk
+ rally_sanity:
+ image: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk
+ image_format: vmdk
+ refstack_compute:
+ image: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk
+ image_format: vmdk
+ image_alt: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk
+ image_alt_format: vmdk
+ refstack_object:
+ image: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk
+ image_format: vmdk
+ image_alt: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk
+ image_alt_format: vmdk
+ refstack_platform:
+ image: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk
+ image_format: vmdk
+ image_alt: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk
+ image_alt_format: vmdk
+ tempest_full:
+ image: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk
+ image_format: vmdk
+ image_alt: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk
+ image_alt_format: vmdk
+ tempest_scenario:
+ image: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk
+ image_format: vmdk
+ image_alt: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk
+ image_alt_format: vmdk
+ tempest_slow:
+ image: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk
+ image_format: vmdk
+ image_alt: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk
+ image_alt_format: vmdk
+ patrole:
+ image: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk
+ image_format: vmdk
+ image_alt: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk
+ image_alt_format: vmdk
+ tempest_barbican:
+ image: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk
+ image_format: vmdk
+ image_alt: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk
+ image_alt_format: vmdk
+ tempest_octavia:
+ image: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk
+ image_format: vmdk
+ image_alt: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk
+ image_alt_format: vmdk
+ tempest_neutron_cntt:
+ image: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk
+ image_format: vmdk
+ image_alt: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk
+ image_alt_format: vmdk
+ tempest_cinder_cntt:
+ image: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk
+ image_format: vmdk
+ image_alt: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk
+ image_alt_format: vmdk
+ tempest_keystone_cntt:
+ image: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk
+ image_format: vmdk
+ image_alt: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk
+ image_alt_format: vmdk
+ tempest_heat_cntt:
+ image: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk
+ image_format: vmdk
+ image_alt:
+ /home/opnfv/functest/images/Fedora-Cloud-Base-30-1.2.x86_64.vmdk
+ image_alt_format: vmdk
+ rally_sanity_cntt:
+ image: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk
+ image_format: vmdk
+ tempest_full_cntt:
+ image: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk
+ image_format: vmdk
+ image_alt: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk
+ image_alt_format: vmdk
+ tempest_scenario_cntt:
+ image: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk
+ image_format: vmdk
+ image_alt: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk
+ image_alt_format: vmdk
+ tempest_slow_cntt:
+ image: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk
+ image_format: vmdk
+ image_alt: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk
+ image_alt_format: vmdk
+ rally_full:
+ image: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk
+ image_format: vmdk
+ rally_jobs:
+ image: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk
+ image_format: vmdk
+ vmtp:
+ image:
+ /home/opnfv/functest/images/ubuntu-14.04-server-cloudimg-amd64-disk1.vmdk
+ image_format: vmdk
+ shaker:
+ image: /home/opnfv/functest/images/shaker-image.vmdk
+ image_format: vmdk
+ rally_full_cntt:
+ image: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk
+ image_format: vmdk
+ rally_jobs_cntt:
+ image: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk
+ image_format: vmdk
+ cloudify:
+ image:
+ /home/opnfv/functest/images/ubuntu-16.04-server-cloudimg-amd64-disk1.vmdk
+ image_format: vmdk
+ cloudify_ims:
+ image:
+ /home/opnfv/functest/images/ubuntu-16.04-server-cloudimg-amd64-disk1.vmdk
+ image_format: vmdk
+ image_alt:
+ /home/opnfv/functest/images/ubuntu-14.04-server-cloudimg-amd64-disk1.vmdk
+ image_alt_format: vmdk
+ heat_ims:
+ image:
+ /home/opnfv/functest/images/ubuntu-14.04-server-cloudimg-amd64-disk1.vmdk
+ image_format: vmdk
+ vyos_vrouter:
+ image:
+ /home/opnfv/functest/images/ubuntu-16.04-server-cloudimg-amd64-disk1.vmdk
+ image_format: vmdk
+ image_alt: /home/opnfv/functest/images/vyos-1.1.7.vmdk
+ image_alt_format: vmdk
+ juju_epc:
+ image:
+ /home/opnfv/functest/images/ubuntu-16.04-server-cloudimg-amd64-disk1.vmdk
+ image_format: vmdk
+ image_alt:
+ /home/opnfv/functest/images/ubuntu-14.04-server-cloudimg-amd64-disk1.vmdk
+ image_alt_format: vmdk
diff --git a/functest/ci/convert_images.sh b/functest/ci/convert_images.sh
new file mode 100644
index 000000000..2159d2a60
--- /dev/null
+++ b/functest/ci/convert_images.sh
@@ -0,0 +1,13 @@
+#!/bin/sh
+
+set -ex
+
+initdir=$(pwd)
+
+cd "${1:-/home/opnfv/functest/images}"
+
+for i in *.img *.qcow2; do
+ qemu-img convert -f qcow2 -O vmdk "$i" "${i%.*}.vmdk"
+done
+
+cd $initdir
diff --git a/functest/ci/download_images.sh b/functest/ci/download_images.sh
index 14cda1470..a56c02b60 100644
--- a/functest/ci/download_images.sh
+++ b/functest/ci/download_images.sh
@@ -1,24 +1,19 @@
-#!/bin/bash
+#!/bin/sh
set -ex
wget_opts="-N --tries=1 --connect-timeout=30"
+[ -t 1 ] || wget_opts="${wget_opts} --progress=dot:giga"
cat << EOF | wget ${wget_opts} -i - -P ${1:-/home/opnfv/functest/images}
-http://download.cirros-cloud.net/0.4.0/cirros-0.4.0-x86_64-disk.img
+http://download.cirros-cloud.net/0.6.1/cirros-0.6.1-x86_64-disk.img
https://cloud-images.ubuntu.com/releases/14.04/release/ubuntu-14.04-server-cloudimg-amd64-disk1.img
-https://cloud.centos.org/centos/7/images/CentOS-7-x86_64-GenericCloud.qcow2
https://cloud-images.ubuntu.com/releases/16.04/release/ubuntu-16.04-server-cloudimg-amd64-disk1.img
-http://repository.cloudifysource.org/cloudify/4.0.1/sp-release/cloudify-manager-premium-4.0.1.qcow2
-http://cloud-images.ubuntu.com/trusty/current/trusty-server-cloudimg-amd64-disk1.img
-http://download.cirros-cloud.net/0.4.0/cirros-0.4.0-x86_64-lxc.tar.gz
-http://download.cirros-cloud.net/daily/20161201/cirros-d161201-aarch64-disk.img
-http://download.cirros-cloud.net/daily/20161201/cirros-d161201-aarch64-initramfs
-http://download.cirros-cloud.net/daily/20161201/cirros-d161201-aarch64-kernel
-https://cloud-images.ubuntu.com/releases/14.04/release/ubuntu-14.04-server-cloudimg-arm64-uefi1.img
-http://cloud.centos.org/altarch/7/images/aarch64/CentOS-7-aarch64-GenericCloud.qcow2.xz
-https://sourceforge.net/projects/ool-opnfv/files/vyos-1.1.7.img
-http://marketplace.openbaton.org:8080/api/v1/images/52e2ccc0-1dce-4663-894d-28aab49323aa/img
+https://cloud-images.ubuntu.com/releases/18.04/release/ubuntu-18.04-server-cloudimg-amd64.img
+http://download.cirros-cloud.net/0.6.1/cirros-0.6.1-aarch64-disk.img
+http://repository.cloudifysource.org/cloudify/19.01.24/community-release/cloudify-docker-manager-community-19.01.24.tar
+http://testresults.opnfv.org/functest/vyos-1.1.8-amd64.qcow2
+http://testresults.opnfv.org/functest/shaker-image-1.3.4+stretch.qcow2
+https://archives.fedoraproject.org/pub/archive/fedora/linux/releases/30/Cloud/x86_64/images/Fedora-Cloud-Base-30-1.2.x86_64.qcow2
+https://archives.fedoraproject.org/pub/archive/fedora/linux/releases/30/Cloud/aarch64/images/Fedora-Cloud-Base-30-1.2.aarch64.qcow2
EOF
-
-xz --decompress --force --keep ${1:-/home/opnfv/functest/images}/CentOS-7-aarch64-GenericCloud.qcow2.xz
diff --git a/functest/ci/logging.debug.ini b/functest/ci/logging.debug.ini
new file mode 100644
index 000000000..c926a5055
--- /dev/null
+++ b/functest/ci/logging.debug.ini
@@ -0,0 +1,110 @@
+[loggers]
+keys=root,functest,api,ci,core,cli,opnfv_tests,utils,xtesting,xci,xcore,xutils,sfc,baro,warnings
+
+[handlers]
+keys=console,wconsole,file,dfile
+
+[formatters]
+keys=standard
+
+[logger_root]
+level=NOTSET
+handlers=dfile
+
+[logger_functest]
+level=NOTSET
+handlers=file
+qualname=functest
+
+[logger_api]
+level=NOTSET
+handlers=wconsole
+qualname=functest.api
+
+[logger_ci]
+level=NOTSET
+handlers=console
+qualname=functest.ci
+
+[logger_core]
+level=NOTSET
+handlers=console
+qualname=functest.core
+
+[logger_cli]
+level=NOTSET
+handlers=wconsole
+qualname=functest.cli
+
+[logger_opnfv_tests]
+level=NOTSET
+handlers=wconsole
+qualname=functest.opnfv_tests
+
+[logger_utils]
+level=NOTSET
+handlers=wconsole
+qualname=functest.utils
+
+[logger_xtesting]
+level=NOTSET
+handlers=file
+qualname=xtesting
+
+[logger_xci]
+level=NOTSET
+handlers=console
+qualname=xtesting.ci
+
+[logger_xcore]
+level=NOTSET
+handlers=console
+qualname=xtesting.core
+
+[logger_xutils]
+level=NOTSET
+handlers=wconsole
+qualname=xtesting.utils
+
+[logger_sfc]
+level=NOTSET
+handlers=file,wconsole
+qualname=sfc
+
+[logger_baro]
+level=NOTSET
+handlers=file,wconsole
+qualname=baro_tests
+
+[logger_warnings]
+level=NOTSET
+handlers=file,console
+qualname=py.warnings
+
+[handler_console]
+class=StreamHandler
+level=INFO
+formatter=standard
+args=(sys.stdout,)
+
+[handler_wconsole]
+class=StreamHandler
+level=WARN
+formatter=standard
+args=(sys.stdout,)
+
+[handler_file]
+class=FileHandler
+level=INFO
+formatter=standard
+args=("/home/opnfv/functest/results/functest.log",)
+
+[handler_dfile]
+class=FileHandler
+level=DEBUG
+formatter=standard
+args=("/home/opnfv/functest/results/functest.debug.log",)
+
+[formatter_standard]
+format=%(asctime)s - %(name)s - %(levelname)s - %(message)s
+datefmt=
diff --git a/functest/ci/logging.ini b/functest/ci/logging.ini
index f1ab72414..dde079493 100644
--- a/functest/ci/logging.ini
+++ b/functest/ci/logging.ini
@@ -1,5 +1,5 @@
[loggers]
-keys=root,functest,api,ci,cli,core,energy,opnfv_tests,utils
+keys=root,functest,api,ci,core,cli,opnfv_tests,utils,xtesting,xci,xcore,xutils,sfc,baro,warnings
[handlers]
keys=console,wconsole,file,null
@@ -26,20 +26,15 @@ level=NOTSET
handlers=console
qualname=functest.ci
-[logger_cli]
-level=NOTSET
-handlers=wconsole
-qualname=functest.cli
-
[logger_core]
level=NOTSET
handlers=console
qualname=functest.core
-[logger_energy]
+[logger_cli]
level=NOTSET
handlers=wconsole
-qualname=functest.energy
+qualname=functest.cli
[logger_opnfv_tests]
level=NOTSET
@@ -51,6 +46,41 @@ level=NOTSET
handlers=wconsole
qualname=functest.utils
+[logger_xtesting]
+level=NOTSET
+handlers=file
+qualname=xtesting
+
+[logger_xci]
+level=NOTSET
+handlers=console
+qualname=xtesting.ci
+
+[logger_xcore]
+level=NOTSET
+handlers=console
+qualname=xtesting.core
+
+[logger_xutils]
+level=NOTSET
+handlers=wconsole
+qualname=xtesting.utils
+
+[logger_sfc]
+level=NOTSET
+handlers=file,wconsole
+qualname=sfc
+
+[logger_baro]
+level=NOTSET
+handlers=file,wconsole
+qualname=baro_tests
+
+[logger_warnings]
+level=NOTSET
+handlers=file,console
+qualname=py.warnings
+
[handler_null]
class=NullHandler
level=NOTSET
@@ -71,7 +101,7 @@ args=(sys.stdout,)
[handler_file]
class=FileHandler
-level=DEBUG
+level=INFO
formatter=standard
args=("/home/opnfv/functest/results/functest.log",)
diff --git a/functest/ci/rally_aarch64_patch.conf b/functest/ci/rally_aarch64_patch.conf
index e5cae8137..4ea0d7605 100644
--- a/functest/ci/rally_aarch64_patch.conf
+++ b/functest/ci/rally_aarch64_patch.conf
@@ -1,5 +1,5 @@
img_name_regex = ^TestVM$
-img_url = http://download.cirros-cloud.net/daily/20161201/cirros-d161201-aarch64-disk.img
+img_url = http://download.cirros-cloud.net/0.5.1/cirros-0.5.1-aarch64-disk.img
flavor_ref_ram = 256
flavor_ref_alt_ram = 256
heat_instance_type_ram = 256
diff --git a/functest/ci/run_tests.py b/functest/ci/run_tests.py
deleted file mode 100644
index 6748484d7..000000000
--- a/functest/ci/run_tests.py
+++ /dev/null
@@ -1,289 +0,0 @@
-#!/usr/bin/env python
-
-# Copyright (c) 2016 Ericsson AB and others.
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-
-""" The entry of running tests:
-1) Parses functest/ci/testcases.yaml to check which testcase(s) to be run
-2) Execute the common operations on every testcase (run, push results to db...)
-3) Return the right status code
-"""
-
-import argparse
-import enum
-import importlib
-import logging
-import logging.config
-import os
-import re
-import sys
-import textwrap
-import pkg_resources
-
-import prettytable
-
-import functest.ci.tier_builder as tb
-import functest.core.testcase as testcase
-import functest.utils.functest_utils as ft_utils
-import functest.utils.openstack_utils as os_utils
-from functest.utils.constants import CONST
-
-# __name__ cannot be used here
-LOGGER = logging.getLogger('functest.ci.run_tests')
-
-CONFIG_FUNCTEST_PATH = pkg_resources.resource_filename(
- 'functest', 'ci/config_functest.yaml')
-
-
-class Result(enum.Enum):
- """The overall result in enumerated type"""
- # pylint: disable=too-few-public-methods
- EX_OK = os.EX_OK
- EX_ERROR = -1
-
-
-class BlockingTestFailed(Exception):
- """Exception when the blocking test fails"""
- pass
-
-
-class TestNotEnabled(Exception):
- """Exception when the test is not enabled"""
- pass
-
-
-class RunTestsParser(object):
- """Parser to run tests"""
- # pylint: disable=too-few-public-methods
-
- def __init__(self):
- self.parser = argparse.ArgumentParser()
- self.parser.add_argument("-t", "--test", dest="test", action='store',
- help="Test case or tier (group of tests) "
- "to be executed. It will run all the test "
- "if not specified.")
- self.parser.add_argument("-n", "--noclean", help="Do not clean "
- "OpenStack resources after running each "
- "test (default=false).",
- action="store_true")
- self.parser.add_argument("-r", "--report", help="Push results to "
- "database (default=false).",
- action="store_true")
-
- def parse_args(self, argv=None):
- """Parse arguments.
-
- It can call sys.exit if arguments are incorrect.
-
- Returns:
- the arguments from cmdline
- """
- return vars(self.parser.parse_args(argv))
-
-
-class Runner(object):
- """Runner class"""
-
- def __init__(self):
- self.executed_test_cases = {}
- self.overall_result = Result.EX_OK
- self.clean_flag = True
- self.report_flag = False
- self._tiers = tb.TierBuilder(
- CONST.__getattribute__('INSTALLER_TYPE'),
- CONST.__getattribute__('DEPLOY_SCENARIO'),
- pkg_resources.resource_filename('functest', 'ci/testcases.yaml'))
-
- @staticmethod
- def source_rc_file():
- """Set the environmental vars from openstack.creds"""
-
- rc_file = CONST.__getattribute__('openstack_creds')
- if not os.path.isfile(rc_file):
- raise Exception("RC file %s does not exist..." % rc_file)
- LOGGER.debug("Sourcing the OpenStack RC file...")
- os_utils.source_credentials(rc_file)
-
- @staticmethod
- def get_run_dict(testname):
- """Obtain the the 'run' block of the testcase from testcases.yaml"""
- try:
- dic_testcase = ft_utils.get_dict_by_test(testname)
- if not dic_testcase:
- LOGGER.error("Cannot get %s's config options", testname)
- elif 'run' in dic_testcase:
- return dic_testcase['run']
- return None
- except Exception: # pylint: disable=broad-except
- LOGGER.exception("Cannot get %s's config options", testname)
- return None
-
- def run_test(self, test):
- """Run one test case"""
- if not test.is_enabled():
- raise TestNotEnabled(
- "The test case {} is not enabled".format(test.get_name()))
- LOGGER.info("Running test case '%s'...", test.get_name())
- result = testcase.TestCase.EX_RUN_ERROR
- run_dict = self.get_run_dict(test.get_name())
- if run_dict:
- try:
- module = importlib.import_module(run_dict['module'])
- cls = getattr(module, run_dict['class'])
- test_dict = ft_utils.get_dict_by_test(test.get_name())
- test_case = cls(**test_dict)
- self.executed_test_cases[test.get_name()] = test_case
- try:
- kwargs = run_dict['args']
- test_case.run(**kwargs)
- except KeyError:
- test_case.run()
- if self.report_flag:
- test_case.push_to_db()
- if test.get_project() == "functest":
- result = test_case.is_successful()
- else:
- result = testcase.TestCase.EX_OK
- LOGGER.info("Test result:\n\n%s\n", test_case)
- if self.clean_flag:
- test_case.clean()
- except ImportError:
- LOGGER.exception("Cannot import module %s", run_dict['module'])
- except AttributeError:
- LOGGER.exception("Cannot get class %s", run_dict['class'])
- else:
- raise Exception("Cannot import the class for the test case.")
- return result
-
- def run_tier(self, tier):
- """Run one tier"""
- tier_name = tier.get_name()
- tests = tier.get_tests()
- if not tests:
- LOGGER.info("There are no supported test cases in this tier "
- "for the given scenario")
- self.overall_result = Result.EX_ERROR
- else:
- LOGGER.info("Running tier '%s'", tier_name)
- for test in tests:
- self.run_test(test)
- test_case = self.executed_test_cases[test.get_name()]
- if test_case.is_successful() != testcase.TestCase.EX_OK:
- LOGGER.error("The test case '%s' failed.", test.get_name())
- if test.get_project() == "functest":
- self.overall_result = Result.EX_ERROR
- if test.is_blocking():
- raise BlockingTestFailed(
- "The test case {} failed and is blocking".format(
- test.get_name()))
- return self.overall_result
-
- def run_all(self):
- """Run all available testcases"""
- tiers_to_run = []
- msg = prettytable.PrettyTable(
- header_style='upper', padding_width=5,
- field_names=['tiers', 'order', 'CI Loop', 'description',
- 'testcases'])
- for tier in self._tiers.get_tiers():
- if (tier.get_tests() and
- re.search(CONST.__getattribute__('CI_LOOP'),
- tier.get_ci_loop()) is not None):
- tiers_to_run.append(tier)
- msg.add_row([tier.get_name(), tier.get_order(),
- tier.get_ci_loop(),
- textwrap.fill(tier.description, width=40),
- textwrap.fill(' '.join([str(x.get_name(
- )) for x in tier.get_tests()]), width=40)])
- LOGGER.info("TESTS TO BE EXECUTED:\n\n%s\n", msg)
- for tier in tiers_to_run:
- self.run_tier(tier)
-
- def main(self, **kwargs):
- """Entry point of class Runner"""
- if 'noclean' in kwargs:
- self.clean_flag = not kwargs['noclean']
- if 'report' in kwargs:
- self.report_flag = kwargs['report']
- try:
- if 'test' in kwargs:
- self.source_rc_file()
- LOGGER.debug("Test args: %s", kwargs['test'])
- if self._tiers.get_tier(kwargs['test']):
- self.run_tier(self._tiers.get_tier(kwargs['test']))
- elif self._tiers.get_test(kwargs['test']):
- result = self.run_test(
- self._tiers.get_test(kwargs['test']))
- if result != testcase.TestCase.EX_OK:
- LOGGER.error("The test case '%s' failed.",
- kwargs['test'])
- self.overall_result = Result.EX_ERROR
- elif kwargs['test'] == "all":
- self.run_all()
- else:
- LOGGER.error("Unknown test case or tier '%s', or not "
- "supported by the given scenario '%s'.",
- kwargs['test'],
- CONST.__getattribute__('DEPLOY_SCENARIO'))
- LOGGER.debug("Available tiers are:\n\n%s",
- self._tiers)
- return Result.EX_ERROR
- else:
- self.run_all()
- except BlockingTestFailed:
- pass
- except Exception: # pylint: disable=broad-except
- LOGGER.exception("Failures when running testcase(s)")
- self.overall_result = Result.EX_ERROR
- if not self._tiers.get_test(kwargs['test']):
- self.summary(self._tiers.get_tier(kwargs['test']))
- LOGGER.info("Execution exit value: %s", self.overall_result)
- return self.overall_result
-
- def summary(self, tier=None):
- """To generate functest report showing the overall results"""
- msg = prettytable.PrettyTable(
- header_style='upper', padding_width=5,
- field_names=['env var', 'value'])
- for env_var in ['INSTALLER_TYPE', 'DEPLOY_SCENARIO', 'BUILD_TAG',
- 'CI_LOOP']:
- msg.add_row([env_var, CONST.__getattribute__(env_var)])
- LOGGER.info("Deployment description:\n\n%s\n", msg)
- msg = prettytable.PrettyTable(
- header_style='upper', padding_width=5,
- field_names=['test case', 'project', 'tier',
- 'duration', 'result'])
- tiers = [tier] if tier else self._tiers.get_tiers()
- for each_tier in tiers:
- for test in each_tier.get_tests():
- try:
- test_case = self.executed_test_cases[test.get_name()]
- except KeyError:
- msg.add_row([test.get_name(), test.get_project(),
- each_tier.get_name(), "00:00", "SKIP"])
- else:
- result = 'PASS' if(test_case.is_successful(
- ) == test_case.EX_OK) else 'FAIL'
- msg.add_row(
- [test_case.case_name, test_case.project_name,
- self._tiers.get_tier_name(test_case.case_name),
- test_case.get_duration(), result])
- for test in each_tier.get_skipped_test():
- msg.add_row([test.get_name(), test.get_project(),
- each_tier.get_name(), "00:00", "SKIP"])
- LOGGER.info("FUNCTEST REPORT:\n\n%s\n", msg)
-
-
-def main():
- """Entry point"""
- logging.config.fileConfig(pkg_resources.resource_filename(
- 'functest', 'ci/logging.ini'))
- logging.captureWarnings(True)
- parser = RunTestsParser()
- args = parser.parse_args(sys.argv[1:])
- runner = Runner()
- return runner.main(**args).value
diff --git a/functest/ci/testcases.yaml b/functest/ci/testcases.yaml
index 2e1a282cb..acf5a7199 100644
--- a/functest/ci/testcases.yaml
+++ b/functest/ci/testcases.yaml
@@ -2,8 +2,6 @@
tiers:
-
name: healthcheck
- order: 0
- ci_loop: '(daily)|(weekly)'
description: >-
First tier to be executed to verify the basic
operations in the VIM.
@@ -16,59 +14,86 @@ tiers:
description: >-
This test case verifies the retrieval of OpenStack clients:
Keystone, Glance, Neutron and Nova and may perform some
- simple queries. When the config value of
- snaps.use_keystone is True, functest must have access to
- the cloud's private network.
- dependencies:
- installer: '^((?!netvirt).)*$'
- scenario: ''
+ simple queries.
run:
- module:
- 'functest.opnfv_tests.openstack.snaps.connection_check'
- class: 'ConnectionCheck'
+ name: connection_check
-
- case_name: api_check
+ case_name: tenantnetwork1
project_name: functest
criteria: 100
blocking: true
description: >-
- This test case verifies the retrieval of OpenStack clients:
- Keystone, Glance, Neutron and Nova and may perform some
- simple queries. When the config value of
- snaps.use_keystone is True, functest must have access to
- the cloud's private network.
+ It creates and configures all tenant network ressources
+ required by advanced testcases (subnet, network and
+ router).
dependencies:
- installer: '^((?!netvirt).)*$'
- scenario: '^((?!lxd).)*$'
+ - NO_TENANT_NETWORK: '^(?![tT]rue$)'
run:
- module: 'functest.opnfv_tests.openstack.snaps.api_check'
- class: 'ApiCheck'
+ name: tenantnetwork1
-
- case_name: snaps_health_check
+ case_name: tenantnetwork2
project_name: functest
criteria: 100
blocking: true
description: >-
- This test case creates executes the SimpleHealthCheck
- Python test class which creates an, image, flavor, network,
- and Cirros VM instance and observes the console output to
- validate the single port obtains the correct IP address.
+ It creates new user/project before creating and configuring
+ all tenant network ressources required by a testcase
+ (subnet, network and router).
dependencies:
- installer: ''
- scenario: '^((?!lxd).)*$'
+ - NO_TENANT_NETWORK: '^(?![tT]rue$)'
run:
- module: 'functest.opnfv_tests.openstack.snaps.health_check'
- class: 'HealthCheck'
+ name: tenantnetwork2
+
+ -
+ case_name: vmready1
+ project_name: functest
+ criteria: 100
+ blocking: true
+ description: >-
+ It inherits from TenantNetwork1 which creates all network
+ resources and prepares a future VM attached to that
+ network.
+ run:
+ name: vmready1
+
+ -
+ case_name: vmready2
+ project_name: functest
+ criteria: 100
+ blocking: true
+ description: >-
+ It creates new user/project before creating and configuring
+ all tenant network ressources, flavors, images, etc.
+ required by advanced testcases.
+ run:
+ name: vmready2
+
+ -
+ case_name: singlevm1
+ project_name: functest
+ criteria: 100
+ blocking: true
+ description: >-
+ It inherits from TenantNetwork1 which creates all network
+ resources and completes it by booting a VM attached to that
+ network.
+ run:
+ name: singlevm1
+
+ -
+ case_name: singlevm2
+ project_name: functest
+ criteria: 100
+ blocking: true
+ description: >-
+ It creates new user/project before creating and configuring
+ all tenant network ressources and vms required by advanced
+ testcases.
+ run:
+ name: singlevm2
- -
- name: smoke
- order: 1
- ci_loop: '(daily)|(weekly)'
- description: >-
- Set of basic Functional tests to validate the OPNFV scenarios.
- testcases:
-
case_name: vping_ssh
project_name: functest
@@ -78,12 +103,8 @@ tiers:
This test case verifies: 1) SSH to an instance using
floating IPs over the public network. 2) Connectivity
between 2 instances over a private network.
- dependencies:
- installer: ''
- scenario: '^((?!odl_l3|odl-bgpvpn|gluon).)*$'
run:
- module: 'functest.opnfv_tests.openstack.vping.vping_ssh'
- class: 'VPingSSH'
+ name: vping_ssh
-
case_name: vping_userdata
@@ -93,16 +114,42 @@ tiers:
description: >-
This test case verifies: 1) Boot a VM with given userdata.
2) Connectivity between 2 instances over a private network.
+ run:
+ name: vping_userdata
+
+ -
+ case_name: cinder_test
+ project_name: functest
+ criteria: 100
+ blocking: true
+ description: >-
+ This test case verifies: 1) Attach volume and to 1
+ instance; 2) Write data on volume 3) Detach volume
+ from instance 1, attach it on instance 2 3) Read volume
+ data
+ run:
+ name: cinder_test
+
+ -
+ case_name: odl
+ project_name: functest
+ criteria: 100
+ blocking: true
+ description: >-
+ Test Suite for the OpenDaylight SDN Controller. It
+ integrates some test suites from upstream using
+ Robot as the test framework.
dependencies:
- installer: ''
- scenario: '^((?!lxd).)*$'
+ - DEPLOY_SCENARIO: 'odl'
run:
- module:
- 'functest.opnfv_tests.openstack.vping.vping_userdata'
- class: 'VPingUserdata'
+ name: odl
+ args:
+ suites:
+ - /src/odl_test/csit/suites/integration/basic
+ - /src/odl_test/csit/suites/openstack/neutron
-
- case_name: tempest_smoke_serial
+ case_name: tempest_smoke
project_name: functest
criteria: 100
blocking: false
@@ -111,12 +158,118 @@ tiers:
Tempest suite. The list of test cases is generated by
Tempest automatically and depends on the parameters of
the OpenStack deplopyment.
+ https://github.com/openstack/tempest/blob/18.0.0/tox.ini#L114
+ run:
+ name: tempest_common
+ args:
+ mode: '(?=.*\[.*\bsmoke\b.*\])(^tempest\.api)'
+ option:
+ - '--concurrency=4'
+
+ -
+ case_name: tempest_horizon
+ project_name: functest
+ criteria: 100
+ blocking: false
+ description: >-
+ This test case runs the Tempest suite proposed by the
+ Horizon project.
dependencies:
- installer: '^((?!netvirt).)*$'
- scenario: ''
+ - DASHBOARD_URL: '^(?!\s*$).+'
run:
- module: 'functest.opnfv_tests.openstack.tempest.tempest'
- class: 'TempestSmokeSerial'
+ name: tempest_common
+ args:
+ mode: '^tempest.scenario.test_dashboard_basic_ops.'
+
+ -
+ name: smoke
+ description: >-
+ Set of basic Functional tests to validate the OPNFV scenarios.
+ testcases:
+ -
+ case_name: tempest_neutron
+ project_name: functest
+ criteria: 100
+ blocking: false
+ description: >-
+ This test case runs the Tempest suite proposed by the
+ Neutron project. The list of test cases is generated by
+ Tempest automatically and depends on the parameters of
+ the OpenStack deployment.
+ run:
+ name: tempest_common
+ args:
+ mode: '^neutron_tempest_plugin\.api'
+ option:
+ - '--concurrency=4'
+
+ -
+ case_name: tempest_cinder
+ project_name: functest
+ criteria: 100
+ blocking: false
+ description: >-
+ This test case runs the Tempest suite proposed by the
+ Cinder project.
+ run:
+ name: tempest_common
+ args:
+ mode: "(?!.*test_incremental_backup)\
+ (?!.*test_backup_crossproject_admin_negative)\
+ (?!.*test_backup_crossproject_user_negative)\
+ (^cinder_tempest_plugin.)"
+ option:
+ - '--concurrency=4'
+
+ -
+ case_name: tempest_keystone
+ project_name: functest
+ criteria: 100
+ blocking: false
+ description: >-
+ This test case runs the Tempest suite proposed by the
+ Keystone project.
+ run:
+ name: tempest_common
+ args:
+ mode: 'keystone_tempest_plugin.'
+ option:
+ - '--concurrency=4'
+
+ -
+ case_name: tempest_heat
+ project_name: functest
+ criteria: 100
+ blocking: false
+ description: >-
+ This test case runs the Tempest suite proposed by the
+ Heat project.
+ run:
+ name: tempest_heat
+ args:
+ mode: '^heat_tempest_plugin.tests'
+ option:
+ - '--concurrency=1'
+
+ -
+ case_name: tempest_telemetry
+ project_name: functest
+ criteria: 100
+ blocking: false
+ description: >-
+ This test case runs the Tempest suite proposed by the
+ Telemetry project.
+ run:
+ name: tempest_common
+ args:
+ mode: "(?!.*test_autoscaling)(?!.*test_live)\
+ (^telemetry_tempest_plugin)"
+ services:
+ - aodh
+ - gnocchi
+ - panko
+ option:
+ - '--concurrency=4'
-
case_name: rally_sanity
@@ -126,289 +279,790 @@ tiers:
description: >-
This test case runs a sub group of tests of the OpenStack
Rally suite in smoke mode.
- dependencies:
- installer: ''
- scenario: ''
run:
- module: 'functest.opnfv_tests.openstack.rally.rally'
- class: 'RallySanity'
+ name: rally_sanity
+ args:
+ optional:
+ - 'gnocchi'
+ - 'barbican'
-
- case_name: refstack_defcore
+ case_name: refstack_compute
project_name: functest
criteria: 100
blocking: false
description: >-
This test case runs a sub group of tests of the OpenStack
- Defcore testcases by using refstack client.
+ Compute testcases.
dependencies:
- installer: ''
- scenario: ''
+ - NO_TENANT_NETWORK: '^(?![tT]rue$)'
run:
- module:
- 'functest.opnfv_tests.openstack.refstack_client.refstack_client'
- class: 'RefstackClient'
+ name: refstack
+ args:
+ target: compute
+ option:
+ - '--concurrency=4'
-
- case_name: odl
+ case_name: refstack_object
project_name: functest
criteria: 100
blocking: false
description: >-
- Test Suite for the OpenDaylight SDN Controller. It
- integrates some test suites from upstream using
- Robot as the test framework.
- dependencies:
- installer: ''
- scenario: 'odl'
+ This test case runs a sub group of tests of the OpenStack
+ Object testcases.
run:
- module: 'functest.opnfv_tests.sdn.odl.odl'
- class: 'ODLTests'
+ name: refstack
args:
- suites:
- - /src/odl_test/csit/suites/integration/basic
- - /src/odl_test/csit/suites/openstack/neutron
+ target: object
+ option:
+ - '--concurrency=4'
-
- case_name: odl_netvirt
+ case_name: refstack_platform
project_name: functest
criteria: 100
blocking: false
description: >-
- Test Suite for the OpenDaylight SDN Controller when
- the NetVirt features are installed. It integrates
- some test suites from upstream using Robot as the
- test framework.
+ This test case runs a sub group of tests of the OpenStack
+ Platform testcases.
dependencies:
- installer: 'apex'
- scenario: 'os-odl_l3-nofeature'
+ - NO_TENANT_NETWORK: '^(?![tT]rue$)'
run:
- module: 'functest.opnfv_tests.sdn.odl.odl'
- class: 'ODLTests'
+ name: refstack
args:
- suites:
- - /src/odl_test/csit/suites/integration/basic
- - /src/odl_test/csit/suites/openstack/neutron
- - /src/odl_test/csit/suites/openstack/connectivity
+ target: platform
+ option:
+ - '--concurrency=4'
-
- case_name: snaps_smoke
+ case_name: tempest_full
project_name: functest
criteria: 100
blocking: false
description: >-
- This test case contains tests that setup and destroy
- environments with VMs with and without Floating IPs
- with a newly created user and project. Set the config
- value snaps.use_floating_ips (True|False) to toggle
- this functionality. When the config value of
- snaps.use_keystone is True, functest must have access to
- the cloud's private network.
+ The list of test cases is generated by
+ Tempest automatically and depends on the parameters of
+ the OpenStack deployment.
+ https://github.com/openstack/tempest/blob/18.0.0/tox.ini#L83
+ run:
+ name: tempest_common
+ args:
+ mode: '(?!.*\[.*\bslow\b.*\])(^tempest\.api)'
+ option:
+ - '--concurrency=4'
- dependencies:
- installer: '^((?!netvirt).)*$'
- scenario: '^((?!lxd).)*$'
+ -
+ case_name: tempest_scenario
+ project_name: functest
+ criteria: 100
+ blocking: false
+ description: >-
+ The list of test cases is generated by
+ Tempest automatically and depends on the parameters of
+ the OpenStack deployment.
+ https://github.com/openstack/tempest/blob/18.0.0/tox.ini#L84
run:
- module: 'functest.opnfv_tests.openstack.snaps.smoke'
- class: 'SnapsSmoke'
+ name: tempest_common
+ args:
+ mode: '(?!.*\[.*\bslow\b.*\])(^tempest\.scenario)'
+ option:
+ - '--concurrency=1'
- -
- name: features
- order: 2
- ci_loop: '(daily)|(weekly)'
- description: >-
- Test suites from feature projects
- integrated in functest
- testcases:
-
- case_name: doctor-notification
- project_name: doctor
+ case_name: tempest_slow
+ project_name: functest
criteria: 100
blocking: false
description: >-
- Test suite from Doctor project.
- dependencies:
- installer: 'apex'
- scenario: '^((?!fdio).)*$'
+ The list of test cases is generated by
+ Tempest automatically and depends on the parameters of
+ the OpenStack deployment.
+ https://github.com/openstack/tempest/blob/18.0.0/tox.ini#L84
run:
- module: 'functest.core.feature'
- class: 'BashFeature'
+ name: tempest_common
args:
- cmd: 'doctor-test'
+ mode: '(?=.*\[.*\bslow\b.*\])(^tempest\.)'
+ option:
+ - '--concurrency=1'
-
- case_name: bgpvpn
- project_name: sdnvpn
+ case_name: patrole_admin
+ project_name: functest
criteria: 100
blocking: false
description: >-
- Test suite from SDNVPN project.
- dependencies:
- installer: '(fuel)|(apex)|(netvirt)'
- scenario: 'bgpvpn'
+ Test suite from Patrole project.
run:
- module: 'sdnvpn.test.functest.run_sdnvpn_tests'
- class: 'SdnvpnFunctest'
+ name: patrole
+ args:
+ roles: 'admin'
+ mode: "(?!.*test_unmanage_snapshot_rbac)\
+ (?!.*test_show_auto_allocated_topology)\
+ (?!.*test_delete_auto_allocated_topology)\
+ (?!.*test_create_network_provider_segmentation_id)\
+ (?!.*compute.test_floating_ips_rbac)\
+ (?!.*test_reset_network)\
+ (?!.*test_create_image_from_volume_backed_server)\
+ (?!.*test_network_ip_availability_rbac.NetworkIpAvailabilityExtRbacTest.test_get_network_ip_availabilities)\
+ (?!.*test_policy_bandwidth_limit_rule_rbac)\
+ (?!.*test_policy_minimum_bandwidth_rule_rbac)\
+ (?!.*test_group_type_specs)\
+ (?!.*test_groups_rbac.GroupTypesV3RbacTest.test_create_group_type)\
+ (?!.*test_groups_rbac.GroupTypesV3RbacTest.test_delete_group_type)\
+ (?!.*test_groups_rbac.GroupTypesV3RbacTest.test_update_group_type)\
+ (?!.*test_group_snapshots_rbac)\
+ (?!.*test_groups_rbac)\
+ (?!.*test_quota_classes_rbac)\
+ (?!.*test_server_misc_policy_actions_rbac.MiscPolicyActionsNetworkRbacTest.test_create_interface)\
+ (?!.*test_server_misc_policy_actions_rbac.MiscPolicyActionsNetworkRbacTest.test_delete_interface)\
+ (?!.*test_server_misc_policy_actions_rbac.MiscPolicyActionsNetworkRbacTest.test_show_interface)\
+ (?!.*test_user_messages_rbac)\
+ (?!.*test_volume_actions_rbac.VolumesActionsV310RbacTest)\
+ (?!.*test_volume_actions_rbac.VolumesActionsV312RbacTest)\
+ (?!.*test_volume_metadata_rbac.VolumeMetadataV3RbacTest.test_delete_volume_image_metadata)\
+ (?!.*test_volume_metadata_rbac.VolumeMetadataV3RbacTest.test_list_volumes_details_image_metadata)\
+ (?!.*test_volume_metadata_rbac.VolumeMetadataV3RbacTest.test_show_volume_details_image_metadata)\
+ (?!.*test_volume_metadata_rbac.VolumeMetadataV3RbacTest.test_update_volume_image_metadata)\
+ (?!.*test_volumes_backup_rbac.VolumesBackupsV318RbacTest)\
+ (?!.*test_volumes_backup_rbac.VolumesBackupsV39RbacTest)\
+ (?!.*test_volume_types_rbac)\
+ (?=.*[.*\bslow\b.*])\
+ (^patrole_tempest_plugin.tests.api.(compute|image|network|volume))"
+ option:
+ - '--concurrency=4'
-
- case_name: functest-odl-sfc
- project_name: sfc
+ case_name: patrole_member
+ project_name: functest
criteria: 100
blocking: false
description: >-
- Test suite for odl-sfc to test two chains with one SF and
- one chain with two SFs
- dependencies:
- installer: ''
- scenario: 'odl.*sfc'
+ Test suite from Patrole project.
run:
- module: 'functest.core.feature'
- class: 'BashFeature'
+ name: patrole
args:
- cmd: 'run_sfc_tests.py'
+ roles: 'member'
+ mode: "(?!.*test_unmanage_snapshot_rbac)\
+ (?!.*test_show_auto_allocated_topology)\
+ (?!.*test_delete_auto_allocated_topology)\
+ (?!.*test_create_network_provider_segmentation_id)\
+ (?!.*compute.test_floating_ips_rbac)\
+ (?!.*test_reset_network)\
+ (?!.*test_create_image_from_volume_backed_server)\
+ (?!.*test_network_ip_availability_rbac.NetworkIpAvailabilityExtRbacTest.test_get_network_ip_availabilities)\
+ (?!.*test_policy_bandwidth_limit_rule_rbac)\
+ (?!.*test_policy_minimum_bandwidth_rule_rbac)\
+ (?!.*test_group_type_specs)\
+ (?!.*test_groups_rbac.GroupTypesV3RbacTest.test_create_group_type)\
+ (?!.*test_groups_rbac.GroupTypesV3RbacTest.test_delete_group_type)\
+ (?!.*test_groups_rbac.GroupTypesV3RbacTest.test_update_group_type)\
+ (?!.*test_group_snapshots_rbac)\
+ (?!.*test_groups_rbac)\
+ (?!.*test_quota_classes_rbac)\
+ (?!.*test_server_misc_policy_actions_rbac.MiscPolicyActionsNetworkRbacTest.test_create_interface)\
+ (?!.*test_server_misc_policy_actions_rbac.MiscPolicyActionsNetworkRbacTest.test_delete_interface)\
+ (?!.*test_server_misc_policy_actions_rbac.MiscPolicyActionsNetworkRbacTest.test_show_interface)\
+ (?!.*test_user_messages_rbac)\
+ (?!.*test_volume_actions_rbac.VolumesActionsV310RbacTest)\
+ (?!.*test_volume_actions_rbac.VolumesActionsV312RbacTest)\
+ (?!.*test_volume_metadata_rbac.VolumeMetadataV3RbacTest.test_delete_volume_image_metadata)\
+ (?!.*test_volume_metadata_rbac.VolumeMetadataV3RbacTest.test_list_volumes_details_image_metadata)\
+ (?!.*test_volume_metadata_rbac.VolumeMetadataV3RbacTest.test_show_volume_details_image_metadata)\
+ (?!.*test_volume_metadata_rbac.VolumeMetadataV3RbacTest.test_update_volume_image_metadata)\
+ (?!.*test_volumes_backup_rbac.VolumesBackupsV318RbacTest)\
+ (?!.*test_volumes_backup_rbac.VolumesBackupsV39RbacTest)\
+ (?!.*test_volume_types_rbac)\
+ (?=.*[.*\bslow\b.*])\
+ (^patrole_tempest_plugin.tests.api.(compute|image|network|volume))"
+ option:
+ - '--concurrency=4'
-
- case_name: barometercollectd
- project_name: barometer
+ case_name: patrole_reader
+ project_name: functest
criteria: 100
blocking: false
description: >-
- Test suite for the Barometer project. Separate tests verify
- the proper configuration and basic functionality of all the
- collectd plugins as described in the Project Release Plan
- dependencies:
- installer: 'apex'
- scenario: 'bar'
+ Test suite from Patrole project.
run:
- module: 'baro_tests.barometer'
- class: 'BarometerCollectd'
+ name: patrole
+ args:
+ roles: 'reader'
+ mode: "(?!.*test_unmanage_snapshot_rbac)\
+ (?!.*test_show_auto_allocated_topology)\
+ (?!.*test_delete_auto_allocated_topology)\
+ (?!.*test_create_network_provider_segmentation_id)\
+ (?!.*compute.test_floating_ips_rbac)\
+ (?!.*test_reset_network)\
+ (?!.*test_create_image_from_volume_backed_server)\
+ (?!.*test_network_ip_availability_rbac.NetworkIpAvailabilityExtRbacTest.test_get_network_ip_availabilities)\
+ (?!.*test_policy_bandwidth_limit_rule_rbac)\
+ (?!.*test_policy_minimum_bandwidth_rule_rbac)\
+ (?!.*test_group_type_specs)\
+ (?!.*test_groups_rbac.GroupTypesV3RbacTest.test_create_group_type)\
+ (?!.*test_groups_rbac.GroupTypesV3RbacTest.test_delete_group_type)\
+ (?!.*test_groups_rbac.GroupTypesV3RbacTest.test_update_group_type)\
+ (?!.*test_group_snapshots_rbac)\
+ (?!.*test_groups_rbac)\
+ (?!.*test_quota_classes_rbac)\
+ (?!.*test_server_misc_policy_actions_rbac.MiscPolicyActionsNetworkRbacTest.test_create_interface)\
+ (?!.*test_server_misc_policy_actions_rbac.MiscPolicyActionsNetworkRbacTest.test_delete_interface)\
+ (?!.*test_server_misc_policy_actions_rbac.MiscPolicyActionsNetworkRbacTest.test_show_interface)\
+ (?!.*test_user_messages_rbac)\
+ (?!.*test_volume_actions_rbac.VolumesActionsV310RbacTest)\
+ (?!.*test_volume_actions_rbac.VolumesActionsV312RbacTest)\
+ (?!.*test_volume_metadata_rbac.VolumeMetadataV3RbacTest.test_delete_volume_image_metadata)\
+ (?!.*test_volume_metadata_rbac.VolumeMetadataV3RbacTest.test_list_volumes_details_image_metadata)\
+ (?!.*test_volume_metadata_rbac.VolumeMetadataV3RbacTest.test_show_volume_details_image_metadata)\
+ (?!.*test_volume_metadata_rbac.VolumeMetadataV3RbacTest.test_update_volume_image_metadata)\
+ (?!.*test_volumes_backup_rbac.VolumesBackupsV318RbacTest)\
+ (?!.*test_volumes_backup_rbac.VolumesBackupsV39RbacTest)\
+ (?!.*test_volume_types_rbac)\
+ (?=.*[.*\bslow\b.*])\
+ (^patrole_tempest_plugin.tests.api.(compute|image|network|volume))"
+ option:
+ - '--concurrency=4'
-
- case_name: fds
- project_name: fastdatastacks
+ case_name: tempest_barbican
+ project_name: functest
criteria: 100
blocking: false
description: >-
- Test Suite for the OpenDaylight SDN Controller when GBP
- features are installed. It integrates some test suites from
- upstream using Robot as the test framework.
- dependencies:
- installer: 'apex'
- scenario: 'odl.*-fdio'
+ It leverages on the tempest plugin containing tests used to
+ verify the functionality of a barbican installation.
run:
- module: 'functest.opnfv_tests.sdn.odl.odl'
- class: 'ODLTests'
+ name: barbican
args:
- suites:
- - /src/fds/testing/robot
+ mode:
+ '^barbican_tempest_plugin.((?!test_signed_image_upload_boot_failure).)*$'
+ services:
+ - barbican
+ option:
+ - '--concurrency=4'
+
+ -
+ case_name: tempest_octavia
+ project_name: functest
+ criteria: 100
+ blocking: false
+ description: >-
+ It leverages on the tempest plugin containing tests used to
+ verify the functionality of an octavia installation.
+ run:
+ name: tempest_common
+ args:
+ mode: "(?!.*api.v2.test_availability_zone)\
+ (?!.*api.v2.test_availability_zone_profile)\
+ (?!.*api.v2.test_member.MemberAPITest.test_member_ipv4_create)\
+ (?!.*api.v2.test_member.MemberAPITest.test_member_ipv6_create)\
+ (^octavia_tempest_plugin.tests.(api|scenario))"
+ services:
+ - octavia
+ option:
+ - '--concurrency=2'
+
+ -
+ case_name: tempest_cyborg
+ project_name: functest
+ criteria: 100
+ blocking: false
+ description: >-
+ It leverages on the tempest plugin containing tests used to
+ verify the functionality of a cyborg installation.
+ run:
+ name: tempest_common
+ args:
+ mode: '^cyborg_tempest_plugin'
+ services:
+ - cyborg
+ option:
+ - '--concurrency=4'
-
- name: components
- order: 3
- ci_loop: 'weekly'
+ name: smoke_cntt
description: >-
- Extensive testing of OpenStack API.
+ Set of basic Functional tests to validate the OPNFV scenarios.
testcases:
-
- case_name: tempest_full_parallel
+ case_name: tempest_neutron_cntt
+ project_name: functest
+ criteria: 100
+ blocking: false
+ deny_skipping: true
+ tests_count: 564
+ description: >-
+ This test case runs the Tempest suite proposed by the
+ Neutron project. The list of test cases is generated by
+ Tempest automatically and depends on the parameters of
+ the OpenStack deployment.
+ run:
+ name: tempest_common
+ args:
+ mode: "(?!.*admin.test_agent_availability_zone)\
+ (?!.*admin.test_dhcp_agent_scheduler)\
+ (?!.*admin.test_l3_agent_scheduler)\
+ (?!.*admin.test_logging)\
+ (?!.*admin.test_logging_negative)\
+ (?!.*admin.test_network_segment_range)\
+ (?!.*admin.test_ports.PortTestCasesAdmin.test_regenerate_mac_address)\
+ (?!.*admin.test_ports.PortTestCasesResourceRequest)\
+ (?!.*admin.test_routers_dvr)\
+ (?!.*admin.test_routers_flavors)\
+ (?!.*admin.test_routers_ha)\
+ (?!.*test_conntrack_helper)\
+ (?!.*test_floating_ips.FloatingIPPoolTestJSON)\
+ (?!.*test_floating_ips.FloatingIPTestJSON.test_create_update_floatingip_port_details)\
+ (?!.*test_local_ip)\
+ (?!.*test_metering_extensions)\
+ (?!.*test_metering_negative)\
+ (?!.*test_networks.NetworksSearchCriteriaTest.test_list_validation_filters)\
+ (?!.*test_networks.NetworksTestAdmin.test_create_tenant_network_vxlan)\
+ (?!.*test_networks.NetworksTestJSON.test_create_update_network_dns_domain)\
+ (?!.*test_port_forwardings)\
+ (?!.*test_ports.PortsTaggingOnCreation)\
+ (?!.*test_ports.PortsTestJSON.test_create_port_with_propagate_uplink_status)\
+ (?!.*test_ports.PortsTestJSON.test_create_port_without_propagate_uplink_status)\
+ (?!.*test_ports.PortsTestJSON.test_create_update_port_with_dns_domain)\
+ (?!.*test_ports.PortsTestJSON.test_create_update_port_with_dns_name)\
+ (?!.*test_ports.PortsTestJSON.test_create_update_port_with_no_dns_name)\
+ (?!.*test_qos.QosMinimumBandwidthRuleTestJSON)\
+ (?!.*test_revisions.TestRevisions.test_update_dns_domain_bumps_revision)\
+ (?!.*test_revisions.TestRevisions.test_update_router_extra_attributes_bumps_revision)\
+ (?!.*test_router_interface_fip)\
+ (?!.*test_routers.DvrRoutersTest)\
+ (?!.*test_routers.HaRoutersTest)\
+ (?!.*test_routers.RoutersIpV6Test.test_extra_routes_atomic)\
+ (?!.*test_routers.RoutersTest.test_extra_routes_atomic)\
+ (?!.*test_routers_negative.DvrRoutersNegativeTest)\
+ (?!.*test_routers_negative.DvrRoutersNegativeTestExtended)\
+ (?!.*test_routers_negative.HaRoutersNegativeTest)\
+ (?!.*test_security_groups.RbacSharedSecurityGroupTest)\
+ (?!.*test_subnetpool_prefix_ops)\
+ (?!.*test_subnetpools.RbacSubnetPoolTest)\
+ (?!.*test_subnetpools.SubnetPoolsSearchCriteriaTest.test_list_validation_filters)\
+ (?!.*test_subnetpools_negative.SubnetPoolsNegativeTestJSON.test_tenant_create_subnetpool_associate_shared_address_scope)\
+ (?!.*test_subnets.SubnetsSearchCriteriaTest.test_list_validation_filters)\
+ (?!.*test_timestamp.TestTimeStamp.test_segment_with_timestamp)\
+ (?!.*test_trunk.TrunkTestInheritJSONBase.test_add_subport)\
+ (?!.*test_trunk.TrunkTestMtusJSON)\
+ (?!.*test_trunk_negative.TrunkTestJSON.test_create_subport_invalid_inherit_network_segmentation_type)\
+ (?!.*test_trunk_negative.TrunkTestMtusJSON)\
+ (^neutron_tempest_plugin.api)"
+ option:
+ - '--concurrency=4'
+
+ -
+ case_name: tempest_cinder_cntt
+ project_name: functest
+ criteria: 100
+ blocking: false
+ deny_skipping: true
+ tests_count: 10
+ description: >-
+ This test case runs the Tempest suite proposed by the
+ Cinder project.
+ run:
+ name: tempest_common
+ args:
+ mode: "(?!.*test_incremental_backup)\
+ (?!.*test_consistencygroups)\
+ (?!.*test_backup_crossproject_admin_negative)\
+ (?!.*test_backup_crossproject_user_negative)\
+ (?!.*test_volume_encrypted.TestEncryptedCinderVolumes)\
+ (?!.*rbac)\
+ (^cinder_tempest_plugin.)"
+ option:
+ - '--concurrency=4'
+
+ -
+ case_name: tempest_keystone_cntt
+ project_name: functest
+ criteria: 100
+ blocking: false
+ deny_skipping: true
+ tests_count: 27
+ description: >-
+ This test case runs the Tempest suite proposed by the
+ Keystone project.
+ run:
+ name: tempest_common
+ args:
+ mode: "(?!.*api.identity.v3.test_oauth1_tokens)\
+ (?!.*rbac)\
+ (?!.*scenario.test_federated_authentication)\
+ keystone_tempest_plugin."
+ option:
+ - '--concurrency=4'
+
+ -
+ case_name: tempest_heat_cntt
+ project_name: functest
+ criteria: 100
+ blocking: false
+ deny_skipping: true
+ tests_count: 124
+ description: >-
+ This test case runs the Tempest suite proposed by the
+ Heat project.
+ run:
+ name: tempest_heat
+ args:
+ mode: "(?!.*functional.test_lbaasv2)\
+ (?!.*functional.test_encryption_vol_type)\
+ (?!.*functional.test_event_sinks)\
+ (?!.*functional.test_software_config.ZaqarSignalTransportTest)\
+ (?!.*functional.test_stack_events)\
+ (?!.*functional.test_waitcondition)\
+ (?!.*RemoteStackTest.test_stack_create_with_cloud_credential)\
+ (?!.*scenario.test_aodh_alarm)\
+ (?!.*tests.scenario.test_autoscaling_lb)\
+ (?!.*scenario.test_autoscaling_lbv2)\
+ (?!.*scenario.test_server_software_config)\
+ (?!.*test_volumes.VolumeBackupRestoreIntegrationTest)\
+ (?!.*scenario.test_octavia_lbaas)\
+ (?!.*scenario.test_server_cfn_init)\
+ ^heat_tempest_plugin.tests"
+ option:
+ - '--concurrency=1'
+
+ -
+ case_name: rally_sanity_cntt
project_name: functest
- criteria: 80
+ criteria: 100
blocking: false
description: >-
+ This test case runs a sub group of tests of the OpenStack
+ Rally suite in smoke mode.
+ run:
+ name: rally_sanity
+ args:
+ tests:
+ - 'authenticate'
+ - 'glance'
+ - 'cinder'
+ - 'heat'
+ - 'keystone'
+ - 'neutron'
+ - 'nova'
+ - 'quotas'
+ - 'swift'
+
+ -
+ case_name: tempest_full_cntt
+ project_name: functest
+ criteria: 100
+ blocking: false
+ deny_skipping: true
+ tests_count: 1271
+ description: >-
The list of test cases is generated by
Tempest automatically and depends on the parameters of
- the OpenStack deplopyment.
- dependencies:
- installer: '^((?!netvirt).)*$'
- scenario: ''
+ the OpenStack deployment.
+ https://github.com/openstack/tempest/blob/18.0.0/tox.ini#L83
+ run:
+ name: tempest_common
+ args:
+ mode: "(?!.*admin.test_agents)(?!.*test_fixed_ips)\
+ (?!.*test_fixed_ips_negative)\
+ (?!.*test_auto_allocate_network)(?!.*test_floating_ips_bulk)\
+ (?!.*test_flavors_microversions.FlavorsV255TestJSON)\
+ (?!.*test_flavors_microversions.FlavorsV261TestJSON)\
+ (?!.*test_live_migration.LiveAutoBlockMigrationV225Test.test_iscsi_volume)\
+ (?!.*test_live_migration.LiveAutoBlockMigrationV225Test.test_live_block_migration)\
+ (?!.*test_live_migration.LiveAutoBlockMigrationV225Test.test_live_block_migration_paused)\
+ (?!.*test_live_migration.LiveAutoBlockMigrationV225Test.test_volume_backed_live_migration)\
+ (?!.*test_live_migration.LiveMigrationTest.test_iscsi_volume)\
+ (?!.*test_live_migration.LiveMigrationTest.test_live_block_migration)\
+ (?!.*test_live_migration.LiveMigrationTest.test_live_block_migration_paused)\
+ (?!.*test_live_migration.LiveMigrationTest.test_volume_backed_live_migration)\
+ (?!.*test_live_migration.LiveMigrationRemoteConsolesV26Test)\
+ (?!.*test_quotas.QuotasAdminTestV257)\
+ (?!.*test_servers.ServersAdminTestJSON.test_reset_network_inject_network_info)\
+ (?!.*certificates.test_certificates)\
+ (?!.*test_quotas_negative.QuotasSecurityGroupAdminNegativeTest)\
+ (?!.*test_novnc)(?!.*test_server_personality)\
+ (?!.*test_servers.ServerShowV263Test.test_show_update_rebuild_list_server)\
+ (?!.*test_servers_microversions.ServerShowV254Test)\
+ (?!.*test_servers_microversions.ServerShowV257Test)\
+ (?!.*test_servers_negative.ServersNegativeTestJSON.test_personality_file_contents_not_encoded)\
+ (?!.*servers.test_virtual_interfaces)\
+ (?!.*test_server_actions.ServerActionsTestJSON.test_change_server_password)\
+ (?!.*test_server_actions.ServerActionsTestJSON.test_get_vnc_console)\
+ (?!.*test_server_actions.ServerActionsTestJSON.test_reboot_server_soft)\
+ (?!.*test_server_rescue.ServerBootFromVolumeStableRescueTest)\
+ (?!.*test_server_rescue.ServerStableDeviceRescueTest)\
+ (?!.*test_security_group_default_rules)\
+ (?!.*test_security_groups_negative.SecurityGroupsNegativeTestJSON.test_security_group_create_with_duplicate_name)\
+ (?!.*test_security_groups_negative.SecurityGroupsNegativeTestJSON.test_security_group_create_with_invalid_group_description)\
+ (?!.*test_security_groups_negative.SecurityGroupsNegativeTestJSON.test_security_group_create_with_invalid_group_name)\
+ (?!.*test_security_groups_negative.SecurityGroupsNegativeTestJSON.test_update_security_group_with_invalid_sg_des)\
+ (?!.*test_security_groups_negative.SecurityGroupsNegativeTestJSON.test_update_security_group_with_invalid_sg_id)\
+ (?!.*test_security_groups_negative.SecurityGroupsNegativeTestJSON.test_update_security_group_with_invalid_sg_name)\
+ (?!.*test_create_server.ServersTestFqdnHostnames.test_create_server_with_fqdn_name)\
+ (?!.*test_server_metadata.ServerMetadataTestJSON)\
+ (?!.*test_server_metadata_negative.ServerMetadataNegativeTestJSON.test_delete_metadata_non_existent_server)\
+ (?!.*test_server_metadata_negative.ServerMetadataNegativeTestJSON.test_metadata_items_limit)\
+ (?!.*test_server_metadata_negative.ServerMetadataNegativeTestJSON.test_set_metadata_invalid_key)\
+ (?!.*test_server_metadata_negative.ServerMetadataNegativeTestJSON.test_set_metadata_non_existent_server)\
+ (?!.*test_server_metadata_negative.ServerMetadataNegativeTestJSON.test_set_server_metadata_blank_key)\
+ (?!.*test_server_metadata_negative.ServerMetadataNegativeTestJSON.test_set_server_metadata_missing_metadata)\
+ (?!.*test_server_metadata_negative.ServerMetadataNegativeTestJSON.test_update_metadata_non_existent_server)\
+ (?!.*test_server_metadata_negative.ServerMetadataNegativeTestJSON.test_update_metadata_with_blank_key)\
+ (?!.*test_list_server_filters.ListServerFiltersTestJSON.test_list_servers_filtered_by_ip_regex)\
+ (?!.*compute.test_virtual_interfaces)(?!.*compute.test_virtual_interfaces_negative)\
+ (?!.*compute.test_networks)\
+ (?!.*test_attach_volume.AttachVolumeMultiAttach)\
+ (?!.*identity.admin.v2)(?!.*identity.v2)\
+ (?!.*identity.v3.test_access_rules)\
+ (?!.*identity.v3.test_application_credentials.ApplicationCredentialsV3Test.test_create_application_credential_access_rules)\
+ (?!.*image.v1)\
+ (?!.*image.v2.admin.test_images.ImportCopyImagesTest)\
+ (?!.*image.v2.test_images_negative.ImagesNegativeTest.test_create_image_reserved_property)\
+ (?!.*image.v2.test_images_negative.ImagesNegativeTest.test_update_image_reserved_property)\
+ (?!.*image.v2.test_images_negative.ImportImagesNegativeTest.test_image_web_download_import_with_bad_url)\
+ (?!.*image.v2.test_images.ImportImagesTest)\
+ (?!.*image.v2.test_images.MultiStoresImportImages)\
+ (?!.*admin.test_dhcp_agent_scheduler)\
+ (?!.*admin.test_routers_dvr)\
+ (?!.*test_metering_extensions)(?!.*network.test_tags)\
+ (?!.*test_routers_negative.DvrRoutersNegativeTest)\
+ (?!.*test_routers.RoutersIpV6Test.test_create_router_set_gateway_with_fixed_ip)\
+ (?!.*test_routers.RoutersTest.test_create_router_set_gateway_with_fixed_ip)\
+ (?!.*test_object_services.ObjectTest.test_create_object_with_transfer_encoding)\
+ (?!.*test_encrypted_volumes_extend)\
+ (?!.*test_group_snapshots.GroupSnapshotsV319Test.test_reset_group_snapshot_status)\
+ (?!.*test_multi_backend)\
+ (?!.*test_volume_retype.VolumeRetypeWithMigrationTest)\
+ (?!.*test_volume_delete_cascade.VolumesDeleteCascade.test_volume_from_snapshot_cascade_delete)\
+ (?!.*test_volumes_backup.VolumesBackupsTest.test_volume_backup_create_get_detailed_list_restore_delete)\
+ (?!.*test_volumes_negative.UpdateMultiattachVolumeNegativeTest.test_multiattach_rw_volume_update_failure)\
+ (?!.*test_volumes_extend.VolumesExtendAttachedTest.test_extend_attached_volume)\
+ (?!.*\\[.*\\bslow\\b.*\\])(^tempest.api)"
+ option:
+ - '--concurrency=4'
+
+ -
+ case_name: tempest_scenario_cntt
+ project_name: functest
+ criteria: 100
+ blocking: false
+ deny_skipping: true
+ tests_count: 13
+ description: >-
+ The list of test cases is generated by
+ Tempest automatically and depends on the parameters of
+ the OpenStack deployment.
+ https://github.com/openstack/tempest/blob/18.0.0/tox.ini#L84
+ run:
+ name: tempest_scenario
+ args:
+ mode: "\
+ (?!.*test_compute_unified_limits)\
+ (?!.*test_minbw_allocation_placement)\
+ (?!.*test_network_qos_placement)\
+ (?!.*test_unified_limits.ImageQuotaTest.test_image_count_uploading_quota)\
+ (?!.*test_unified_limits.ImageQuotaTest.test_image_stage_quota)\
+ (?!.*test_volume_boot_pattern.TestVolumeBootPattern.test_boot_server_from_encrypted_volume_luks)\
+ (?!.*\\[.*\\bslow\\b.*\\])(^tempest.scenario)"
+ option:
+ - '--concurrency=1'
+
+ -
+ case_name: tempest_slow_cntt
+ project_name: functest
+ criteria: 100
+ blocking: false
+ deny_skipping: true
+ tests_count: 43
+ description: >-
+ The list of test cases is generated by
+ Tempest automatically and depends on the parameters of
+ the OpenStack deployment.
+ https://github.com/openstack/tempest/blob/18.0.0/tox.ini#L84
run:
- module: 'functest.opnfv_tests.openstack.tempest.tempest'
- class: 'TempestFullParallel'
+ name: tempest_common
+ args:
+ mode: "(?!.*test_volume_swap)\
+ (?!.*test_server_personality)\
+ (?!.*test_server_rescue.ServerBootFromVolumeStableRescueTest)\
+ (?!.*test_container_sync.ContainerSyncTest.test_container_synchronization)\
+ (?!.*test_container_sync_middleware.ContainerSyncMiddlewareTest.test_container_synchronization)\
+ (?!.*test_encrypted_cinder_volumes)\
+ (?!.*test_minbw_allocation_placement)\
+ (?!.*test_network_basic_ops.TestNetworkBasicOps.test_router_rescheduling)\
+ (?!.*test_shelve_instance.TestShelveInstance.test_cold_migrate_unshelved_instance)\
+ (?!.*test_volume_migrate_attached)\
+ (?!.*test_network_advanced_server_ops.TestNetworkAdvancedServerOps.test_server_connectivity_cold_migration_revert)\
+ (?=.*\\[.*\\bslow\\b.*\\])(^tempest.)"
+ option:
+ - '--concurrency=1'
+ -
+ name: benchmarking
+ description: >-
+ Run several OpenStack performance tools
+ https://docs.openstack.org/performance-docs/latest/methodologies/tools.html
+ testcases:
-
case_name: rally_full
project_name: functest
- criteria: 90
+ criteria: 100
blocking: false
description: >-
This test case runs the full suite of scenarios of the
OpenStack Rally suite using several threads and iterations.
+ run:
+ name: rally_full
+ args:
+ optional:
+ - 'gnocchi'
+ - 'barbican'
+
+ -
+ case_name: rally_jobs
+ project_name: functest
+ criteria: 100
+ blocking: false
+ description: >-
+ This test case runs a group of Rally jobs used in
+ OpenStack gating
+ dependencies:
+ - NO_TENANT_NETWORK: '^(?![tT]rue$)'
+ run:
+ name: rally_jobs
+ args:
+ optional:
+ - 'gnocchi'
+
+ -
+ case_name: vmtp
+ project_name: functest
+ criteria: 100
+ blocking: false
+ description: >-
+ VMTP is a small python application that will automatically
+ perform ping connectivity, round trip time measurement
+ (latency) and TCP/UDP throughput
+ dependencies:
+ - NO_TENANT_NETWORK: '^(?![tT]rue$)'
+ run:
+ name: vmtp
+
+ -
+ case_name: shaker
+ project_name: functest
+ criteria: 100
+ blocking: false
+ description: >-
+ Shaker wraps around popular system network testing tools
+ like iperf, iperf3 and netperf (with help of flent). Shaker
+ is able to deploy OpenStack instances and networks in
+ different topologies.
dependencies:
- installer: '^((?!netvirt).)*$'
- scenario: ''
+ - NO_TENANT_NETWORK: '^(?![tT]rue$)'
run:
- module: 'functest.opnfv_tests.openstack.rally.rally'
- class: 'RallyFull'
+ name: shaker
+
+ -
+ name: benchmarking_cntt
+ description: >-
+ Run several OpenStack performance tools
+ https://docs.openstack.org/performance-docs/latest/methodologies/tools.html
+ testcases:
+ -
+ case_name: rally_full_cntt
+ project_name: functest
+ criteria: 100
+ blocking: false
+ description: >-
+ This test case runs the full suite of scenarios of the
+ OpenStack Rally suite using several threads and iterations.
+ run:
+ name: rally_full
+ args:
+ tests:
+ - 'authenticate'
+ - 'glance'
+ - 'cinder'
+ - 'heat'
+ - 'keystone'
+ - 'neutron'
+ - 'nova'
+ - 'quotas'
+ - 'swift'
+
+ -
+ case_name: rally_jobs_cntt
+ project_name: functest
+ criteria: 100
+ blocking: false
+ description: >-
+ This test case runs a group of Rally jobs used in
+ OpenStack gating
+ run:
+ name: rally_jobs
+ args:
+ tests:
+ - 'neutron'
-
name: vnf
- order: 4
- ci_loop: '(daily)|(weekly)'
description: >-
Collection of VNF test cases.
testcases:
-
- case_name: cloudify_ims
+ case_name: cloudify
project_name: functest
- criteria: 80
+ criteria: 100
blocking: false
description: >-
- This test case deploys an OpenSource vIMS solution from
- Clearwater using the Cloudify orchestrator. It also runs
- some signaling traffic.
- dependencies:
- installer: ''
- scenario: 'os-nosdn-nofeature-ha'
+ This test case deploys the Cloudify orchestrator.
run:
- module: 'functest.opnfv_tests.vnf.ims.cloudify_ims'
- class: 'CloudifyIms'
-
+ name: cloudify
-
- case_name: vyos_vrouter
+ case_name: cloudify_ims
project_name: functest
criteria: 100
blocking: false
description: >-
- This test case is vRouter testing.
+ This test case deploys an OpenSource vIMS solution from
+ Clearwater using the Cloudify orchestrator. It also runs
+ some signaling traffic.
dependencies:
- installer: ''
- scenario: 'os-nosdn-nofeature-ha'
+ - NO_TENANT_NETWORK: '^(?![tT]rue$)'
run:
- module: 'functest.opnfv_tests.vnf.router.cloudify_vrouter'
- class: 'CloudifyVrouter'
+ name: cloudify_ims
-
- case_name: orchestra_openims
- project_name: orchestra
+ case_name: heat_ims
+ project_name: functest
criteria: 100
blocking: false
description: >-
- OpenIMS VNF deployment with Open Baton (Orchestra)
+ This test case deploys an OpenSource vIMS solution from
+ Clearwater using the OpenStack Heat orchestrator.
+ It also runs some signaling traffic.
dependencies:
- installer: 'daisy'
- scenario: 'os-nosdn-nofeature-ha'
+ - NO_TENANT_NETWORK: '^(?![tT]rue$)'
run:
- module: 'functest.opnfv_tests.vnf.ims.orchestra_openims'
- class: 'OpenImsVnf'
+ name: heat_ims
-
- case_name: orchestra_clearwaterims
- project_name: orchestra
+ case_name: vyos_vrouter
+ project_name: functest
criteria: 100
blocking: false
description: >-
- ClearwaterIMS VNF deployment with Open Baton (Orchestra)
+ This test case is vRouter testing.
dependencies:
- installer: 'daisy'
- scenario: 'os-nosdn-nofeature-ha'
+ - NO_TENANT_NETWORK: '^(?![tT]rue$)'
run:
- module:
- 'functest.opnfv_tests.vnf.ims.orchestra_clearwaterims'
- class: 'ClearwaterImsVnf'
+ name: vyos_vrouter
-
case_name: juju_epc
- enabled: true
project_name: functest
criteria: 100
blocking: false
@@ -416,8 +1070,6 @@ tiers:
vEPC validation with Juju as VNF manager and ABoT as test
executor.
dependencies:
- installer: ''
- scenario: 'os-nosdn-nofeature-ha'
+ - NO_TENANT_NETWORK: '^(?![tT]rue$)'
run:
- module: 'functest.opnfv_tests.vnf.epc.juju_epc'
- class: 'JujuEpc'
+ name: juju_epc
diff --git a/functest/ci/tier_builder.py b/functest/ci/tier_builder.py
deleted file mode 100644
index 9e92599d8..000000000
--- a/functest/ci/tier_builder.py
+++ /dev/null
@@ -1,107 +0,0 @@
-#!/usr/bin/env python
-
-# Copyright (c) 2016 Ericsson AB and others.
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-
-"""TierBuilder class to parse testcases config file"""
-
-import yaml
-
-import functest.ci.tier_handler as th
-
-
-class TierBuilder(object):
- # pylint: disable=missing-docstring
-
- def __init__(self, ci_installer, ci_scenario, testcases_file):
- self.ci_installer = ci_installer
- self.ci_scenario = ci_scenario
- self.testcases_file = testcases_file
- self.dic_tier_array = None
- self.tier_objects = []
- self.testcases_yaml = None
- self.generate_tiers()
-
- def read_test_yaml(self):
- with open(self.testcases_file) as tc_file:
- self.testcases_yaml = yaml.safe_load(tc_file)
-
- self.dic_tier_array = []
- for tier in self.testcases_yaml.get("tiers"):
- self.dic_tier_array.append(tier)
-
- def generate_tiers(self):
- if self.dic_tier_array is None:
- self.read_test_yaml()
-
- del self.tier_objects[:]
- for dic_tier in self.dic_tier_array:
- tier = th.Tier(name=dic_tier['name'],
- order=dic_tier['order'],
- ci_loop=dic_tier['ci_loop'],
- description=dic_tier['description'])
-
- for dic_testcase in dic_tier['testcases']:
- installer = dic_testcase['dependencies']['installer']
- scenario = dic_testcase['dependencies']['scenario']
- dep = th.Dependency(installer, scenario)
-
- testcase = th.TestCase(name=dic_testcase['case_name'],
- enabled=dic_testcase.get(
- 'enabled', True),
- dependency=dep,
- criteria=dic_testcase['criteria'],
- blocking=dic_testcase['blocking'],
- description=dic_testcase['description'],
- project=dic_testcase['project_name'])
- if (testcase.is_compatible(self.ci_installer,
- self.ci_scenario) and
- testcase.is_enabled()):
- tier.add_test(testcase)
- else:
- tier.skip_test(testcase)
-
- self.tier_objects.append(tier)
-
- def get_tiers(self):
- return self.tier_objects
-
- def get_tier_names(self):
- tier_names = []
- for tier in self.tier_objects:
- tier_names.append(tier.get_name())
- return tier_names
-
- def get_tier(self, tier_name):
- for i in range(0, len(self.tier_objects)):
- if self.tier_objects[i].get_name() == tier_name:
- return self.tier_objects[i]
- return None
-
- def get_tier_name(self, test_name):
- for i in range(0, len(self.tier_objects)):
- if self.tier_objects[i].is_test(test_name):
- return self.tier_objects[i].name
- return None
-
- def get_test(self, test_name):
- for i in range(0, len(self.tier_objects)):
- if self.tier_objects[i].is_test(test_name):
- return self.tier_objects[i].get_test(test_name)
- return None
-
- def get_tests(self, tier_name):
- for i in range(0, len(self.tier_objects)):
- if self.tier_objects[i].get_name() == tier_name:
- return self.tier_objects[i].get_tests()
- return None
-
- def __str__(self):
- output = ""
- for i in range(0, len(self.tier_objects)):
- output += str(self.tier_objects[i]) + "\n"
- return output
diff --git a/functest/ci/tier_handler.py b/functest/ci/tier_handler.py
deleted file mode 100644
index 9fc3f24d8..000000000
--- a/functest/ci/tier_handler.py
+++ /dev/null
@@ -1,174 +0,0 @@
-#!/usr/bin/env python
-
-# Copyright (c) 2016 Ericsson AB and others.
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-
-"""Tier and TestCase classes to wrap the testcases config file"""
-# pylint: disable=missing-docstring
-
-import re
-import textwrap
-
-import prettytable
-
-
-LINE_LENGTH = 72
-
-
-def split_text(text, max_len):
- words = text.split()
- lines = []
- line = ""
- for word in words:
- if len(line) + len(word) < max_len - 1:
- line += word + " "
- else:
- lines.append(line)
- line = word + " "
- if line != "":
- lines.append(line)
- return lines
-
-
-class Tier(object):
-
- def __init__(self, name, order, ci_loop, description=""):
- self.tests_array = []
- self.skipped_tests_array = []
- self.name = name
- self.order = order
- self.ci_loop = ci_loop
- self.description = description
-
- def add_test(self, testcase):
- self.tests_array.append(testcase)
-
- def skip_test(self, testcase):
- self.skipped_tests_array.append(testcase)
-
- def get_tests(self):
- array_tests = []
- for test in self.tests_array:
- array_tests.append(test)
- return array_tests
-
- def get_skipped_test(self):
- return self.skipped_tests_array
-
- def get_test_names(self):
- array_tests = []
- for test in self.tests_array:
- array_tests.append(test.get_name())
- return array_tests
-
- def get_test(self, test_name):
- if self.is_test(test_name):
- for test in self.tests_array:
- if test.get_name() == test_name:
- return test
- return None
-
- def is_test(self, test_name):
- for test in self.tests_array:
- if test.get_name() == test_name:
- return True
- return False
-
- def get_name(self):
- return self.name
-
- def get_order(self):
- return self.order
-
- def get_ci_loop(self):
- return self.ci_loop
-
- def __str__(self):
- msg = prettytable.PrettyTable(
- header_style='upper', padding_width=5,
- field_names=['tiers', 'order', 'CI Loop', 'description',
- 'testcases'])
- msg.add_row(
- [self.name, self.order, self.ci_loop,
- textwrap.fill(self.description, width=40),
- textwrap.fill(' '.join([str(x.get_name(
- )) for x in self.get_tests()]), width=40)])
- return msg.get_string()
-
-
-class TestCase(object):
-
- def __init__(self, name, enabled, dependency, criteria, blocking,
- description="", project=""):
- # pylint: disable=too-many-arguments
- self.name = name
- self.enabled = enabled
- self.dependency = dependency
- self.criteria = criteria
- self.blocking = blocking
- self.description = description
- self.project = project
-
- @staticmethod
- def is_none(item):
- return item is None or item == ""
-
- def is_compatible(self, ci_installer, ci_scenario):
- try:
- if not self.is_none(ci_installer):
- if re.search(self.dependency.get_installer(),
- ci_installer) is None:
- return False
- if not self.is_none(ci_scenario):
- if re.search(self.dependency.get_scenario(),
- ci_scenario) is None:
- return False
- return True
- except TypeError:
- return False
-
- def get_name(self):
- return self.name
-
- def is_enabled(self):
- return self.enabled
-
- def get_criteria(self):
- return self.criteria
-
- def is_blocking(self):
- return self.blocking
-
- def get_project(self):
- return self.project
-
- def __str__(self):
- msg = prettytable.PrettyTable(
- header_style='upper', padding_width=5,
- field_names=['test case', 'description', 'criteria', 'dependency'])
- msg.add_row([self.name, textwrap.fill(self.description, width=40),
- self.criteria, self.dependency])
- return msg.get_string()
-
-
-class Dependency(object):
-
- def __init__(self, installer, scenario):
- self.installer = installer
- self.scenario = scenario
-
- def get_installer(self):
- return self.installer
-
- def get_scenario(self):
- return self.scenario
-
- def __str__(self):
- delimitator = "\n" if self.get_installer(
- ) and self.get_scenario() else ""
- return "{}{}{}".format(self.get_installer(), delimitator,
- self.get_scenario())
diff --git a/functest/cli/cli_base.py b/functest/cli/cli_base.py
deleted file mode 100644
index 5890e0a35..000000000
--- a/functest/cli/cli_base.py
+++ /dev/null
@@ -1,127 +0,0 @@
-#!/usr/bin/env python
-#
-# jose.lausuch@ericsson.com
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-
-import click
-import logging.config
-import pkg_resources
-
-from functest.cli.commands.cli_env import CliEnv
-from functest.cli.commands.cli_os import CliOpenStack
-from functest.cli.commands.cli_testcase import CliTestcase
-from functest.cli.commands.cli_tier import CliTier
-
-
-CONTEXT_SETTINGS = dict(help_option_names=['-h', '--help'])
-
-
-@click.group(context_settings=CONTEXT_SETTINGS)
-@click.version_option(version='opnfv colorado.0.1 ')
-def cli():
- logging.config.fileConfig(pkg_resources.resource_filename(
- 'functest', 'ci/logging.ini'))
- logging.captureWarnings(True)
-
-
-_env = CliEnv()
-_openstack = CliOpenStack()
-_testcase = CliTestcase()
-_tier = CliTier()
-
-
-@cli.group()
-@click.pass_context
-def env(ctx):
- pass
-
-
-@cli.group()
-@click.pass_context
-def openstack(ctx):
- pass
-
-
-@cli.group()
-@click.pass_context
-def testcase(ctx):
- pass
-
-
-@cli.group()
-@click.pass_context
-def tier(ctx):
- pass
-
-
-@openstack.command('check', help="Checks connectivity and status "
- "to the OpenStack deployment.")
-def os_check():
- _openstack.check()
-
-
-@openstack.command('show-credentials',
- help="Prints the OpenStack credentials.")
-def os_show_credentials():
- _openstack.show_credentials()
-
-
-@env.command('show', help="Shows information about the current environment.")
-def env_show():
- _env.show()
-
-
-@testcase.command('list', help="Lists the available testcases.")
-def testcase_list():
- _testcase.list()
-
-
-@testcase.command('show', help="Shows information about a test case.")
-@click.argument('testname', type=click.STRING, required=True)
-def testcase_show(testname):
- _testcase.show(testname)
-
-
-@testcase.command('run', help="Executes a test case.")
-@click.argument('testname', type=click.STRING, required=True)
-@click.option('-n', '--noclean', is_flag=True, default=False,
- help='The created openstack resources by the test'
- 'will not be cleaned after the execution.')
-@click.option('-r', '--report', is_flag=True, default=False,
- help='Push results to the results DataBase. Only CI Pods'
- 'have rights to do that.')
-def testcase_run(testname, noclean, report):
- _testcase.run(testname, noclean, report)
-
-
-@tier.command('list', help="Lists the available tiers.")
-def tier_list():
- _tier.list()
-
-
-@tier.command('show', help="Shows information about a tier.")
-@click.argument('tiername', type=click.STRING, required=True)
-def tier_show(tiername):
- _tier.show(tiername)
-
-
-@tier.command('get-tests', help="Prints the tests in a tier.")
-@click.argument('tiername', type=click.STRING, required=True)
-def tier_gettests(tiername):
- _tier.gettests(tiername)
-
-
-@tier.command('run', help="Executes all the tests within a tier.")
-@click.argument('tiername', type=click.STRING, required=True)
-@click.option('-n', '--noclean', is_flag=True, default=False,
- help='The created openstack resources by the tests'
- 'will not be cleaned after the execution.')
-@click.option('-r', '--report', is_flag=True, default=False,
- help='Push results to the results DataBase. Only CI Pods'
- 'have rights to do that.')
-def tier_run(tiername, noclean, report):
- _tier.run(tiername, noclean, report)
diff --git a/functest/cli/commands/cli_env.py b/functest/cli/commands/cli_env.py
deleted file mode 100644
index c41f8f340..000000000
--- a/functest/cli/commands/cli_env.py
+++ /dev/null
@@ -1,60 +0,0 @@
-#!/usr/bin/env python
-#
-# jose.lausuch@ericsson.com
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-
-import click
-import prettytable
-
-from functest.utils.constants import CONST
-
-import six
-
-
-class Env(object):
-
- def __init__(self):
- pass
-
- def show(self):
- def _get_value(attr, default='Unknown'):
- return attr if attr else default
-
- install_type = _get_value(CONST.__getattribute__('INSTALLER_TYPE'))
- installer_ip = _get_value(CONST.__getattribute__('INSTALLER_IP'))
- installer_info = ("%s, %s" % (install_type, installer_ip))
- scenario = _get_value(CONST.__getattribute__('DEPLOY_SCENARIO'))
- node = _get_value(CONST.__getattribute__('NODE_NAME'))
- is_debug = _get_value(CONST.__getattribute__('CI_DEBUG'), 'false')
- build_tag = CONST.__getattribute__('BUILD_TAG')
- if build_tag is not None:
- build_tag = build_tag.lstrip(
- "jenkins-").lstrip("functest").lstrip("-")
-
- env_info = {'INSTALLER': installer_info,
- 'SCENARIO': scenario,
- 'POD': node,
- 'DEBUG FLAG': is_debug,
- 'BUILD_TAG': build_tag}
-
- return env_info
-
-
-class CliEnv(Env):
-
- def __init__(self):
- super(CliEnv, self).__init__()
-
- def show(self):
- env_info = super(CliEnv, self).show()
- msg = prettytable.PrettyTable(
- header_style='upper', padding_width=5,
- field_names=['Functest Environment', 'value'])
- for key, value in six.iteritems(env_info):
- if key is not None:
- msg.add_row([key, value])
- click.echo(msg.get_string())
diff --git a/functest/cli/commands/cli_os.py b/functest/cli/commands/cli_os.py
deleted file mode 100644
index 9057da84b..000000000
--- a/functest/cli/commands/cli_os.py
+++ /dev/null
@@ -1,66 +0,0 @@
-#!/usr/bin/env python
-#
-# jose.lausuch@ericsson.com
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-
-
-import os
-
-import click
-from six.moves.urllib.parse import urlparse
-
-from functest.ci import check_deployment
-from functest.utils.constants import CONST
-
-
-class OpenStack(object):
-
- def __init__(self):
- self.os_auth_url = CONST.__getattribute__('OS_AUTH_URL')
- self.endpoint_ip = None
- self.endpoint_port = None
- self.openstack_creds = CONST.__getattribute__('openstack_creds')
- if self.os_auth_url:
- self.endpoint_ip = urlparse(self.os_auth_url).hostname
- self.endpoint_port = urlparse(self.os_auth_url).port
-
- def ping_endpoint(self):
- if self.os_auth_url is None:
- click.echo("Source the OpenStack credentials first '. $creds'")
- exit(0)
- response = os.system("ping -c 1 " + self.endpoint_ip + ">/dev/null")
- if response == 0:
- return 0
- else:
- click.echo("Cannot talk to the endpoint %s\n" % self.endpoint_ip)
- exit(0)
-
- @staticmethod
- def show_credentials():
- dic_credentials = {}
- for key, value in os.environ.items():
- if key.startswith('OS_'):
- dic_credentials.update({key: value})
- return dic_credentials
-
- def check(self):
- self.ping_endpoint()
- deployment = check_deployment.CheckDeployment()
- deployment.check_all()
-
-
-class CliOpenStack(OpenStack):
-
- def __init__(self):
- super(CliOpenStack, self).__init__()
-
- @staticmethod
- def show_credentials():
- dic_credentials = OpenStack.show_credentials()
- for key, value in dic_credentials.items():
- if key.startswith('OS_'):
- click.echo("{}={}".format(key, value))
diff --git a/functest/cli/commands/cli_testcase.py b/functest/cli/commands/cli_testcase.py
deleted file mode 100644
index ee7afa5a8..000000000
--- a/functest/cli/commands/cli_testcase.py
+++ /dev/null
@@ -1,73 +0,0 @@
-#!/usr/bin/env python
-#
-# jose.lausuch@ericsson.com
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-
-""" global variables """
-
-import pkg_resources
-
-import click
-
-import functest.ci.tier_builder as tb
-from functest.utils.constants import CONST
-import functest.utils.functest_utils as ft_utils
-import functest.utils.functest_vacation as vacation
-
-
-class Testcase(object):
-
- def __init__(self):
- self.tiers = tb.TierBuilder(
- CONST.__getattribute__('INSTALLER_TYPE'),
- CONST.__getattribute__('DEPLOY_SCENARIO'),
- pkg_resources.resource_filename('functest', 'ci/testcases.yaml'))
-
- def list(self):
- summary = ""
- for tier in self.tiers.get_tiers():
- for test in tier.get_tests():
- summary += (" %s\n" % test.get_name())
- return summary
-
- def show(self, testname):
- description = self.tiers.get_test(testname)
- return description
-
- @staticmethod
- def run(testname, noclean=False, report=False):
-
- flags = ""
- if noclean:
- flags += "-n "
- if report:
- flags += "-r "
-
- if testname == 'vacation':
- vacation.main()
- else:
- tests = testname.split(",")
- for test in tests:
- cmd = "run_tests {}-t {}".format(flags, test)
- ft_utils.execute_command(cmd)
-
-
-class CliTestcase(Testcase):
-
- def __init__(self):
- super(CliTestcase, self).__init__()
-
- def list(self):
- click.echo(super(CliTestcase, self).list())
-
- def show(self, testname):
- testcase_show = super(CliTestcase, self).show(testname)
- if testcase_show:
- click.echo(testcase_show)
- else:
- click.echo("The test case '%s' does not exist or is not supported."
- % testname)
diff --git a/functest/cli/commands/cli_tier.py b/functest/cli/commands/cli_tier.py
deleted file mode 100644
index 104cf10b5..000000000
--- a/functest/cli/commands/cli_tier.py
+++ /dev/null
@@ -1,90 +0,0 @@
-#!/usr/bin/env python
-#
-# jose.lausuch@ericsson.com
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-
-""" global variables """
-
-import pkg_resources
-
-import click
-
-import functest.ci.tier_builder as tb
-from functest.utils.constants import CONST
-import functest.utils.functest_utils as ft_utils
-
-
-class Tier(object):
-
- def __init__(self):
- self.tiers = tb.TierBuilder(
- CONST.__getattribute__('INSTALLER_TYPE'),
- CONST.__getattribute__('DEPLOY_SCENARIO'),
- pkg_resources.resource_filename('functest', 'ci/testcases.yaml'))
-
- def list(self):
- summary = ""
- for tier in self.tiers.get_tiers():
- summary += (" - %s. %s:\n\t %s\n"
- % (tier.get_order(),
- tier.get_name(),
- tier.get_test_names()))
- return summary
-
- def show(self, tiername):
- tier = self.tiers.get_tier(tiername)
- if tier is None:
- return None
- else:
- tier_info = self.tiers.get_tier(tiername)
- return tier_info
-
- def gettests(self, tiername):
- tier = self.tiers.get_tier(tiername)
- if tier is None:
- return None
- else:
- tests = tier.get_test_names()
- return tests
-
- @staticmethod
- def run(tiername, noclean=False, report=False):
- flags = ""
- if noclean:
- flags += "-n "
- if report:
- flags += "-r "
-
- cmd = "run_tests {}-t {}".format(flags, tiername)
- ft_utils.execute_command(cmd)
-
-
-class CliTier(Tier):
-
- def __init__(self):
- super(CliTier, self).__init__()
-
- def list(self):
- click.echo(super(CliTier, self).list())
-
- def show(self, tiername):
- tier_info = super(CliTier, self).show(tiername)
- if tier_info:
- click.echo(tier_info)
- else:
- tier_names = self.tiers.get_tier_names()
- click.echo("The tier with name '%s' does not exist. "
- "Available tiers are:\n %s\n" % (tiername, tier_names))
-
- def gettests(self, tiername):
- tests = super(CliTier, self).gettests(tiername)
- if tests:
- click.echo("Test cases in tier '%s':\n %s\n" % (tiername, tests))
- else:
- tier_names = self.tiers.get_tier_names()
- click.echo("The tier with name '%s' does not exist. "
- "Available tiers are:\n %s\n" % (tiername, tier_names))
diff --git a/functest/cli/functest-complete.sh b/functest/cli/functest-complete.sh
deleted file mode 100644
index f01490713..000000000
--- a/functest/cli/functest-complete.sh
+++ /dev/null
@@ -1,8 +0,0 @@
-_functest_completion() {
- COMPREPLY=( $( env COMP_WORDS="${COMP_WORDS[*]}" \
- COMP_CWORD=$COMP_CWORD \
- _FUNCTEST_COMPLETE=complete $1 ) )
- return 0
-}
-
-complete -F _functest_completion -o default functest;
diff --git a/functest/core/cloudify.py b/functest/core/cloudify.py
new file mode 100644
index 000000000..966d33645
--- /dev/null
+++ b/functest/core/cloudify.py
@@ -0,0 +1,219 @@
+#!/usr/bin/env python
+
+# Copyright (c) 2018 Orange and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+
+"""Cloudify testcase implementation."""
+
+from __future__ import division
+
+import logging
+import os
+import time
+import traceback
+
+from cloudify_rest_client import CloudifyClient
+from cloudify_rest_client.executions import Execution
+import scp
+
+from functest.core import singlevm
+
+
+class Cloudify(singlevm.SingleVm2):
+ """Cloudify Orchestrator Case."""
+
+ __logger = logging.getLogger(__name__)
+
+ filename = ('/home/opnfv/functest/images/'
+ 'ubuntu-18.04-server-cloudimg-amd64.img')
+ flavor_ram = 4096
+ flavor_vcpus = 2
+ flavor_disk = 40
+ username = 'ubuntu'
+ ssh_connect_loops = 12
+ create_server_timeout = 600
+ ports = [80, 443, 5671, 53333]
+
+ cloudify_archive = ('/home/opnfv/functest/images/'
+ 'cloudify-docker-manager-community-19.01.24.tar')
+ cloudify_container = "docker-cfy-manager:latest"
+
+ def __init__(self, **kwargs):
+ """Initialize Cloudify testcase object."""
+ if "case_name" not in kwargs:
+ kwargs["case_name"] = "cloudify"
+ super().__init__(**kwargs)
+ self.cfy_client = None
+
+ def prepare(self):
+ super().prepare()
+ for port in self.ports:
+ self.cloud.create_security_group_rule(
+ self.sec.id, port_range_min=port, port_range_max=port,
+ protocol='tcp', direction='ingress')
+
+ def execute(self):
+ """
+ Deploy Cloudify Manager.
+ """
+ scpc = scp.SCPClient(self.ssh.get_transport())
+ scpc.put(self.cloudify_archive,
+ remote_path=os.path.basename(self.cloudify_archive))
+ (_, stdout, stderr) = self.ssh.exec_command(
+ "sudo apt-get update && "
+ "sudo apt-get install -y docker.io && "
+ "sudo docker load -i "
+ f"~/{os.path.basename(self.cloudify_archive)} && "
+ "sudo docker run --name cfy_manager_local -d "
+ "--restart unless-stopped -v /sys/fs/cgroup:/sys/fs/cgroup:ro "
+ "--tmpfs /run --tmpfs /run/lock --security-opt seccomp:unconfined "
+ f"--cap-add SYS_ADMIN --network=host {self.cloudify_container}")
+ self.__logger.debug("output:\n%s", stdout.read().decode("utf-8"))
+ self.__logger.debug("error:\n%s", stderr.read().decode("utf-8"))
+ self.cfy_client = CloudifyClient(
+ host=self.fip.floating_ip_address if self.fip else (
+ self.sshvm.public_v4),
+ username='admin', password='admin', tenant='default_tenant')
+ self.__logger.info("Attemps running status of the Manager")
+ secret_key = "foo"
+ secret_value = "bar"
+ for loop in range(20):
+ try:
+ self.__logger.debug(
+ "status %s", self.cfy_client.manager.get_status())
+ cfy_status = self.cfy_client.manager.get_status()['status']
+ self.__logger.info(
+ "The current manager status is %s", cfy_status)
+ if str(cfy_status) != 'running':
+ raise Exception("Cloudify Manager isn't up and running")
+ for secret in iter(self.cfy_client.secrets.list()):
+ if secret_key == secret["key"]:
+ self.__logger.debug("Updating secrets: %s", secret_key)
+ self.cfy_client.secrets.update(
+ secret_key, secret_value)
+ break
+ else:
+ self.__logger.debug("Creating secrets: %s", secret_key)
+ self.cfy_client.secrets.create(secret_key, secret_value)
+ self.cfy_client.secrets.delete(secret_key)
+ self.__logger.info("Secrets API successfully reached")
+ break
+ except Exception: # pylint: disable=broad-except
+ self.__logger.debug(
+ "try %s: Cloudify Manager isn't up and running \n%s",
+ loop + 1, traceback.format_exc())
+ time.sleep(30)
+ else:
+ self.__logger.error("Cloudify Manager isn't up and running")
+ return 1
+ self.__logger.info("Cloudify Manager is up and running")
+ return 0
+
+ def put_private_key(self):
+ """Put private keypair in manager"""
+ self.__logger.info("Put private keypair in manager")
+ scpc = scp.SCPClient(self.ssh.get_transport())
+ scpc.put(self.key_filename, remote_path='~/cloudify_ims.pem')
+ (_, stdout, stderr) = self.ssh.exec_command(
+ "sudo docker cp ~/cloudify_ims.pem "
+ "cfy_manager_local:/etc/cloudify/ && "
+ "sudo docker exec cfy_manager_local "
+ "chmod 444 /etc/cloudify/cloudify_ims.pem")
+ self.__logger.debug("output:\n%s", stdout.read().decode("utf-8"))
+ self.__logger.debug("error:\n%s", stderr.read().decode("utf-8"))
+
+ def upload_cfy_plugins(self, yaml, wgn):
+ """Upload Cloudify plugins"""
+ (_, stdout, stderr) = self.ssh.exec_command(
+ "sudo docker exec cfy_manager_local "
+ f"cfy plugins upload -y {yaml} {wgn} && "
+ "sudo docker exec cfy_manager_local cfy status")
+ self.__logger.debug("output:\n%s", stdout.read().decode("utf-8"))
+ self.__logger.debug("error:\n%s", stderr.read().decode("utf-8"))
+
+ def kill_existing_execution(self, dep_name):
+ """kill existing execution"""
+ try:
+ self.__logger.info('Deleting the current deployment')
+ exec_list = self.cfy_client.executions.list()
+ for execution in exec_list:
+ if execution['status'] == "started":
+ try:
+ self.cfy_client.executions.cancel(
+ execution['id'], force=True)
+ except Exception: # pylint: disable=broad-except
+ self.__logger.warning("Can't cancel the current exec")
+ execution = self.cfy_client.executions.start(
+ dep_name, 'uninstall', parameters=dict(ignore_failure=True))
+ wait_for_execution(self.cfy_client, execution, self.__logger)
+ self.cfy_client.deployments.delete(dep_name)
+ time.sleep(10)
+ self.cfy_client.blueprints.delete(dep_name)
+ except Exception: # pylint: disable=broad-except
+ self.__logger.exception("Some issue during the undeployment ..")
+
+
+def wait_for_execution(client, execution, logger, timeout=3600, ):
+ """Wait for a workflow execution on Cloudify Manager."""
+ # if execution already ended - return without waiting
+ if execution.status in Execution.END_STATES:
+ return execution
+
+ if timeout is not None:
+ deadline = time.time() + timeout
+
+ # Poll for execution status and execution logs, until execution ends
+ # and we receive an event of type in WORKFLOW_END_TYPES
+ offset = 0
+ batch_size = 50
+ event_list = []
+ execution_ended = False
+ while True:
+ event_list = client.events.list(
+ execution_id=execution.id,
+ _offset=offset,
+ _size=batch_size,
+ include_logs=True,
+ sort='@timestamp').items
+
+ offset = offset + len(event_list)
+ for event in event_list:
+ logger.debug(event.get('message'))
+
+ if timeout is not None:
+ if time.time() > deadline:
+ raise RuntimeError(
+ 'execution of operation {execution.workflow_id} for '
+ 'deployment {execution.deployment_id} timed out')
+ # update the remaining timeout
+ timeout = deadline - time.time()
+
+ if not execution_ended:
+ execution = client.executions.get(execution.id)
+ execution_ended = execution.status in Execution.END_STATES
+
+ if execution_ended:
+ break
+
+ time.sleep(5)
+
+ return execution
+
+
+def get_execution_id(client, deployment_id):
+ """
+ Get the execution id of a env preparation.
+
+ network, security group, fip, VM creation
+ """
+ executions = client.executions.list(deployment_id=deployment_id)
+ for execution in executions:
+ if execution.workflow_id == 'create_deployment_environment':
+ return execution
+ raise RuntimeError('Failed to get create_deployment_environment '
+ 'workflow execution.'
+ f'Available executions: {executions}')
diff --git a/functest/core/feature.py b/functest/core/feature.py
deleted file mode 100644
index 3200dad85..000000000
--- a/functest/core/feature.py
+++ /dev/null
@@ -1,134 +0,0 @@
-#!/usr/bin/env python
-
-# Copyright (c) 2016 ZTE Corp and others.
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-
-"""Define the parent classes of all Functest Features.
-
-Feature is considered as TestCase offered by Third-party. It offers
-helpers to run any python method or any bash command.
-"""
-
-import logging
-import subprocess
-import time
-
-import functest.core.testcase as base
-from functest.utils.constants import CONST
-
-__author__ = ("Serena Feng <feng.xiaowei@zte.com.cn>, "
- "Cedric Ollivier <cedric.ollivier@orange.com>")
-
-
-class Feature(base.TestCase):
- """Base model for single feature."""
-
- __logger = logging.getLogger(__name__)
-
- def __init__(self, **kwargs):
- super(Feature, self).__init__(**kwargs)
- self.result_file = "{}/{}.log".format(
- CONST.__getattribute__('dir_results'), self.case_name)
- try:
- module = kwargs['run']['module']
- self.logger = logging.getLogger(module)
- except KeyError:
- self.__logger.warning(
- "Cannot get module name %s. Using %s as fallback",
- kwargs, self.case_name)
- self.logger = logging.getLogger(self.case_name)
- handler = logging.StreamHandler()
- handler.setLevel(logging.WARN)
- self.logger.addHandler(handler)
- handler = logging.FileHandler(self.result_file)
- handler.setLevel(logging.DEBUG)
- self.logger.addHandler(handler)
- formatter = logging.Formatter(
- '%(asctime)s - %(name)s - %(levelname)s - %(message)s')
- handler.setFormatter(formatter)
- self.logger.addHandler(handler)
-
- def execute(self, **kwargs):
- """Execute the Python method.
-
- The subclasses must override the default implementation which
- is false on purpose.
-
- The new implementation must return 0 if success or anything
- else if failure.
-
- Args:
- kwargs: Arbitrary keyword arguments.
-
- Returns:
- -1.
- """
- # pylint: disable=unused-argument,no-self-use
- return -1
-
- def run(self, **kwargs):
- """Run the feature.
-
- It allows executing any Python method by calling execute().
-
- It sets the following attributes required to push the results
- to DB:
-
- * result,
- * start_time,
- * stop_time.
-
- It doesn't fulfill details when pushing the results to the DB.
-
- Args:
- kwargs: Arbitrary keyword arguments.
-
- Returns:
- TestCase.EX_OK if execute() returns 0,
- TestCase.EX_RUN_ERROR otherwise.
- """
- self.start_time = time.time()
- exit_code = base.TestCase.EX_RUN_ERROR
- self.result = 0
- try:
- if self.execute(**kwargs) == 0:
- exit_code = base.TestCase.EX_OK
- self.result = 100
- except Exception: # pylint: disable=broad-except
- self.__logger.exception("%s FAILED", self.project_name)
- self.__logger.info("Test result is stored in '%s'", self.result_file)
- self.stop_time = time.time()
- return exit_code
-
-
-class BashFeature(Feature):
- """Class designed to run any bash command."""
-
- __logger = logging.getLogger(__name__)
-
- def execute(self, **kwargs):
- """Execute the cmd passed as arg
-
- Args:
- kwargs: Arbitrary keyword arguments.
-
- Returns:
- 0 if cmd returns 0,
- -1 otherwise.
- """
- ret = -1
- try:
- cmd = kwargs["cmd"]
- with open(self.result_file, 'w+') as f_stdout:
- proc = subprocess.Popen(cmd.split(), stdout=f_stdout,
- stderr=subprocess.STDOUT)
- ret = proc.wait()
- if ret != 0:
- self.__logger.error("Execute command: %s failed", cmd)
- except KeyError:
- self.__logger.error("Please give cmd as arg. kwargs: %s", kwargs)
- return ret
diff --git a/functest/core/robotframework.py b/functest/core/robotframework.py
deleted file mode 100644
index 689d9d946..000000000
--- a/functest/core/robotframework.py
+++ /dev/null
@@ -1,125 +0,0 @@
-#!/usr/bin/env python
-
-# Copyright (c) 2017 Orange and others.
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-
-"""Define classes required to run any Robot suites."""
-
-from __future__ import division
-
-import errno
-import logging
-import os
-
-import robot.api
-from robot.errors import RobotError
-import robot.run
-from robot.utils.robottime import timestamp_to_secs
-from six import StringIO
-
-from functest.core import testcase
-from functest.utils import constants
-
-__author__ = "Cedric Ollivier <cedric.ollivier@orange.com>"
-
-
-class ResultVisitor(robot.api.ResultVisitor):
- """Visitor to get result details."""
-
- def __init__(self):
- self._data = []
-
- def visit_test(self, test):
- output = {}
- output['name'] = test.name
- output['parent'] = test.parent.name
- output['status'] = test.status
- output['starttime'] = test.starttime
- output['endtime'] = test.endtime
- output['critical'] = test.critical
- output['text'] = test.message
- output['elapsedtime'] = test.elapsedtime
- self._data.append(output)
-
- def get_data(self):
- """Get the details of the result."""
- return self._data
-
-
-class RobotFramework(testcase.TestCase):
- """RobotFramework runner."""
-
- __logger = logging.getLogger(__name__)
-
- def __init__(self, **kwargs):
- self.res_dir = os.path.join(
- constants.CONST.__getattribute__('dir_results'), 'robot')
- self.xml_file = os.path.join(self.res_dir, 'output.xml')
- super(RobotFramework, self).__init__(**kwargs)
-
- def parse_results(self):
- """Parse output.xml and get the details in it."""
- result = robot.api.ExecutionResult(self.xml_file)
- visitor = ResultVisitor()
- result.visit(visitor)
- try:
- self.result = 100 * (
- result.suite.statistics.critical.passed /
- result.suite.statistics.critical.total)
- except ZeroDivisionError:
- self.__logger.error("No test has been run")
- self.start_time = timestamp_to_secs(result.suite.starttime)
- self.stop_time = timestamp_to_secs(result.suite.endtime)
- self.details = {}
- self.details['description'] = result.suite.name
- self.details['tests'] = visitor.get_data()
-
- def run(self, **kwargs):
- """Run the RobotFramework suites
-
- Here are the steps:
- * create the output directories if required,
- * get the results in output.xml,
- * delete temporary files.
-
- Args:
- kwargs: Arbitrary keyword arguments.
-
- Returns:
- EX_OK if all suites ran well.
- EX_RUN_ERROR otherwise.
- """
- try:
- suites = kwargs["suites"]
- variable = kwargs.get("variable", [])
- except KeyError:
- self.__logger.exception("Mandatory args were not passed")
- return self.EX_RUN_ERROR
- try:
- os.makedirs(self.res_dir)
- except OSError as ex:
- if ex.errno != errno.EEXIST:
- self.__logger.exception("Cannot create %s", self.res_dir)
- return self.EX_RUN_ERROR
- except Exception: # pylint: disable=broad-except
- self.__logger.exception("Cannot create %s", self.res_dir)
- return self.EX_RUN_ERROR
- stream = StringIO()
- robot.run(*suites, variable=variable, output=self.xml_file,
- log='NONE', report='NONE', stdout=stream)
- self.__logger.info("\n" + stream.getvalue())
- self.__logger.info("Results were successfully generated")
- try:
- self.parse_results()
- self.__logger.info("Results were successfully parsed")
- except RobotError as ex:
- self.__logger.error("Run suites before publishing: %s", ex.message)
- return self.EX_RUN_ERROR
- except Exception: # pylint: disable=broad-except
- self.__logger.exception("Cannot parse results")
- return self.EX_RUN_ERROR
- return self.EX_OK
diff --git a/functest/core/singlevm.py b/functest/core/singlevm.py
new file mode 100644
index 000000000..4bce516d3
--- /dev/null
+++ b/functest/core/singlevm.py
@@ -0,0 +1,549 @@
+#!/usr/bin/env python
+
+# Copyright (c) 2018 Orange and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+
+"""Ease deploying a single VM reachable via ssh
+
+It offers a simple way to create all tenant network resources + a VM for
+advanced testcases (e.g. deploying an orchestrator).
+"""
+
+import logging
+import re
+import tempfile
+import time
+
+import paramiko
+from xtesting.core import testcase
+
+from functest.core import tenantnetwork
+from functest.utils import config
+from functest.utils import env
+from functest.utils import functest_utils
+
+
+class VmReady1(tenantnetwork.TenantNetwork1):
+ """Prepare a single VM (scenario1)
+
+ It inherits from TenantNetwork1 which creates all network resources and
+ prepares a future VM attached to that network.
+
+ It ensures that all testcases inheriting from SingleVm1 could work
+ without specific configurations (or at least read the same config data).
+ """
+ # pylint: disable=too-many-instance-attributes
+
+ __logger = logging.getLogger(__name__)
+ filename = '/home/opnfv/functest/images/cirros-0.6.1-x86_64-disk.img'
+ image_format = 'qcow2'
+ extra_properties = {}
+ filename_alt = filename
+ image_alt_format = image_format
+ extra_alt_properties = extra_properties
+ visibility = 'private'
+ flavor_ram = 512
+ flavor_vcpus = 1
+ flavor_disk = 1
+ flavor_extra_specs = {}
+ flavor_alt_ram = 1024
+ flavor_alt_vcpus = 1
+ flavor_alt_disk = 1
+ flavor_alt_extra_specs = flavor_extra_specs
+ create_server_timeout = 180
+
+ def __init__(self, **kwargs):
+ if "case_name" not in kwargs:
+ kwargs["case_name"] = 'vmready1'
+ super().__init__(**kwargs)
+ self.image = None
+ self.flavor = None
+
+ def publish_image(self, name=None):
+ """Publish image
+
+ It allows publishing multiple images for the child testcases. It forces
+ the same configuration for all subtestcases.
+
+ Returns: image
+
+ Raises: expection on error
+ """
+ assert self.cloud
+ extra_properties = self.extra_properties.copy()
+ if env.get('IMAGE_PROPERTIES'):
+ extra_properties.update(
+ functest_utils.convert_ini_to_dict(
+ env.get('IMAGE_PROPERTIES')))
+ extra_properties.update(
+ getattr(config.CONF, f'{self.case_name}_extra_properties', {}))
+ image = self.cloud.create_image(
+ name if name else f'{self.case_name}-img_{self.guid}',
+ filename=getattr(
+ config.CONF, f'{self.case_name}_image',
+ self.filename),
+ meta=extra_properties,
+ disk_format=getattr(
+ config.CONF, f'{self.case_name}_image_format',
+ self.image_format),
+ visibility=getattr(
+ config.CONF, f'{self.case_name}_visibility',
+ self.visibility),
+ wait=True)
+ self.__logger.debug("image: %s", image)
+ return image
+
+ def publish_image_alt(self, name=None):
+ """Publish alternative image
+
+ It allows publishing multiple images for the child testcases. It forces
+ the same configuration for all subtestcases.
+
+ Returns: image
+
+ Raises: expection on error
+ """
+ assert self.cloud
+ extra_alt_properties = self.extra_alt_properties.copy()
+ if env.get('IMAGE_PROPERTIES'):
+ extra_alt_properties.update(
+ functest_utils.convert_ini_to_dict(
+ env.get('IMAGE_PROPERTIES')))
+ extra_alt_properties.update(
+ getattr(config.CONF, f'{self.case_name}_extra_alt_properties', {}))
+ image = self.cloud.create_image(
+ name if name else f'{self.case_name}-img_alt_{self.guid}',
+ filename=getattr(
+ config.CONF, f'{self.case_name}_image_alt',
+ self.filename_alt),
+ meta=extra_alt_properties,
+ disk_format=getattr(
+ config.CONF, f'{self.case_name}_image_alt_format',
+ self.image_format),
+ visibility=getattr(
+ config.CONF, f'{self.case_name}_visibility',
+ self.visibility),
+ wait=True)
+ self.__logger.debug("image: %s", image)
+ return image
+
+ def create_flavor(self, name=None):
+ """Create flavor
+
+ It allows creating multiple flavors for the child testcases. It forces
+ the same configuration for all subtestcases.
+
+ Returns: flavor
+
+ Raises: expection on error
+ """
+ assert self.orig_cloud
+ flavor = self.orig_cloud.create_flavor(
+ name if name else f'{self.case_name}-flavor_{self.guid}',
+ getattr(config.CONF, f'{self.case_name}_flavor_ram',
+ self.flavor_ram),
+ getattr(config.CONF, f'{self.case_name}_flavor_vcpus',
+ self.flavor_vcpus),
+ getattr(config.CONF, f'{self.case_name}_flavor_disk',
+ self.flavor_disk))
+ self.__logger.debug("flavor: %s", flavor)
+ flavor_extra_specs = self.flavor_extra_specs.copy()
+ if env.get('FLAVOR_EXTRA_SPECS'):
+ flavor_extra_specs.update(
+ functest_utils.convert_ini_to_dict(
+ env.get('FLAVOR_EXTRA_SPECS')))
+ flavor_extra_specs.update(
+ getattr(config.CONF,
+ f'{self.case_name}_flavor_extra_specs', {}))
+ self.orig_cloud.set_flavor_specs(flavor.id, flavor_extra_specs)
+ return flavor
+
+ def create_flavor_alt(self, name=None):
+ """Create flavor
+
+ It allows creating multiple alt flavors for the child testcases. It
+ forces the same configuration for all subtestcases.
+
+ Returns: flavor
+
+ Raises: expection on error
+ """
+ assert self.orig_cloud
+ flavor = self.orig_cloud.create_flavor(
+ name if name else f'{self.case_name}-flavor_alt_{self.guid}',
+ getattr(config.CONF, f'{self.case_name}_flavor_alt_ram',
+ self.flavor_alt_ram),
+ getattr(config.CONF, f'{self.case_name}_flavor_alt_vcpus',
+ self.flavor_alt_vcpus),
+ getattr(config.CONF, f'{self.case_name}_flavor_alt_disk',
+ self.flavor_alt_disk))
+ self.__logger.debug("flavor: %s", flavor)
+ flavor_alt_extra_specs = self.flavor_alt_extra_specs.copy()
+ if env.get('FLAVOR_EXTRA_SPECS'):
+ flavor_alt_extra_specs.update(
+ functest_utils.convert_ini_to_dict(
+ env.get('FLAVOR_EXTRA_SPECS')))
+ flavor_alt_extra_specs.update(
+ getattr(config.CONF,
+ f'{self.case_name}_flavor_alt_extra_specs', {}))
+ self.orig_cloud.set_flavor_specs(
+ flavor.id, flavor_alt_extra_specs)
+ return flavor
+
+ def boot_vm(self, name=None, **kwargs):
+ """Boot the virtual machine
+
+ It allows booting multiple machines for the child testcases. It forces
+ the same configuration for all subtestcases.
+
+ Returns: vm
+
+ Raises: expection on error
+ """
+ assert self.cloud
+ vm1 = self.cloud.create_server(
+ name if name else f'{self.case_name}-vm_{self.guid}',
+ image=self.image.id, flavor=self.flavor.id,
+ auto_ip=False,
+ network=self.network.id if self.network else env.get(
+ "EXTERNAL_NETWORK"),
+ timeout=self.create_server_timeout, wait=True, **kwargs)
+ self.__logger.debug("vm: %s", vm1)
+ return vm1
+
+ def check_regex_in_console(self, name, regex=' login: ', loop=6):
+ """Wait for specific message in console
+
+ Returns: True or False on errors
+ """
+ assert self.cloud
+ for iloop in range(loop):
+ console = self.cloud.get_server_console(name)
+ self.__logger.debug("console: \n%s", console)
+ if re.search(regex, console):
+ self.__logger.debug(
+ "regex found: '%s' in console\n%s", regex, console)
+ return True
+ self.__logger.debug(
+ "try %s: cannot find regex '%s' in console\n%s",
+ iloop + 1, regex, console)
+ time.sleep(10)
+ self.__logger.error("cannot find regex '%s' in console", regex)
+ return False
+
+ def clean_orphan_security_groups(self):
+ """Clean all security groups which are not owned by an existing tenant
+
+ It lists all orphan security groups in use as debug to avoid
+ misunderstanding the testcase results (it could happen if cloud admin
+ removes accounts without cleaning the virtual machines)
+ """
+ sec_groups = self.orig_cloud.list_security_groups()
+ for sec_group in sec_groups:
+ if not sec_group.tenant_id:
+ continue
+ if not self.orig_cloud.get_project(sec_group.tenant_id):
+ self.__logger.debug("Cleaning security group %s", sec_group.id)
+ try:
+ self.orig_cloud.delete_security_group(sec_group.id)
+ except Exception: # pylint: disable=broad-except
+ self.__logger.debug(
+ "Orphan security group %s in use", sec_group.id)
+
+ def count_hypervisors(self):
+ """Count hypervisors."""
+ if env.get('SKIP_DOWN_HYPERVISORS').lower() == 'false':
+ return len(self.orig_cloud.list_hypervisors())
+ return self.count_active_hypervisors()
+
+ def count_active_hypervisors(self):
+ """Count all hypervisors which are up."""
+ compute_cnt = 0
+ for hypervisor in self.orig_cloud.list_hypervisors():
+ if hypervisor['state'] == 'up':
+ compute_cnt += 1
+ else:
+ self.__logger.warning(
+ "%s is down", hypervisor['hypervisor_hostname'])
+ return compute_cnt
+
+ def run(self, **kwargs):
+ """Boot the new VM
+
+ Here are the main actions:
+ - publish the image
+ - create the flavor
+
+ Returns:
+ - TestCase.EX_OK
+ - TestCase.EX_RUN_ERROR on error
+ """
+ status = testcase.TestCase.EX_RUN_ERROR
+ try:
+ assert self.cloud
+ assert super().run(
+ **kwargs) == testcase.TestCase.EX_OK
+ self.image = self.publish_image()
+ self.flavor = self.create_flavor()
+ self.result = 100
+ status = testcase.TestCase.EX_OK
+ except Exception: # pylint: disable=broad-except
+ self.__logger.exception('Cannot run %s', self.case_name)
+ self.result = 0
+ finally:
+ self.stop_time = time.time()
+ return status
+
+ def clean(self):
+ try:
+ assert self.orig_cloud
+ assert self.cloud
+ super().clean()
+ if self.image:
+ self.cloud.delete_image(self.image.id)
+ if self.flavor:
+ self.orig_cloud.delete_flavor(self.flavor.id)
+ if env.get('CLEAN_ORPHAN_SECURITY_GROUPS').lower() == 'true':
+ self.clean_orphan_security_groups()
+ except Exception: # pylint: disable=broad-except
+ self.__logger.exception("Cannot clean all resources")
+
+
+class VmReady2(VmReady1):
+ """Deploy a single VM reachable via ssh (scenario2)
+
+ It creates new user/project before creating and configuring all tenant
+ network resources, flavors, images, etc. required by advanced testcases.
+
+ It ensures that all testcases inheriting from SingleVm2 could work
+ without specific configurations (or at least read the same config data).
+ """
+
+ __logger = logging.getLogger(__name__)
+
+ def __init__(self, **kwargs):
+ if "case_name" not in kwargs:
+ kwargs["case_name"] = 'vmready2'
+ super().__init__(**kwargs)
+ try:
+ assert self.orig_cloud
+ self.project = tenantnetwork.NewProject(
+ self.orig_cloud, self.case_name, self.guid)
+ self.project.create()
+ self.cloud = self.project.cloud
+ except Exception: # pylint: disable=broad-except
+ self.__logger.exception("Cannot create user or project")
+ self.cloud = None
+ self.project = None
+
+ def clean(self):
+ try:
+ super().clean()
+ assert self.project
+ self.project.clean()
+ except Exception: # pylint: disable=broad-except
+ self.__logger.exception("Cannot clean all resources")
+
+
+class SingleVm1(VmReady1):
+ """Deploy a single VM reachable via ssh (scenario1)
+
+ It inherits from TenantNetwork1 which creates all network resources and
+ completes it by booting a VM attached to that network.
+
+ It ensures that all testcases inheriting from SingleVm1 could work
+ without specific configurations (or at least read the same config data).
+ """
+ # pylint: disable=too-many-instance-attributes
+
+ __logger = logging.getLogger(__name__)
+ username = 'cirros'
+ ssh_connect_timeout = 1
+ ssh_connect_loops = 6
+ create_floating_ip_timeout = 120
+ check_console_loop = 6
+ check_console_regex = ' login: '
+
+ def __init__(self, **kwargs):
+ if "case_name" not in kwargs:
+ kwargs["case_name"] = 'singlevm1'
+ super().__init__(**kwargs)
+ self.sshvm = None
+ self.sec = None
+ self.fip = None
+ self.keypair = None
+ self.ssh = None
+ (_, self.key_filename) = tempfile.mkstemp()
+
+ def prepare(self):
+ """Create the security group and the keypair
+
+ It can be overriden to set other rules according to the services
+ running in the VM
+
+ Raises: Exception on error
+ """
+ assert self.cloud
+ self.keypair = self.cloud.create_keypair(
+ f'{self.case_name}-kp_{self.guid}')
+ self.__logger.debug("keypair: %s", self.keypair)
+ self.__logger.debug("private_key:\n%s", self.keypair.private_key)
+ with open(
+ self.key_filename, 'w', encoding='utf-8') as private_key_file:
+ private_key_file.write(self.keypair.private_key)
+ self.sec = self.cloud.create_security_group(
+ f'{self.case_name}-sg_{self.guid}',
+ f'created by OPNFV Functest ({self.case_name})')
+ self.cloud.create_security_group_rule(
+ self.sec.id, port_range_min='22', port_range_max='22',
+ protocol='tcp', direction='ingress')
+ self.cloud.create_security_group_rule(
+ self.sec.id, protocol='icmp', direction='ingress')
+
+ def connect(self, vm1):
+ """Connect to a virtual machine via ssh
+
+ It first adds a floating ip to the virtual machine and then establishes
+ the ssh connection.
+
+ Returns:
+ - (fip, ssh)
+ - None on error
+ """
+ assert vm1
+ fip = None
+ if env.get('NO_TENANT_NETWORK').lower() != 'true':
+ fip = self.cloud.create_floating_ip(
+ network=self.ext_net.id, server=vm1, wait=True,
+ timeout=self.create_floating_ip_timeout)
+ self.__logger.debug("floating_ip: %s", fip)
+ ssh = paramiko.SSHClient()
+ ssh.set_missing_host_key_policy(paramiko.client.AutoAddPolicy())
+ for loop in range(self.ssh_connect_loops):
+ try:
+ p_console = self.cloud.get_server_console(vm1)
+ self.__logger.debug("vm console: \n%s", p_console)
+ ssh.connect(
+ fip.floating_ip_address if fip else vm1.public_v4,
+ username=getattr(
+ config.CONF,
+ f'{self.case_name}_image_user', self.username),
+ key_filename=self.key_filename,
+ timeout=getattr(
+ config.CONF,
+ f'{self.case_name}_vm_ssh_connect_timeout',
+ self.ssh_connect_timeout))
+ break
+ except Exception as exc: # pylint: disable=broad-except
+ self.__logger.debug(
+ "try %s: cannot connect to %s: %s", loop + 1,
+ fip.floating_ip_address if fip else vm1.public_v4, exc)
+ time.sleep(9)
+ else:
+ self.__logger.error(
+ "cannot connect to %s", fip.floating_ip_address)
+ return None
+ return (fip, ssh)
+
+ def execute(self):
+ """Say hello world via ssh
+
+ It can be overriden to execute any command.
+
+ Returns: echo exit codes
+ """
+ (_, stdout, stderr) = self.ssh.exec_command('echo Hello World')
+ self.__logger.debug("output:\n%s", stdout.read().decode("utf-8"))
+ self.__logger.debug("error:\n%s", stderr.read().decode("utf-8"))
+ return stdout.channel.recv_exit_status()
+
+ def run(self, **kwargs):
+ """Boot the new VM
+
+ Here are the main actions:
+ - add a new ssh key
+ - boot the VM
+ - create the security group
+ - execute the right command over ssh
+
+ Returns:
+ - TestCase.EX_OK
+ - TestCase.EX_RUN_ERROR on error
+ """
+ status = testcase.TestCase.EX_RUN_ERROR
+ try:
+ assert self.cloud
+ assert super().run(
+ **kwargs) == testcase.TestCase.EX_OK
+ self.result = 0
+ self.prepare()
+ self.sshvm = self.boot_vm(
+ key_name=self.keypair.id, security_groups=[self.sec.id])
+ if self.check_regex_in_console(
+ self.sshvm.name, regex=self.check_console_regex,
+ loop=self.check_console_loop):
+ (self.fip, self.ssh) = self.connect(self.sshvm)
+ if not self.execute():
+ self.result = 100
+ status = testcase.TestCase.EX_OK
+ except Exception: # pylint: disable=broad-except
+ self.__logger.exception('Cannot run %s', self.case_name)
+ finally:
+ self.stop_time = time.time()
+ return status
+
+ def clean(self):
+ try:
+ assert self.orig_cloud
+ assert self.cloud
+ if self.fip:
+ self.cloud.delete_floating_ip(self.fip.id)
+ if self.sshvm:
+ self.cloud.delete_server(self.sshvm, wait=True)
+ if self.sec:
+ self.cloud.delete_security_group(self.sec.id)
+ if self.keypair:
+ self.cloud.delete_keypair(self.keypair.name)
+ super().clean()
+ except Exception: # pylint: disable=broad-except
+ self.__logger.exception("Cannot clean all resources")
+
+
+class SingleVm2(SingleVm1):
+ """Deploy a single VM reachable via ssh (scenario2)
+
+ It creates new user/project before creating and configuring all tenant
+ network resources and vms required by advanced testcases.
+
+ It ensures that all testcases inheriting from SingleVm2 could work
+ without specific configurations (or at least read the same config data).
+ """
+
+ __logger = logging.getLogger(__name__)
+
+ def __init__(self, **kwargs):
+ if "case_name" not in kwargs:
+ kwargs["case_name"] = 'singlevm2'
+ super().__init__(**kwargs)
+ try:
+ assert self.orig_cloud
+ self.project = tenantnetwork.NewProject(
+ self.orig_cloud, self.case_name, self.guid)
+ self.project.create()
+ self.cloud = self.project.cloud
+ except Exception: # pylint: disable=broad-except
+ self.__logger.exception("Cannot create user or project")
+ self.cloud = None
+ self.project = None
+
+ def clean(self):
+ try:
+ super().clean()
+ assert self.project
+ self.project.clean()
+ except Exception: # pylint: disable=broad-except
+ self.__logger.exception("Cannot clean all resources")
diff --git a/functest/core/tenantnetwork.py b/functest/core/tenantnetwork.py
new file mode 100644
index 000000000..3670dbe8a
--- /dev/null
+++ b/functest/core/tenantnetwork.py
@@ -0,0 +1,326 @@
+#!/usr/bin/env python
+
+# Copyright (c) 2018 Orange and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+
+"""Ease deploying tenant networks
+
+It offers a simple way to create all tenant network resources required by a
+testcase (including all Functest ones):
+
+ - TenantNetwork1 selects the user and the project set as env vars
+ - TenantNetwork2 creates a user and project to isolate the same resources
+
+This classes could be reused by more complexed scenarios (Single VM)
+"""
+
+import logging
+import os
+import time
+import uuid
+
+import os_client_config
+import shade
+from tempest.lib.common.utils import data_utils
+from xtesting.core import testcase
+
+from functest.utils import config
+from functest.utils import env
+from functest.utils import functest_utils
+
+
+class NewProject():
+ """Ease creating new projects/users"""
+ # pylint: disable=too-many-instance-attributes
+
+ __logger = logging.getLogger(__name__)
+
+ def __init__(self, cloud, case_name, guid):
+ self.cloud = None
+ self.orig_cloud = cloud
+ self.case_name = case_name
+ self.guid = guid
+ self.project = None
+ self.user = None
+ self.password = None
+ self.domain = None
+ self.role_name = None
+ self.default_member = env.get('NEW_USER_ROLE')
+
+ def create(self):
+ """Create projects/users"""
+ assert self.orig_cloud
+ assert self.case_name
+ self.password = data_utils.rand_password().replace('%', '!')
+ self.__logger.debug("password: %s", self.password)
+ self.domain = self.orig_cloud.get_domain(
+ name_or_id=self.orig_cloud.auth.get(
+ "project_domain_name", "Default"))
+ self.project = self.orig_cloud.create_project(
+ name=f'{self.case_name[:18]}-project_{self.guid}',
+ description=f"Created by OPNFV Functest: {self.case_name}",
+ domain_id=self.domain.id)
+ self.__logger.debug("project: %s", self.project)
+ self.user = self.orig_cloud.create_user(
+ name=f'{self.case_name}-user_{self.guid}',
+ password=self.password,
+ domain_id=self.domain.id)
+ self.__logger.debug("user: %s", self.user)
+ try:
+ if self.orig_cloud.get_role(self.default_member):
+ self.role_name = self.default_member
+ elif self.orig_cloud.get_role(self.default_member.lower()):
+ self.role_name = self.default_member.lower()
+ else:
+ raise Exception(f"Cannot detect {self.default_member}")
+ except Exception: # pylint: disable=broad-except
+ self.__logger.info("Creating default role %s", self.default_member)
+ role = self.orig_cloud.create_role(self.default_member)
+ self.role_name = role.name
+ self.__logger.debug("role: %s", role)
+ self.orig_cloud.grant_role(
+ self.role_name, user=self.user.id, project=self.project.id,
+ domain=self.domain.id)
+ osconfig = os_client_config.config.OpenStackConfig()
+ osconfig.cloud_config[
+ 'clouds']['envvars']['project_name'] = self.project.name
+ osconfig.cloud_config[
+ 'clouds']['envvars']['project_id'] = self.project.id
+ osconfig.cloud_config['clouds']['envvars']['username'] = self.user.name
+ osconfig.cloud_config['clouds']['envvars']['password'] = self.password
+ self.__logger.debug("cloud_config %s", osconfig.cloud_config)
+ self.cloud = shade.OpenStackCloud(
+ cloud_config=osconfig.get_one_cloud())
+ self.__logger.debug("new cloud %s", self.cloud.auth)
+
+ def get_environ(self):
+ "Get new environ"
+ environ = dict(
+ os.environ,
+ OS_USERNAME=self.user.name,
+ OS_PROJECT_NAME=self.project.name,
+ OS_PROJECT_ID=self.project.id,
+ OS_PASSWORD=self.password)
+ try:
+ del environ['OS_TENANT_NAME']
+ del environ['OS_TENANT_ID']
+ except Exception: # pylint: disable=broad-except
+ pass
+ return environ
+
+ def clean(self):
+ """Remove projects/users"""
+ try:
+ assert self.orig_cloud
+ if self.user:
+ self.orig_cloud.delete_user(self.user.id)
+ if self.project:
+ self.orig_cloud.delete_project(self.project.id)
+ secgroups = self.orig_cloud.list_security_groups(
+ filters={'name': 'default',
+ 'project_id': self.project.id})
+ if secgroups:
+ sec_id = secgroups[0].id
+ self.orig_cloud.delete_security_group(sec_id)
+ except Exception: # pylint: disable=broad-except
+ self.__logger.exception("Cannot clean all resources")
+
+
+class TenantNetwork1(testcase.TestCase):
+ # pylint: disable=too-many-instance-attributes
+ """Create a tenant network (scenario1)
+
+ It creates and configures all tenant network resources required by
+ advanced testcases (subnet, network and router).
+
+ It ensures that all testcases inheriting from TenantNetwork1 could work
+ without network specific configurations (or at least read the same config
+ data).
+ """
+
+ __logger = logging.getLogger(__name__)
+ cidr = '192.168.120.0/24'
+ shared_network = False
+
+ def __init__(self, **kwargs):
+ if "case_name" not in kwargs:
+ kwargs["case_name"] = 'tenantnetwork1'
+ super().__init__(**kwargs)
+ self.dir_results = os.path.join(getattr(config.CONF, 'dir_results'))
+ self.res_dir = os.path.join(self.dir_results, self.case_name)
+ self.output_log_name = 'functest.log'
+ self.output_debug_log_name = 'functest.debug.log'
+ self.ext_net = None
+ try:
+ cloud_config = os_client_config.get_config()
+ self.cloud = self.orig_cloud = shade.OpenStackCloud(
+ cloud_config=cloud_config)
+ except Exception: # pylint: disable=broad-except
+ self.cloud = self.orig_cloud = None
+ self.__logger.exception("Cannot connect to Cloud")
+ if env.get('NO_TENANT_NETWORK').lower() != 'true':
+ try:
+ self.ext_net = self.get_external_network(self.cloud)
+ except Exception: # pylint: disable=broad-except
+ self.__logger.exception("Cannot get the external network")
+ self.guid = str(uuid.uuid4())
+ self.network = None
+ self.subnet = None
+ self.router = None
+
+ @staticmethod
+ def get_external_network(cloud):
+ """
+ Return the configured external network name or
+ the first retrieved external network name
+ """
+ assert cloud
+ if env.get("EXTERNAL_NETWORK"):
+ network = cloud.get_network(
+ env.get("EXTERNAL_NETWORK"), {"router:external": True})
+ if network:
+ return network
+ networks = cloud.list_networks({"router:external": True})
+ if networks:
+ return networks[0]
+ return None
+
+ @staticmethod
+ def get_default_role(cloud, member="Member"):
+ """Get the default role
+
+ It also tests the role in lowercase to avoid possible conflicts.
+ """
+ role = cloud.get_role(member)
+ if not role:
+ role = cloud.get_role(member.lower())
+ return role
+
+ @staticmethod
+ def get_public_auth_url(cloud):
+ """Get Keystone public endpoint"""
+ keystone_id = functest_utils.search_services(cloud, 'keystone')[0].id
+ endpoint = cloud.search_endpoints(
+ filters={'interface': 'public',
+ 'service_id': keystone_id})[0].url
+ return endpoint
+
+ def create_network_resources(self):
+ """Create all tenant network resources
+
+ It creates a router which gateway is the external network detected.
+ The new subnet is attached to that router.
+
+ Raises: expection on error
+ """
+ assert self.cloud
+ if env.get('NO_TENANT_NETWORK').lower() != 'true':
+ assert self.ext_net
+ provider = {}
+ if hasattr(config.CONF, f'{self.case_name}_network_type'):
+ provider["network_type"] = getattr(
+ config.CONF, f'{self.case_name}_network_type')
+ if hasattr(config.CONF, f'{self.case_name}_physical_network'):
+ provider["physical_network"] = getattr(
+ config.CONF, f'{self.case_name}_physical_network')
+ if hasattr(config.CONF, f'{self.case_name}_segmentation_id'):
+ provider["segmentation_id"] = getattr(
+ config.CONF, f'{self.case_name}_segmentation_id')
+ domain = self.orig_cloud.get_domain(
+ name_or_id=self.orig_cloud.auth.get(
+ "project_domain_name", "Default"))
+ project = self.orig_cloud.get_project(
+ self.cloud.auth['project_name'],
+ domain_id=domain.id)
+ self.network = self.orig_cloud.create_network(
+ f'{self.case_name}-net_{self.guid}',
+ provider=provider, project_id=project.id,
+ shared=self.shared_network)
+ self.__logger.debug("network: %s", self.network)
+
+ self.subnet = self.cloud.create_subnet(
+ self.network.id,
+ subnet_name=f'{self.case_name}-subnet_{self.guid}',
+ cidr=getattr(
+ config.CONF, f'{self.case_name}_private_subnet_cidr',
+ self.cidr),
+ enable_dhcp=True,
+ dns_nameservers=[env.get('NAMESERVER')])
+ self.__logger.debug("subnet: %s", self.subnet)
+
+ self.router = self.cloud.create_router(
+ name=f'{self.case_name}-router_{self.guid}',
+ ext_gateway_net_id=self.ext_net.id if self.ext_net else None)
+ self.__logger.debug("router: %s", self.router)
+ self.cloud.add_router_interface(self.router, subnet_id=self.subnet.id)
+
+ def run(self, **kwargs):
+ status = testcase.TestCase.EX_RUN_ERROR
+ try:
+ assert self.cloud
+ self.start_time = time.time()
+ if env.get('NO_TENANT_NETWORK').lower() != 'true':
+ self.create_network_resources()
+ self.result = 100
+ status = testcase.TestCase.EX_OK
+ except Exception: # pylint: disable=broad-except
+ self.__logger.exception('Cannot run %s', self.case_name)
+ finally:
+ self.stop_time = time.time()
+ return status
+
+ def clean(self):
+ try:
+ assert self.cloud
+ if self.router:
+ if self.subnet:
+ self.cloud.remove_router_interface(
+ self.router, self.subnet.id)
+ self.cloud.delete_router(self.router.id)
+ if self.subnet:
+ self.cloud.delete_subnet(self.subnet.id)
+ if self.network:
+ self.cloud.delete_network(self.network.id)
+ except Exception: # pylint: disable=broad-except
+ self.__logger.exception("cannot clean all resources")
+
+
+class TenantNetwork2(TenantNetwork1):
+ """Create a tenant network (scenario2)
+
+ It creates new user/project before creating and configuring all tenant
+ network resources required by a testcase (subnet, network and router).
+
+ It ensures that all testcases inheriting from TenantNetwork2 could work
+ without network specific configurations (or at least read the same config
+ data).
+ """
+
+ __logger = logging.getLogger(__name__)
+
+ def __init__(self, **kwargs):
+ if "case_name" not in kwargs:
+ kwargs["case_name"] = 'tenantnetwork2'
+ super().__init__(**kwargs)
+ try:
+ assert self.cloud
+ self.project = NewProject(
+ self.cloud, self.case_name, self.guid)
+ self.project.create()
+ self.cloud = self.project.cloud
+ except Exception: # pylint: disable=broad-except
+ self.__logger.exception("Cannot create user or project")
+ self.cloud = None
+ self.project = None
+
+ def clean(self):
+ try:
+ super().clean()
+ assert self.project
+ self.project.clean()
+ except Exception: # pylint: disable=broad-except
+ self.__logger.exception("Cannot clean all resources")
diff --git a/functest/core/testcase.py b/functest/core/testcase.py
deleted file mode 100644
index fa3802872..000000000
--- a/functest/core/testcase.py
+++ /dev/null
@@ -1,186 +0,0 @@
-#!/usr/bin/env python
-
-# Copyright (c) 2016 Orange and others.
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-
-"""Define the parent class of all Functest TestCases."""
-
-import logging
-import os
-
-import functest.utils.functest_utils as ft_utils
-
-import prettytable
-
-
-__author__ = "Cedric Ollivier <cedric.ollivier@orange.com>"
-
-
-class TestCase(object):
- """Base model for single test case."""
-
- EX_OK = os.EX_OK
- """everything is OK"""
-
- EX_RUN_ERROR = os.EX_SOFTWARE
- """run() failed"""
-
- EX_PUSH_TO_DB_ERROR = os.EX_SOFTWARE - 1
- """push_to_db() failed"""
-
- EX_TESTCASE_FAILED = os.EX_SOFTWARE - 2
- """results are false"""
-
- __logger = logging.getLogger(__name__)
-
- def __init__(self, **kwargs):
- self.details = {}
- self.project_name = kwargs.get('project_name', 'functest')
- self.case_name = kwargs.get('case_name', '')
- self.criteria = kwargs.get('criteria', 100)
- self.result = 0
- self.start_time = 0
- self.stop_time = 0
-
- def __str__(self):
- try:
- assert self.project_name
- assert self.case_name
- result = 'PASS' if(self.is_successful(
- ) == TestCase.EX_OK) else 'FAIL'
- msg = prettytable.PrettyTable(
- header_style='upper', padding_width=5,
- field_names=['test case', 'project', 'duration',
- 'result'])
- msg.add_row([self.case_name, self.project_name,
- self.get_duration(), result])
- return msg.get_string()
- except AssertionError:
- self.__logger.error("We cannot print invalid objects")
- return super(TestCase, self).__str__()
-
- def get_duration(self):
- """Return the duration of the test case.
-
- Returns:
- duration if start_time and stop_time are set
- "XX:XX" otherwise.
- """
- try:
- assert self.start_time
- assert self.stop_time
- if self.stop_time < self.start_time:
- return "XX:XX"
- return "{0[0]:02.0f}:{0[1]:02.0f}".format(divmod(
- self.stop_time - self.start_time, 60))
- except Exception: # pylint: disable=broad-except
- self.__logger.error("Please run test before getting the duration")
- return "XX:XX"
-
- def is_successful(self):
- """Interpret the result of the test case.
-
- It allows getting the result of TestCase. It completes run()
- which only returns the execution status.
-
- It can be overriden if checking result is not suitable.
-
- Returns:
- TestCase.EX_OK if result is 'PASS'.
- TestCase.EX_TESTCASE_FAILED otherwise.
- """
- try:
- assert self.criteria
- assert self.result is not None
- if (not isinstance(self.result, str) and
- not isinstance(self.criteria, str)):
- if self.result >= self.criteria:
- return TestCase.EX_OK
- else:
- # Backward compatibility
- # It must be removed as soon as TestCase subclasses
- # stop setting result = 'PASS' or 'FAIL'.
- # In this case criteria is unread.
- self.__logger.warning(
- "Please update result which must be an int!")
- if self.result == 'PASS':
- return TestCase.EX_OK
- except AssertionError:
- self.__logger.error("Please run test before checking the results")
- return TestCase.EX_TESTCASE_FAILED
-
- def run(self, **kwargs):
- """Run the test case.
-
- It allows running TestCase and getting its execution
- status.
-
- The subclasses must override the default implementation which
- is false on purpose.
-
- The new implementation must set the following attributes to
- push the results to DB:
-
- * result,
- * start_time,
- * stop_time.
-
- Args:
- kwargs: Arbitrary keyword arguments.
-
- Returns:
- TestCase.EX_RUN_ERROR.
- """
- # pylint: disable=unused-argument
- self.__logger.error("Run must be implemented")
- return TestCase.EX_RUN_ERROR
-
- def push_to_db(self):
- """Push the results of the test case to the DB.
-
- It allows publishing the results and to check the status.
-
- It could be overriden if the common implementation is not
- suitable. The following attributes must be set before pushing
- the results to DB:
-
- * project_name,
- * case_name,
- * result,
- * start_time,
- * stop_time.
-
- Returns:
- TestCase.EX_OK if results were pushed to DB.
- TestCase.EX_PUSH_TO_DB_ERROR otherwise.
- """
- try:
- assert self.project_name
- assert self.case_name
- assert self.start_time
- assert self.stop_time
- pub_result = 'PASS' if self.is_successful(
- ) == TestCase.EX_OK else 'FAIL'
- if ft_utils.push_results_to_db(
- self.project_name, self.case_name, self.start_time,
- self.stop_time, pub_result, self.details):
- self.__logger.info(
- "The results were successfully pushed to DB")
- return TestCase.EX_OK
- else:
- self.__logger.error("The results cannot be pushed to DB")
- return TestCase.EX_PUSH_TO_DB_ERROR
- except Exception: # pylint: disable=broad-except
- self.__logger.exception("The results cannot be pushed to DB")
- return TestCase.EX_PUSH_TO_DB_ERROR
-
- def clean(self):
- """Clean the resources.
-
- It can be overriden if resources must be deleted after
- running the test case.
- """
diff --git a/functest/core/unit.py b/functest/core/unit.py
deleted file mode 100644
index 61b5a58d9..000000000
--- a/functest/core/unit.py
+++ /dev/null
@@ -1,92 +0,0 @@
-#!/usr/bin/env python
-
-# Copyright (c) 2016 Cable Television Laboratories, Inc. and others.
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-
-"""Define the parent class to run unittest.TestSuite as TestCase."""
-
-from __future__ import division
-
-import logging
-import time
-import unittest
-
-import six
-
-from functest.core import testcase
-
-__author__ = ("Steven Pisarski <s.pisarski@cablelabs.com>, "
- "Cedric Ollivier <cedric.ollivier@orange.com>")
-
-
-class Suite(testcase.TestCase):
- """Base model for running unittest.TestSuite."""
-
- __logger = logging.getLogger(__name__)
-
- def __init__(self, **kwargs):
- super(Suite, self).__init__(**kwargs)
- self.suite = None
-
- def run(self, **kwargs):
- """Run the test suite.
-
- It allows running any unittest.TestSuite and getting its
- execution status.
-
- By default, it runs the suite defined as instance attribute.
- It can be overriden by passing name as arg. It must
- conform with TestLoader.loadTestsFromName().
-
- It sets the following attributes required to push the results
- to DB:
-
- * result,
- * start_time,
- * stop_time,
- * details.
-
- Args:
- kwargs: Arbitrary keyword arguments.
-
- Returns:
- TestCase.EX_OK if any TestSuite has been run,
- TestCase.EX_RUN_ERROR otherwise.
- """
- try:
- name = kwargs["name"]
- try:
- self.suite = unittest.TestLoader().loadTestsFromName(name)
- except ImportError:
- self.__logger.error("Can not import %s", name)
- return testcase.TestCase.EX_RUN_ERROR
- except KeyError:
- pass
- try:
- assert self.suite
- self.start_time = time.time()
- stream = six.StringIO()
- result = unittest.TextTestRunner(
- stream=stream, verbosity=2).run(self.suite)
- self.__logger.debug("\n\n%s", stream.getvalue())
- self.stop_time = time.time()
- self.details = {
- "testsRun": result.testsRun,
- "failures": len(result.failures),
- "errors": len(result.errors),
- "stream": stream.getvalue()}
- self.result = 100 * (
- (result.testsRun - (len(result.failures) +
- len(result.errors))) /
- result.testsRun)
- return testcase.TestCase.EX_OK
- except AssertionError:
- self.__logger.error("No suite is defined")
- return testcase.TestCase.EX_RUN_ERROR
- except ZeroDivisionError:
- self.__logger.error("No test has been run")
- return testcase.TestCase.EX_RUN_ERROR
diff --git a/functest/core/vnf.py b/functest/core/vnf.py
deleted file mode 100644
index 73aaf446e..000000000
--- a/functest/core/vnf.py
+++ /dev/null
@@ -1,206 +0,0 @@
-#!/usr/bin/env python
-
-# Copyright (c) 2016 Orange and others.
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-
-"""Define the parent class of all VNF TestCases."""
-
-import logging
-import time
-
-import functest.core.testcase as base
-from functest.utils.constants import CONST
-from snaps.config.user import UserConfig
-from snaps.config.project import ProjectConfig
-from snaps.openstack.create_user import OpenStackUser
-from snaps.openstack.create_project import OpenStackProject
-from snaps.openstack.tests import openstack_tests
-
-__author__ = ("Morgan Richomme <morgan.richomme@orange.com>, "
- "Valentin Boucher <valentin.boucher@orange.com>")
-
-
-class VnfPreparationException(Exception):
- """Raise when VNF preparation cannot be executed."""
-
-
-class OrchestratorDeploymentException(Exception):
- """Raise when orchestrator cannot be deployed."""
-
-
-class VnfDeploymentException(Exception):
- """Raise when VNF cannot be deployed."""
-
-
-class VnfTestException(Exception):
- """Raise when VNF cannot be tested."""
-
-
-class VnfOnBoarding(base.TestCase):
- """Base model for VNF test cases."""
-
- __logger = logging.getLogger(__name__)
-
- def __init__(self, **kwargs):
- super(VnfOnBoarding, self).__init__(**kwargs)
- self.tenant_name = CONST.__getattribute__(
- 'vnf_{}_tenant_name'.format(self.case_name))
- self.snaps_creds = {}
- self.created_object = []
- self.os_project = None
-
- def run(self, **kwargs):
- """
- Run of the VNF test case:
-
- * Deploy an orchestrator if needed (e.g. heat, cloudify, ONAP,...),
- * Deploy the VNF,
- * Perform tests on the VNF
-
- A VNF test case is successfull when the 3 steps are PASS
- If one of the step is FAIL, the test case is FAIL
-
- Returns:
- TestCase.EX_OK if result is 'PASS'.
- TestCase.EX_TESTCASE_FAILED otherwise.
- """
- self.start_time = time.time()
-
- try:
- self.prepare()
- if (self.deploy_orchestrator() and
- self.deploy_vnf() and
- self.test_vnf()):
- self.stop_time = time.time()
- # Calculation with different weight depending on the steps TODO
- self.result = 100
- return base.TestCase.EX_OK
- else:
- self.result = 0
- self.stop_time = time.time()
- return base.TestCase.EX_TESTCASE_FAILED
- except Exception: # pylint: disable=broad-except
- self.stop_time = time.time()
- self.__logger.exception("Exception on VNF testing")
- return base.TestCase.EX_TESTCASE_FAILED
-
- def prepare(self):
- """
- Prepare the environment for VNF testing:
-
- * Creation of a user,
- * Creation of a tenant,
- * Allocation admin role to the user on this tenant
-
- Returns base.TestCase.EX_OK if preparation is successfull
-
- Raise VnfPreparationException in case of problem
- """
- try:
- tenant_description = CONST.__getattribute__(
- 'vnf_{}_tenant_description'.format(self.case_name))
- self.__logger.info("Prepare VNF: %s, description: %s",
- self.tenant_name, tenant_description)
- snaps_creds = openstack_tests.get_credentials(
- os_env_file=CONST.__getattribute__('openstack_creds'))
-
- project_creator = OpenStackProject(
- snaps_creds,
- ProjectConfig(
- name=self.tenant_name,
- description=tenant_description
- ))
- project_creator.create()
- self.created_object.append(project_creator)
- self.os_project = project_creator
-
- user_creator = OpenStackUser(
- snaps_creds,
- UserConfig(
- name=self.tenant_name,
- password=self.tenant_name,
- roles={'admin': self.tenant_name}))
-
- user_creator.create()
- self.created_object.append(user_creator)
-
- self.snaps_creds = user_creator.get_os_creds(self.tenant_name)
-
- return base.TestCase.EX_OK
- except Exception: # pylint: disable=broad-except
- self.__logger.exception("Exception raised during VNF preparation")
- raise VnfPreparationException
-
- def deploy_orchestrator(self):
- """
- Deploy an orchestrator (optional).
-
- If this method is overriden then raise orchestratorDeploymentException
- if error during orchestrator deployment
- """
- self.__logger.info("Deploy orchestrator (if necessary)")
- return True
-
- def deploy_vnf(self):
- """
- Deploy the VNF
-
- This function MUST be implemented by vnf test cases.
- The details section MAY be updated in the vnf test cases.
-
- The deployment can be executed via a specific orchestrator
- or using build-in orchestrators such as heat, OpenBaton, cloudify,
- juju, onap, ...
-
- Returns:
- True if the VNF is properly deployed
- False if the VNF is not deployed
-
- Raise VnfDeploymentException if error during VNF deployment
- """
- self.__logger.error("VNF must be deployed")
- raise VnfDeploymentException
-
- def test_vnf(self):
- """
- Test the VNF
-
- This function MUST be implemented by vnf test cases.
- The details section MAY be updated in the vnf test cases.
-
- Once a VNF is deployed, it is assumed that specific test suite can be
- run to validate the VNF.
- Please note that the same test suite can be used on several test case
- (e.g. clearwater test suite can be used whatever the orchestrator used
- for the deployment)
-
- Returns:
- True if VNF tests are PASS
- False if test suite is FAIL
-
- Raise VnfTestException if error during VNF test
- """
- self.__logger.error("VNF must be tested")
- raise VnfTestException
-
- def clean(self):
- """
- Clean VNF test case.
-
- It is up to the test providers to delete resources used for the tests.
- By default we clean:
-
- * the user,
- * the tenant
- """
- self.__logger.info("test cleaning")
- self.__logger.info('Remove the cloudify manager OS object ..')
- for creator in reversed(self.created_object):
- try:
- creator.clean()
- except Exception as exc: # pylint: disable=broad-except
- self.__logger.error('Unexpected error cleaning - %s', exc)
diff --git a/functest/energy/energy.py b/functest/energy/energy.py
deleted file mode 100644
index 2835e05c1..000000000
--- a/functest/energy/energy.py
+++ /dev/null
@@ -1,335 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: UTF-8 -*-
-
-# Copyright (c) 2017 Orange and others.
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-
-"""This module manages calls to Energy recording API."""
-
-import json
-import logging
-
-from functools import wraps
-import requests
-from six.moves import urllib
-
-from functest.utils.constants import CONST
-import functest.utils.functest_utils as ft_utils
-
-
-def finish_session(current_scenario):
- """Finish a recording session."""
- if current_scenario is None:
- EnergyRecorder.stop()
- else:
- EnergyRecorder.logger.debug("Restoring previous scenario (%s/%s)",
- current_scenario["scenario"],
- current_scenario["step"])
- EnergyRecorder.submit_scenario(
- current_scenario["scenario"],
- current_scenario["step"]
- )
-
-
-def enable_recording(method):
- """
- Record energy during method execution.
-
- Decorator to record energy during "method" exection.
-
- param method: Method to suround with start and stop
- :type method: function
-
- .. note:: "method" should belong to a class having a "case_name"
- attribute
- """
- @wraps(method)
- def wrapper(*args):
- """
- Record energy during method execution (implementation).
-
- Wrapper for decorator to handle method arguments.
- """
- current_scenario = EnergyRecorder.get_current_scenario()
- EnergyRecorder.start(args[0].case_name)
- try:
- return_value = method(*args)
- finish_session(current_scenario)
- except Exception as exc: # pylint: disable=broad-except
- EnergyRecorder.logger.exception(exc)
- finish_session(current_scenario)
- raise exc
- return return_value
- return wrapper
-
-
-# Class to manage energy recording sessions
-class EnergyRecorder(object):
- """Manage Energy recording session."""
-
- logger = logging.getLogger(__name__)
- # Energy recording API connectivity settings
- # see load_config method
- energy_recorder_api = None
-
- # Default initial step
- INITIAL_STEP = "running"
-
- # Default connection timeout
- CONNECTION_TIMEOUT = 4
-
- @staticmethod
- def load_config():
- """
- Load connectivity settings from yaml.
-
- Load connectivity settings to Energy recording API
- Use functest global config yaml file
- (see functest_utils.get_functest_config)
- """
- # Singleton pattern for energy_recorder_api static member
- # Load only if not previouly done
- if EnergyRecorder.energy_recorder_api is None:
- environment = CONST.__getattribute__('NODE_NAME')
-
- # API URL
- energy_recorder_uri = ft_utils.get_functest_config(
- "energy_recorder.api_url")
- assert energy_recorder_uri
- assert environment
-
- uri_comp = "/recorders/environment/"
- uri_comp += urllib.parse.quote_plus(environment)
-
- # Creds
- creds_usr = ft_utils.get_functest_config(
- "energy_recorder.api_user")
- creds_pass = ft_utils.get_functest_config(
- "energy_recorder.api_password")
-
- if creds_usr != "" and creds_pass != "":
- energy_recorder_api_auth = (creds_usr, creds_pass)
- else:
- energy_recorder_api_auth = None
-
- try:
- resp = requests.get(energy_recorder_uri + "/monitoring/ping",
- auth=energy_recorder_api_auth,
- headers={
- 'content-type': 'application/json'
- },
- timeout=EnergyRecorder.CONNECTION_TIMEOUT)
- api_available = json.loads(resp.text)["status"] == "OK"
- EnergyRecorder.logger.info(
- "API recorder available at : %s",
- energy_recorder_uri + uri_comp)
- except Exception as exc: # pylint: disable=broad-except
- EnergyRecorder.logger.info(
- "Energy recorder API is not available, cause=%s",
- str(exc))
- api_available = False
- # Final config
- EnergyRecorder.energy_recorder_api = {
- "uri": energy_recorder_uri + uri_comp,
- "auth": energy_recorder_api_auth,
- "available": api_available
- }
- return EnergyRecorder.energy_recorder_api["available"]
-
- @staticmethod
- def submit_scenario(scenario, step):
- """
- Submit a complet scenario definition to Energy recorder API.
-
- param scenario: Scenario name
- :type scenario: string
- param step: Step name
- :type step: string
- """
- try:
- return_status = True
- # Ensure that connectyvity settings are loaded
- if EnergyRecorder.load_config():
- EnergyRecorder.logger.debug("Submitting scenario (%s/%s)",
- scenario, step)
-
- # Create API payload
- payload = {
- "step": step,
- "scenario": scenario
- }
- # Call API to start energy recording
- response = requests.post(
- EnergyRecorder.energy_recorder_api["uri"],
- data=json.dumps(payload),
- auth=EnergyRecorder.energy_recorder_api["auth"],
- headers={
- 'content-type': 'application/json'
- },
- timeout=EnergyRecorder.CONNECTION_TIMEOUT
- )
- if response.status_code != 200:
- EnergyRecorder.logger.error(
- "Error while submitting scenario\n%s",
- response.text)
- return_status = False
- except requests.exceptions.ConnectionError:
- EnergyRecorder.logger.warning(
- "submit_scenario: Unable to connect energy recorder API")
- return_status = False
- except Exception: # pylint: disable=broad-except
- # Default exception handler to ensure that method
- # is safe for caller
- EnergyRecorder.logger.exception(
- "Error while submitting scenarion to energy recorder API"
- )
- return_status = False
- return return_status
-
- @staticmethod
- def start(scenario):
- """
- Start a recording session for scenario.
-
- param scenario: Starting scenario
- :type scenario: string
- """
- return_status = True
- try:
- if EnergyRecorder.load_config():
- EnergyRecorder.logger.debug("Starting recording")
- return_status = EnergyRecorder.submit_scenario(
- scenario,
- EnergyRecorder.INITIAL_STEP
- )
-
- except Exception: # pylint: disable=broad-except
- # Default exception handler to ensure that method
- # is safe for caller
- EnergyRecorder.logger.exception(
- "Error while starting energy recorder API"
- )
- return_status = False
- return return_status
-
- @staticmethod
- def stop():
- """Stop current recording session."""
- return_status = True
- try:
- # Ensure that connectyvity settings are loaded
- if EnergyRecorder.load_config():
- EnergyRecorder.logger.debug("Stopping recording")
-
- # Call API to stop energy recording
- response = requests.delete(
- EnergyRecorder.energy_recorder_api["uri"],
- auth=EnergyRecorder.energy_recorder_api["auth"],
- headers={
- 'content-type': 'application/json'
- },
- timeout=EnergyRecorder.CONNECTION_TIMEOUT
- )
- if response.status_code != 200:
- EnergyRecorder.logger.error(
- "Error while stating energy recording session\n%s",
- response.text)
- return_status = False
- except requests.exceptions.ConnectionError:
- EnergyRecorder.logger.warning(
- "stop: Unable to connect energy recorder API")
- return_status = False
- except Exception: # pylint: disable=broad-except
- # Default exception handler to ensure that method
- # is safe for caller
- EnergyRecorder.logger.exception(
- "Error while stoping energy recorder API"
- )
- return_status = False
- return return_status
-
- @staticmethod
- def set_step(step):
- """Notify energy recording service of current step of the testcase."""
- return_status = True
- try:
- # Ensure that connectyvity settings are loaded
- if EnergyRecorder.load_config():
- EnergyRecorder.logger.debug("Setting step")
-
- # Create API payload
- payload = {
- "step": step,
- }
-
- # Call API to define step
- response = requests.post(
- EnergyRecorder.energy_recorder_api["uri"] + "/step",
- data=json.dumps(payload),
- auth=EnergyRecorder.energy_recorder_api["auth"],
- headers={
- 'content-type': 'application/json'
- },
- timeout=EnergyRecorder.CONNECTION_TIMEOUT
- )
- if response.status_code != 200:
- EnergyRecorder.logger.error(
- "Error while setting current step of testcase\n%s",
- response.text)
- return_status = False
- except requests.exceptions.ConnectionError:
- EnergyRecorder.logger.warning(
- "set_step: Unable to connect energy recorder API")
- return_status = False
- except Exception: # pylint: disable=broad-except
- # Default exception handler to ensure that method
- # is safe for caller
- EnergyRecorder.logger.exception(
- "Error while setting step on energy recorder API"
- )
- return_status = False
- return return_status
-
- @staticmethod
- def get_current_scenario():
- """Get current running scenario (if any, None else)."""
- return_value = None
- try:
- # Ensure that connectyvity settings are loaded
- if EnergyRecorder.load_config():
- EnergyRecorder.logger.debug("Getting current scenario")
-
- # Call API get running scenario
- response = requests.get(
- EnergyRecorder.energy_recorder_api["uri"],
- auth=EnergyRecorder.energy_recorder_api["auth"],
- timeout=EnergyRecorder.CONNECTION_TIMEOUT
- )
- if response.status_code == 200:
- return_value = json.loads(response.text)
- elif response.status_code == 404:
- EnergyRecorder.logger.info(
- "No current running scenario at %s",
- EnergyRecorder.energy_recorder_api["uri"])
- return_value = None
- else:
- EnergyRecorder.logger.error(
- "Error while getting current scenario\n%s",
- response.text)
- return_value = None
- except requests.exceptions.ConnectionError:
- EnergyRecorder.logger.warning(
- "get_currernt_sceario: Unable to connect energy recorder API")
- return_value = None
- except Exception: # pylint: disable=broad-except
- # Default exception handler to ensure that method
- # is safe for caller
- EnergyRecorder.logger.exception(
- "Error while getting current scenario from energy recorder API"
- )
- return_value = None
- return return_value
diff --git a/functest/api/__init__.py b/functest/opnfv_tests/openstack/api/__init__.py
index e69de29bb..e69de29bb 100644
--- a/functest/api/__init__.py
+++ b/functest/opnfv_tests/openstack/api/__init__.py
diff --git a/functest/opnfv_tests/openstack/api/connection_check.py b/functest/opnfv_tests/openstack/api/connection_check.py
new file mode 100644
index 000000000..eaf9767c0
--- /dev/null
+++ b/functest/opnfv_tests/openstack/api/connection_check.py
@@ -0,0 +1,73 @@
+#!/usr/bin/env python
+
+# Copyright (c) 2018 Orange and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+
+"""Verify the connection to OpenStack Services"""
+
+import logging
+import time
+
+import os_client_config
+import shade
+from xtesting.core import testcase
+
+from functest.utils import env
+from functest.utils import functest_utils
+
+
+class ConnectionCheck(testcase.TestCase):
+ """Perform simplest queries"""
+ __logger = logging.getLogger(__name__)
+
+ func_list = [
+ "get_network_extensions", "list_aggregates", "list_domains",
+ "list_endpoints", "list_floating_ip_pools", "list_floating_ips",
+ "list_hypervisors", "list_keypairs", "list_networks", "list_ports",
+ "list_role_assignments", "list_roles", "list_routers", "list_servers",
+ "list_subnets"]
+
+ def __init__(self, **kwargs):
+ if "case_name" not in kwargs:
+ kwargs["case_name"] = 'connection_check'
+ super().__init__(**kwargs)
+ self.output_log_name = 'functest.log'
+ self.output_debug_log_name = 'functest.debug.log'
+ try:
+ cloud_config = os_client_config.get_config()
+ self.cloud = shade.OpenStackCloud(cloud_config=cloud_config)
+ except Exception: # pylint: disable=broad-except
+ self.cloud = None
+
+ def run(self, **kwargs):
+ # pylint: disable=protected-access
+ """Run all read operations to check connections"""
+ status = testcase.TestCase.EX_RUN_ERROR
+ try:
+ assert self.cloud
+ self.start_time = time.time()
+ self.__logger.debug(
+ "list_services: %s", functest_utils.list_services(self.cloud))
+ if env.get('NO_TENANT_NETWORK').lower() == 'true':
+ self.func_list.remove("list_floating_ip_pools")
+ self.func_list.remove("list_floating_ips")
+ self.func_list.remove("list_routers")
+ for func in self.func_list:
+ self.__logger.debug(
+ "%s: %s", func, getattr(self.cloud, func)())
+ data = self.cloud._network_client.get("/service-providers.json")
+ self.__logger.debug(
+ "list_service_providers: %s",
+ self.cloud._get_and_munchify('service_providers', data))
+ functest_utils.get_openstack_version(self.cloud)
+ self.result = 100
+ status = testcase.TestCase.EX_OK
+ except Exception: # pylint: disable=broad-except
+ self.__logger.exception('Cannot run %s', self.case_name)
+ finally:
+ self.stop_time = time.time()
+ return status
diff --git a/functest/api/common/__init__.py b/functest/opnfv_tests/openstack/barbican/__init__.py
index e69de29bb..e69de29bb 100644
--- a/functest/api/common/__init__.py
+++ b/functest/opnfv_tests/openstack/barbican/__init__.py
diff --git a/functest/opnfv_tests/openstack/barbican/barbican.py b/functest/opnfv_tests/openstack/barbican/barbican.py
new file mode 100644
index 000000000..706304bbf
--- /dev/null
+++ b/functest/opnfv_tests/openstack/barbican/barbican.py
@@ -0,0 +1,37 @@
+#!/usr/bin/env python
+
+# Copyright (c) 2018 Orange and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+
+# pylint: disable=missing-docstring
+
+from six.moves import configparser
+
+from functest.opnfv_tests.openstack.tempest import tempest
+
+
+class Barbican(tempest.TempestCommon):
+
+ def configure(self, **kwargs):
+ super().configure(**kwargs)
+ rconfig = configparser.RawConfigParser()
+ rconfig.read(self.conf_file)
+ if not rconfig.has_section('auth'):
+ rconfig.add_section('auth')
+ rconfig.set('auth', 'tempest_roles', 'creator')
+ if not rconfig.has_section('glance'):
+ rconfig.add_section('glance')
+ rconfig.set('glance', 'verify_glance_signatures', True)
+ if not rconfig.has_section('ephemeral_storage_encryption'):
+ rconfig.add_section('ephemeral_storage_encryption')
+ rconfig.set('ephemeral_storage_encryption', 'enabled', True)
+ if not rconfig.has_section('image-feature-enabled'):
+ rconfig.add_section('image-feature-enabled')
+ rconfig.set('image-feature-enabled', 'api_v1', False)
+ with open(self.conf_file, 'w', encoding='utf-8') as config_file:
+ rconfig.write(config_file)
+ self.backup_tempest_config(self.conf_file, self.res_dir)
diff --git a/functest/api/database/__init__.py b/functest/opnfv_tests/openstack/cinder/__init__.py
index e69de29bb..e69de29bb 100644
--- a/functest/api/database/__init__.py
+++ b/functest/opnfv_tests/openstack/cinder/__init__.py
diff --git a/functest/opnfv_tests/openstack/cinder/cinder_test.py b/functest/opnfv_tests/openstack/cinder/cinder_test.py
new file mode 100644
index 000000000..7d8c0a0bd
--- /dev/null
+++ b/functest/opnfv_tests/openstack/cinder/cinder_test.py
@@ -0,0 +1,127 @@
+#!/usr/bin/env python
+
+# Copyright (c) 2018 Enea AB and others
+
+# This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+
+"""CinderCheck testcase."""
+
+import logging
+
+import pkg_resources
+from scp import SCPClient
+from xtesting.core import testcase
+
+from functest.core import singlevm
+from functest.utils import config
+from functest.utils import env
+
+
+class CinderCheck(singlevm.SingleVm2):
+ """
+ CinderCheck testcase implementation.
+
+ Class to execute the CinderCheck test using 2 Floating IPs
+ to connect to the VMs and one data volume
+ """
+ # pylint: disable=too-many-instance-attributes
+ volume_timeout = 60
+
+ def __init__(self, **kwargs):
+ """Initialize testcase."""
+ if "case_name" not in kwargs:
+ kwargs["case_name"] = "cinder_test"
+ super().__init__(**kwargs)
+ self.logger = logging.getLogger(__name__)
+ self.vm2 = None
+ self.fip2 = None
+ self.ssh2 = None
+ self.volume = None
+
+ def execute(self):
+ """Execute CinderCheck testcase.
+
+ Sets up the OpenStack keypair, router, security group, and VM instance
+ objects then validates cinder.
+ :return: the exit code from the super.execute() method
+ """
+ return self._write_data() or self._read_data()
+
+ def prepare(self):
+ super().prepare()
+ self.vm2 = self.boot_vm(
+ f'{self.case_name}-vm2_{self.guid}',
+ key_name=self.keypair.id,
+ security_groups=[self.sec.id])
+ (self.fip2, self.ssh2) = self.connect(self.vm2)
+ self.volume = self.cloud.create_volume(
+ name=f'{self.case_name}-volume_{self.guid}', size='2',
+ timeout=self.volume_timeout, wait=True)
+
+ def _write_data(self):
+ assert self.cloud
+ self.cloud.attach_volume(self.sshvm, self.volume,
+ timeout=self.volume_timeout)
+ write_data_script = pkg_resources.resource_filename(
+ 'functest.opnfv_tests.openstack.cinder', 'write_data.sh')
+ try:
+ scp = SCPClient(self.ssh.get_transport())
+ scp.put(write_data_script, remote_path="~/")
+ except Exception: # pylint: disable=broad-except
+ self.logger.error("File not transfered!")
+ return testcase.TestCase.EX_RUN_ERROR
+ self.logger.debug("ssh: %s", self.ssh)
+ (_, stdout, stderr) = self.ssh.exec_command(
+ f"sh ~/write_data.sh {env.get('VOLUME_DEVICE_NAME')}")
+ self.logger.debug(
+ "volume_write stdout: %s", stdout.read().decode("utf-8"))
+ self.logger.debug(
+ "volume_write stderr: %s", stderr.read().decode("utf-8"))
+ # Detach volume from VM 1
+ self.logger.info("Detach volume from VM 1")
+ self.cloud.detach_volume(
+ self.sshvm, self.volume, timeout=self.volume_timeout)
+ return stdout.channel.recv_exit_status()
+
+ def _read_data(self):
+ assert self.cloud
+ # Attach volume to VM 2
+ self.logger.info("Attach volume to VM 2")
+ self.cloud.attach_volume(self.vm2, self.volume,
+ timeout=self.volume_timeout)
+ # Check volume data
+ read_data_script = pkg_resources.resource_filename(
+ 'functest.opnfv_tests.openstack.cinder', 'read_data.sh')
+ try:
+ scp = SCPClient(self.ssh2.get_transport())
+ scp.put(read_data_script, remote_path="~/")
+ except Exception: # pylint: disable=broad-except
+ self.logger.error("File not transfered!")
+ return testcase.TestCase.EX_RUN_ERROR
+ self.logger.debug("ssh: %s", self.ssh2)
+ (_, stdout, stderr) = self.ssh2.exec_command(
+ f"sh ~/read_data.sh {env.get('VOLUME_DEVICE_NAME')}")
+ self.logger.debug(
+ "read volume stdout: %s", stdout.read().decode("utf-8"))
+ self.logger.debug(
+ "read volume stderr: %s", stderr.read().decode("utf-8"))
+ self.logger.info("Detach volume from VM 2")
+ self.cloud.detach_volume(
+ self.vm2, self.volume, timeout=self.volume_timeout)
+ return stdout.channel.recv_exit_status()
+
+ def clean(self):
+ assert self.cloud
+ if self.vm2:
+ self.cloud.delete_server(
+ self.vm2, wait=True,
+ timeout=getattr(config.CONF, 'vping_vm_delete_timeout'))
+ if self.fip2:
+ self.cloud.delete_floating_ip(self.fip2.id)
+ if self.volume:
+ self.cloud.delete_volume(self.volume.id)
+ super().clean()
diff --git a/functest/opnfv_tests/openstack/cinder/read_data.sh b/functest/opnfv_tests/openstack/cinder/read_data.sh
new file mode 100644
index 000000000..2c5fdd4c0
--- /dev/null
+++ b/functest/opnfv_tests/openstack/cinder/read_data.sh
@@ -0,0 +1,26 @@
+#!/bin/sh -e
+
+# Copyright (c) 2018 Enea AB and others
+
+# This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+
+DEST=$(mktemp -d)
+VOL_DEV_NAME=${1:-vdb}
+echo "VOL_DEV_NAME: $VOL_DEV_NAME"
+
+echo "$(lsblk -l -o NAME)"
+if [ ! -z $(lsblk -l -o NAME | grep $VOL_DEV_NAME) ]; then
+ sudo mount /dev/$VOL_DEV_NAME $DEST
+ if [ -f $DEST/new_data ]; then
+ echo "Found new data!"
+ else
+ echo "Failed to find data!"
+ exit 1
+ fi
+fi
+
+exit 0
diff --git a/functest/opnfv_tests/openstack/cinder/write_data.sh b/functest/opnfv_tests/openstack/cinder/write_data.sh
new file mode 100644
index 000000000..16845ba31
--- /dev/null
+++ b/functest/opnfv_tests/openstack/cinder/write_data.sh
@@ -0,0 +1,30 @@
+#!/bin/sh -e
+
+# Copyright (c) 2018 Enea AB and others
+
+# This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+
+DEST=$(mktemp -d)
+VOL_DEV_NAME=${1:-vdb}
+echo "VOL_DEV_NAME: $VOL_DEV_NAME"
+
+echo "$(lsblk -l -o NAME)"
+
+if [ ! -z $(lsblk -l -o NAME | grep $VOL_DEV_NAME) ]; then
+ sudo mkfs.ext4 -F /dev/$VOL_DEV_NAME
+ sudo mount /dev/$VOL_DEV_NAME $DEST
+ sudo touch $DEST/new_data
+ if [ -f $DEST/new_data ]; then
+ echo "New data added to the volume!"
+ sudo umount $DEST
+ fi
+else
+ echo "Failed to write data!"
+ exit 1
+fi
+
+exit 0
diff --git a/functest/api/database/v1/__init__.py b/functest/opnfv_tests/openstack/patrole/__init__.py
index e69de29bb..e69de29bb 100644
--- a/functest/api/database/v1/__init__.py
+++ b/functest/opnfv_tests/openstack/patrole/__init__.py
diff --git a/functest/opnfv_tests/openstack/patrole/patrole.py b/functest/opnfv_tests/openstack/patrole/patrole.py
new file mode 100644
index 000000000..88c42f269
--- /dev/null
+++ b/functest/opnfv_tests/openstack/patrole/patrole.py
@@ -0,0 +1,28 @@
+#!/usr/bin/env python
+
+# Copyright (c) 2018 Orange and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+
+# pylint: disable=missing-docstring
+
+from six.moves import configparser
+
+from functest.opnfv_tests.openstack.tempest import tempest
+
+
+class Patrole(tempest.TempestCommon):
+
+ def configure(self, **kwargs):
+ super().configure(**kwargs)
+ rconfig = configparser.RawConfigParser()
+ rconfig.read(self.conf_file)
+ if not rconfig.has_section('rbac'):
+ rconfig.add_section('rbac')
+ rconfig.set('rbac', 'rbac_test_roles', kwargs.get('roles', 'admin'))
+ with open(self.conf_file, 'w', encoding='utf-8') as config_file:
+ rconfig.write(config_file)
+ self.backup_tempest_config(self.conf_file, self.res_dir)
diff --git a/functest/opnfv_tests/openstack/rally/blacklist.txt b/functest/opnfv_tests/openstack/rally/blacklist.txt
deleted file mode 100644
index 4b42c312a..000000000
--- a/functest/opnfv_tests/openstack/rally/blacklist.txt
+++ /dev/null
@@ -1,71 +0,0 @@
-scenario:
- -
- scenarios:
- - '^os-nosdn-lxd-(no)?ha$'
- installers:
- - joid
- tests:
- - NovaServers.boot_server_from_volume_and_delete
- -
- scenarios:
- - '^os-' # all scenarios
- installers:
- - '.+' # all installers
- tests:
- # Following tests currently fail due to required Gnocchi API:
- # HTTP 410: "This telemetry installation is configured to use
- # Gnocchi. Please use the Gnocchi API available on the
- # metric endpoint to retrieve data."
- # Issue: https://bugs.launchpad.net/rally/+bug/1704322
- - CeilometerMeters.list_matched_meters
- - CeilometerMeters.list_meters
- - CeilometerQueries.create_and_query_samples
- - CeilometerResource.get_tenant_resources
- - CeilometerResource.list_matched_resources
- - CeilometerResource.list_resources
- - CeilometerSamples.list_matched_samples
- - CeilometerSamples.list_samples
- - CeilometerStats.create_meter_and_get_stats
- - CeilometerStats.get_stats
- -
- scenarios:
- - '^os-' # all scenarios
- installers:
- - '.+' # all installers
- tests:
- # Following test currently fails due to but in
- # python-ceilometerclient during fetching of event_types
- # Bug: https://bugs.launchpad.net/ubuntu/+bug/1704138
- # Fix: https://review.openstack.org/#/c/483402/
- - CeilometerEvents.create_user_and_list_event_types
- -
- scenarios:
- - '^os-' # all scenarios
- installers:
- - '.+' # all installers
- tests:
- # Starting from ocata, following tests require the presence of
- # panko in the deployment. This is not currently fulfilled
- # Ref: https://docs.openstack.org/releasenotes/ceilometer/ocata.html
- - 'CeilometerEvents..*'
- - 'CeilometerTraits..*'
- -
- scenarios:
- - '^os-' # all scenarios
- installers:
- - '.+' # all installers
- tests:
- # Rally is still utilizing Ceilometer API which is deprecated
- # in Pike.
- # Ref: https://docs.openstack.org/releasenotes/ceilometer/pike.html
- - 'Ceilometer..*'
-
-functionality:
- -
- functions:
- - no_migration
- tests:
- - NovaServers.boot_and_live_migrate_server
- - NovaServers.boot_server_attach_created_volume_and_live_migrate
- - NovaServers.boot_server_from_volume_and_live_migrate
- - NovaServers.boot_and_migrate_server
diff --git a/functest/opnfv_tests/openstack/rally/blacklist.yaml b/functest/opnfv_tests/openstack/rally/blacklist.yaml
new file mode 100644
index 000000000..e16b83ba6
--- /dev/null
+++ b/functest/opnfv_tests/openstack/rally/blacklist.yaml
@@ -0,0 +1,40 @@
+---
+scenario:
+
+functionality:
+ -
+ functions:
+ - block_migration
+ tests:
+ - NovaServers.boot_server_from_volume_and_live_migrate
+ -
+ functions:
+ - no_migration
+ tests:
+ - NovaServers.boot_and_live_migrate_server
+ - NovaServers.boot_server_attach_created_volume_and_live_migrate
+ - NovaServers.boot_server_from_volume_and_live_migrate
+ - NovaServers.boot_and_migrate_server
+ -
+ functions:
+ - no_net_trunk_service
+ tests:
+ - '^NeutronTrunk'
+ -
+ functions:
+ - no_floating_ip
+ tests:
+ - HeatStacks.create_and_delete_stack
+ - NovaServers.boot_and_associate_floating_ip
+ - NovaServers.boot_server_and_list_interfaces
+ - NovaServers.boot_server_associate_and_dissociate_floating_ip
+ - NeutronNetworks.create_and_delete_floating_ips
+ - NeutronNetworks.create_and_list_floating_ips
+ - NeutronNetworks.associate_and_dissociate_floating_ips
+ - VMTasks.dd_load_test
+ - NeutronNetworks.create_and_delete_routers
+ - NeutronNetworks.create_and_list_routers
+ - NeutronNetworks.create_and_show_routers
+ - NeutronNetworks.create_and_update_routers
+ - NeutronNetworks.set_and_clear_router_gateway
+ - Quotas.neutron_update
diff --git a/functest/opnfv_tests/openstack/rally/macro/macro.yaml b/functest/opnfv_tests/openstack/rally/macro/macro.yaml
index 48c0333e9..2536c92f0 100644
--- a/functest/opnfv_tests/openstack/rally/macro/macro.yaml
+++ b/functest/opnfv_tests/openstack/rally/macro/macro.yaml
@@ -95,3 +95,9 @@
disk_format: {{ type }}
image_location: {{ location }}
{%- endmacro %}
+
+{%- macro volume_service(version, service_type) %}
+ cinder:
+ version: {{ version }}
+ service_type: {{ service_type }}
+{%- endmacro %}
diff --git a/functest/opnfv_tests/openstack/rally/rally.py b/functest/opnfv_tests/openstack/rally/rally.py
index eefd3eb46..3d897e25d 100644
--- a/functest/opnfv_tests/openstack/rally/rally.py
+++ b/functest/opnfv_tests/openstack/rally/rally.py
@@ -11,149 +11,142 @@
"""Rally testcases implementation."""
from __future__ import division
+from __future__ import print_function
+import fileinput
import json
import logging
import os
import re
+import shutil
import subprocess
import time
-import uuid
import pkg_resources
+import prettytable
+from ruamel.yaml import YAML
+import six
+from six.moves import configparser
+from xtesting.core import testcase
import yaml
-from functest.core import testcase
-from functest.energy import energy
-from functest.opnfv_tests.openstack.snaps import snaps_utils
-from functest.opnfv_tests.openstack.tempest import conf_utils
-from functest.utils.constants import CONST
-
-from snaps.config.flavor import FlavorConfig
-from snaps.config.image import ImageConfig
-from snaps.config.network import NetworkConfig, SubnetConfig
-from snaps.config.router import RouterConfig
-
-from snaps.openstack.create_flavor import OpenStackFlavor
-from snaps.openstack.tests import openstack_tests
-from snaps.openstack.utils import deploy_utils
+from functest.core import singlevm
+from functest.utils import config
+from functest.utils import env
+from functest.utils import functest_utils
LOGGER = logging.getLogger(__name__)
-class RallyBase(testcase.TestCase):
+class RallyBase(singlevm.VmReady2):
"""Base class form Rally testcases implementation."""
- TESTS = ['authenticate', 'glance', 'ceilometer', 'cinder', 'heat',
- 'keystone', 'neutron', 'nova', 'quotas', 'vm', 'all']
- GLANCE_IMAGE_NAME = CONST.__getattribute__('openstack_image_name')
- GLANCE_IMAGE_FILENAME = CONST.__getattribute__('openstack_image_file_name')
- GLANCE_IMAGE_PATH = os.path.join(
- CONST.__getattribute__('dir_functest_images'),
- GLANCE_IMAGE_FILENAME)
- GLANCE_IMAGE_FORMAT = CONST.__getattribute__('openstack_image_disk_format')
- GLANCE_IMAGE_USERNAME = CONST.__getattribute__('openstack_image_username')
- GLANCE_IMAGE_EXTRA_PROPERTIES = {}
- if hasattr(CONST, 'openstack_extra_properties'):
- GLANCE_IMAGE_EXTRA_PROPERTIES = CONST.__getattribute__(
- 'openstack_extra_properties')
- FLAVOR_NAME = CONST.__getattribute__('rally_flavor_name')
- FLAVOR_ALT_NAME = CONST.__getattribute__('rally_flavor_alt_name')
- FLAVOR_EXTRA_SPECS = None
- FLAVOR_RAM = 512
- FLAVOR_RAM_ALT = 1024
- if hasattr(CONST, 'flavor_extra_specs'):
- FLAVOR_EXTRA_SPECS = CONST.__getattribute__('flavor_extra_specs')
- FLAVOR_RAM = 1024
- FLAVOR_RAM_ALT = 2048
-
- RALLY_DIR = pkg_resources.resource_filename(
+ # pylint: disable=too-many-instance-attributes, too-many-public-methods
+ stests = ['authenticate', 'glance', 'cinder', 'gnocchi', 'heat',
+ 'keystone', 'neutron', 'nova', 'quotas', 'swift', 'barbican',
+ 'vm']
+
+ rally_conf_path = "/etc/rally/rally.conf"
+ rally_aar4_patch_path = pkg_resources.resource_filename(
+ 'functest', 'ci/rally_aarch64_patch.conf')
+ rally_dir = pkg_resources.resource_filename(
'functest', 'opnfv_tests/openstack/rally')
- RALLY_SCENARIO_DIR = pkg_resources.resource_filename(
+ rally_scenario_dir = pkg_resources.resource_filename(
'functest', 'opnfv_tests/openstack/rally/scenario')
- TEMPLATE_DIR = pkg_resources.resource_filename(
+ template_dir = pkg_resources.resource_filename(
'functest', 'opnfv_tests/openstack/rally/scenario/templates')
- SUPPORT_DIR = pkg_resources.resource_filename(
+ support_dir = pkg_resources.resource_filename(
'functest', 'opnfv_tests/openstack/rally/scenario/support')
- USERS_AMOUNT = 2
- TENANTS_AMOUNT = 3
- ITERATIONS_AMOUNT = 10
- CONCURRENCY = 4
- RESULTS_DIR = os.path.join(CONST.__getattribute__('dir_results'), 'rally')
- BLACKLIST_FILE = os.path.join(RALLY_DIR, "blacklist.txt")
- TEMP_DIR = os.path.join(RALLY_DIR, "var")
-
- RALLY_PRIVATE_NET_NAME = CONST.__getattribute__('rally_network_name')
- RALLY_PRIVATE_SUBNET_NAME = CONST.__getattribute__('rally_subnet_name')
- RALLY_PRIVATE_SUBNET_CIDR = CONST.__getattribute__('rally_subnet_cidr')
- RALLY_ROUTER_NAME = CONST.__getattribute__('rally_router_name')
+ users_amount = 2
+ tenants_amount = 3
+ iterations_amount = 10
+ concurrency = 4
+ volume_version = 3
+ volume_service_type = "volumev3"
+ blacklist_file = os.path.join(rally_dir, "blacklist.yaml")
+ task_dir = os.path.join(getattr(config.CONF, 'dir_rally_data'), 'task')
+ temp_dir = os.path.join(task_dir, 'var')
+
+ visibility = 'public'
+ shared_network = True
+ task_timeout = 3600
+ username = 'cirros'
def __init__(self, **kwargs):
"""Initialize RallyBase object."""
- super(RallyBase, self).__init__(**kwargs)
- if 'os_creds' in kwargs:
- self.os_creds = kwargs['os_creds']
+ super().__init__(**kwargs)
+ assert self.orig_cloud
+ assert self.project
+ if self.orig_cloud.get_role("admin"):
+ role_name = "admin"
+ elif self.orig_cloud.get_role("Admin"):
+ role_name = "Admin"
else:
- creds_override = None
- if hasattr(CONST, 'snaps_os_creds_override'):
- creds_override = CONST.__getattribute__(
- 'snaps_os_creds_override')
-
- self.os_creds = openstack_tests.get_credentials(
- os_env_file=CONST.__getattribute__('openstack_creds'),
- overrides=creds_override)
-
- self.guid = '-' + str(uuid.uuid4())
-
+ raise Exception("Cannot detect neither admin nor Admin")
+ self.orig_cloud.grant_role(
+ role_name, user=self.project.user.id,
+ project=self.project.project.id,
+ domain=self.project.domain.id)
+ self.results_dir = os.path.join(
+ getattr(config.CONF, 'dir_results'), self.case_name)
+ self.task_file = ''
self.creators = []
- self.mode = ''
self.summary = []
self.scenario_dir = ''
- self.image_name = None
- self.ext_net_name = None
- self.priv_net_id = None
- self.flavor_name = None
- self.flavor_alt_name = None
self.smoke = None
- self.test_name = None
self.start_time = None
self.result = None
- self.details = None
self.compute_cnt = 0
-
- def _build_task_args(self, test_file_name):
- task_args = {'service_list': [test_file_name]}
- task_args['image_name'] = self.image_name
- task_args['flavor_name'] = self.flavor_name
- task_args['flavor_alt_name'] = self.flavor_alt_name
- task_args['glance_image_location'] = self.GLANCE_IMAGE_PATH
- task_args['glance_image_format'] = self.GLANCE_IMAGE_FORMAT
- task_args['tmpl_dir'] = self.TEMPLATE_DIR
- task_args['sup_dir'] = self.SUPPORT_DIR
- task_args['users_amount'] = self.USERS_AMOUNT
- task_args['tenants_amount'] = self.TENANTS_AMOUNT
+ self.flavor_alt = None
+ self.tests = []
+ self.run_cmd = ''
+ self.network_extensions = []
+ self.services = []
+
+ def build_task_args(self, test_name):
+ """Build arguments for the Rally task."""
+ task_args = {'service_list': [test_name]}
+ task_args['image_name'] = str(self.image.name)
+ task_args['flavor_name'] = str(self.flavor.name)
+ task_args['flavor_alt_name'] = str(self.flavor_alt.name)
+ task_args['glance_image_location'] = str(self.filename)
+ task_args['glance_image_format'] = str(self.image_format)
+ task_args['tmpl_dir'] = str(self.template_dir)
+ task_args['sup_dir'] = str(self.support_dir)
+ task_args['users_amount'] = self.users_amount
+ task_args['tenants_amount'] = self.tenants_amount
task_args['use_existing_users'] = False
- task_args['iterations'] = self.ITERATIONS_AMOUNT
- task_args['concurrency'] = self.CONCURRENCY
+ task_args['iterations'] = self.iterations_amount
+ task_args['concurrency'] = self.concurrency
task_args['smoke'] = self.smoke
+ task_args['volume_version'] = self.volume_version
+ task_args['volume_service_type'] = self.volume_service_type
+ task_args['block_migration'] = env.get("BLOCK_MIGRATION").lower()
+ task_args['username'] = self.username
- ext_net = self.ext_net_name
- if ext_net:
- task_args['floating_network'] = str(ext_net)
+ if self.ext_net:
+ task_args['floating_network'] = str(self.ext_net.name)
else:
task_args['floating_network'] = ''
- net_id = self.priv_net_id
- if net_id:
- task_args['netid'] = str(net_id)
+ if self.network:
+ task_args['netid'] = str(self.network.id)
else:
- task_args['netid'] = ''
+ LOGGER.warning(
+ 'No tenant network created. '
+ 'Trying EXTERNAL_NETWORK as a fallback')
+ if env.get("EXTERNAL_NETWORK"):
+ network = self.cloud.get_network(env.get("EXTERNAL_NETWORK"))
+ task_args['netid'] = str(network.id) if network else ''
+ else:
+ task_args['netid'] = ''
return task_args
def _prepare_test_list(self, test_name):
- test_yaml_file_name = 'opnfv-{}.yaml'.format(test_name)
- scenario_file_name = os.path.join(self.RALLY_SCENARIO_DIR,
+ """Build the list of test cases to be executed."""
+ test_yaml_file_name = f'opnfv-{test_name}.yaml'
+ scenario_file_name = os.path.join(self.rally_scenario_dir,
test_yaml_file_name)
if not os.path.exists(scenario_file_name):
@@ -161,33 +154,108 @@ class RallyBase(testcase.TestCase):
test_yaml_file_name)
if not os.path.exists(scenario_file_name):
- raise Exception("The scenario '%s' does not exist."
- % scenario_file_name)
+ raise Exception(
+ f"The scenario '{scenario_file_name}' does not exist.")
LOGGER.debug('Scenario fetched from : %s', scenario_file_name)
- test_file_name = os.path.join(self.TEMP_DIR, test_yaml_file_name)
+ test_file_name = os.path.join(self.temp_dir, test_yaml_file_name)
- if not os.path.exists(self.TEMP_DIR):
- os.makedirs(self.TEMP_DIR)
+ if not os.path.exists(self.temp_dir):
+ os.makedirs(self.temp_dir)
- self._apply_blacklist(scenario_file_name, test_file_name)
+ self.apply_blacklist(scenario_file_name, test_file_name)
return test_file_name
@staticmethod
- def get_task_id(cmd_raw):
+ def get_verifier_deployment_id():
+ """
+ Returns deployment id for active Rally deployment
+ """
+ cmd = ("rally deployment list | awk '/" +
+ getattr(config.CONF, 'rally_deployment_name') +
+ "/ {print $2}'")
+ with subprocess.Popen(
+ cmd, shell=True, stdout=subprocess.PIPE,
+ stderr=subprocess.STDOUT) as proc:
+ deployment_uuid = proc.stdout.readline().rstrip()
+ return deployment_uuid.decode("utf-8")
+
+ @staticmethod
+ def create_rally_deployment(environ=None):
+ # pylint: disable=unexpected-keyword-arg
+ """Create new rally deployment"""
+ # set the architecture to default
+ pod_arch = env.get("POD_ARCH")
+ arch_filter = ['aarch64']
+
+ if pod_arch and pod_arch in arch_filter:
+ LOGGER.info("Apply aarch64 specific to rally config...")
+ with open(
+ RallyBase.rally_aar4_patch_path, "r",
+ encoding='utf-8') as pfile:
+ rally_patch_conf = pfile.read()
+
+ for line in fileinput.input(RallyBase.rally_conf_path):
+ print(line, end=' ')
+ if "cirros|testvm" in line:
+ print(rally_patch_conf)
+
+ LOGGER.info("Creating Rally environment...")
+ try:
+ cmd = ['rally', 'deployment', 'destroy',
+ '--deployment',
+ str(getattr(config.CONF, 'rally_deployment_name'))]
+ output = subprocess.check_output(cmd)
+ LOGGER.info("%s\n%s", " ".join(cmd), output.decode("utf-8"))
+ except subprocess.CalledProcessError:
+ pass
+
+ cmd = ['rally', 'deployment', 'create', '--fromenv',
+ '--name', str(getattr(config.CONF, 'rally_deployment_name'))]
+ output = subprocess.check_output(cmd, env=environ)
+ LOGGER.info("%s\n%s", " ".join(cmd), output.decode("utf-8"))
+
+ cmd = ['rally', 'deployment', 'check']
+ output = subprocess.check_output(cmd)
+ LOGGER.info("%s\n%s", " ".join(cmd), output.decode("utf-8"))
+ return RallyBase.get_verifier_deployment_id()
+
+ @staticmethod
+ def update_keystone_default_role(rally_conf='/etc/rally/rally.conf'):
+ """Set keystone_default_role in rally.conf"""
+ if env.get("NEW_USER_ROLE").lower() != "member":
+ rconfig = configparser.RawConfigParser()
+ rconfig.read(rally_conf)
+ if not rconfig.has_section('openstack'):
+ rconfig.add_section('openstack')
+ rconfig.set(
+ 'openstack', 'keystone_default_role', env.get("NEW_USER_ROLE"))
+ with open(rally_conf, 'w', encoding='utf-8') as config_file:
+ rconfig.write(config_file)
+
+ @staticmethod
+ def clean_rally_conf(rally_conf='/etc/rally/rally.conf'):
+ """Clean Rally config"""
+ if env.get("NEW_USER_ROLE").lower() != "member":
+ rconfig = configparser.RawConfigParser()
+ rconfig.read(rally_conf)
+ if rconfig.has_option('openstack', 'keystone_default_role'):
+ rconfig.remove_option('openstack', 'keystone_default_role')
+ with open(rally_conf, 'w', encoding='utf-8') as config_file:
+ rconfig.write(config_file)
+
+ @staticmethod
+ def get_task_id(tag):
"""
Get task id from command rally result.
- :param cmd_raw:
+ :param tag:
:return: task_id as string
"""
- taskid_re = re.compile('^Task +(.*): started$')
- for line in cmd_raw.splitlines(True):
- line = line.strip()
- match = taskid_re.match(line)
- if match:
- return match.group(1)
- return None
+ cmd = ["rally", "task", "list", "--tag", tag, "--uuids-only"]
+ output = subprocess.check_output(cmd).decode("utf-8").rstrip()
+ LOGGER.info("%s: %s", " ".join(cmd), output)
+ return output
@staticmethod
def task_succeed(json_raw):
@@ -198,53 +266,48 @@ class RallyBase(testcase.TestCase):
:return: Bool
"""
rally_report = json.loads(json_raw)
- for report in rally_report:
- if report is None or report.get('result') is None:
- return False
-
- for result in report.get('result'):
- if result is None or len(result.get('error')) > 0:
+ tasks = rally_report.get('tasks')
+ if tasks:
+ for task in tasks:
+ if task.get('status') != 'finished' or \
+ task.get('pass_sla') is not True:
return False
-
+ else:
+ return False
return True
def _migration_supported(self):
"""Determine if migration is supported."""
if self.compute_cnt > 1:
return True
-
return False
- @staticmethod
- def get_cmd_output(proc):
- """Get command stdout."""
- result = ""
- while proc.poll() is None:
- line = proc.stdout.readline()
- result += line
- return result
+ def _network_trunk_supported(self):
+ """Determine if network trunk service is available"""
+ if 'trunk' in self.network_extensions:
+ return True
+ return False
@staticmethod
def excl_scenario():
"""Exclude scenario."""
black_tests = []
try:
- with open(RallyBase.BLACKLIST_FILE, 'r') as black_list_file:
+ with open(
+ RallyBase.blacklist_file, 'r',
+ encoding='utf-8') as black_list_file:
black_list_yaml = yaml.safe_load(black_list_file)
- installer_type = CONST.__getattribute__('INSTALLER_TYPE')
- deploy_scenario = CONST.__getattribute__('DEPLOY_SCENARIO')
- if (bool(installer_type) and bool(deploy_scenario) and
+ deploy_scenario = env.get('DEPLOY_SCENARIO')
+ if (bool(deploy_scenario) and
'scenario' in black_list_yaml.keys()):
for item in black_list_yaml['scenario']:
scenarios = item['scenarios']
- installers = item['installers']
in_it = RallyBase.in_iterable_re
- if (in_it(deploy_scenario, scenarios) and
- in_it(installer_type, installers)):
+ if in_it(deploy_scenario, scenarios):
tests = item['tests']
black_tests.extend(tests)
- except Exception:
+ except Exception: # pylint: disable=broad-except
LOGGER.debug("Scenario exclusion not applied.")
return black_tests
@@ -267,8 +330,8 @@ class RallyBase(testcase.TestCase):
# match if regex pattern is set and found in the needle
if pattern and re.search(pattern, needle) is not None:
return True
- else:
- return False
+
+ return False
def excl_func(self):
"""Exclude functionalities."""
@@ -276,11 +339,19 @@ class RallyBase(testcase.TestCase):
func_list = []
try:
- with open(RallyBase.BLACKLIST_FILE, 'r') as black_list_file:
+ with open(
+ RallyBase.blacklist_file, 'r',
+ encoding='utf-8') as black_list_file:
black_list_yaml = yaml.safe_load(black_list_file)
+ if env.get('BLOCK_MIGRATION').lower() == 'true':
+ func_list.append("block_migration")
if not self._migration_supported():
func_list.append("no_migration")
+ if not self._network_trunk_supported():
+ func_list.append("no_net_trunk_service")
+ if not self.ext_net:
+ func_list.append("no_floating_ip")
if 'functionality' in black_list_yaml.keys():
for item in black_list_yaml['functionality']:
@@ -294,34 +365,28 @@ class RallyBase(testcase.TestCase):
return black_tests
- def _apply_blacklist(self, case_file_name, result_file_name):
+ def apply_blacklist(self, case_file_name, result_file_name):
"""Apply blacklist."""
LOGGER.debug("Applying blacklist...")
- cases_file = open(case_file_name, 'r')
- result_file = open(result_file_name, 'w')
-
- black_tests = list(set(self.excl_func() +
- self.excl_scenario()))
-
- if black_tests:
- LOGGER.debug("Blacklisted tests: " + str(black_tests))
-
- include = True
- for cases_line in cases_file:
- if include:
- for black_tests_line in black_tests:
- if re.search(black_tests_line,
- cases_line.strip().rstrip(':')):
- include = False
- break
+ with open(case_file_name, 'r', encoding='utf-8') as cases_file, open(
+ result_file_name, 'w', encoding='utf-8') as result_file:
+ black_tests = list(set(self.excl_func() + self.excl_scenario()))
+ if black_tests:
+ LOGGER.debug("Blacklisted tests: %s", str(black_tests))
+
+ include = True
+ for cases_line in cases_file:
+ if include:
+ for black_tests_line in black_tests:
+ if re.search(black_tests_line,
+ cases_line.strip().rstrip(':')):
+ include = False
+ break
+ else:
+ result_file.write(str(cases_line))
else:
- result_file.write(str(cases_line))
- else:
- if cases_line.isspace():
- include = True
-
- cases_file.close()
- result_file.close()
+ if cases_line.isspace():
+ include = True
@staticmethod
def file_is_empty(file_name):
@@ -334,325 +399,315 @@ class RallyBase(testcase.TestCase):
return True
- def _run_task(self, test_name):
- """Run a task."""
- LOGGER.info('Starting test scenario "%s" ...', test_name)
-
- task_file = os.path.join(self.RALLY_DIR, 'task.yaml')
- if not os.path.exists(task_file):
- LOGGER.error("Task file '%s' does not exist.", task_file)
- raise Exception("Task file '%s' does not exist.", task_file)
-
- file_name = self._prepare_test_list(test_name)
- if self.file_is_empty(file_name):
- LOGGER.info('No tests for scenario "%s"', test_name)
- return
-
- cmd = (["rally", "task", "start", "--abort-on-sla-failure", "--task",
- task_file, "--task-args",
- str(self._build_task_args(test_name))])
- LOGGER.debug('running command: %s', cmd)
-
- proc = subprocess.Popen(cmd, stdout=subprocess.PIPE,
- stderr=subprocess.STDOUT)
- output = self._get_output(proc, test_name)
- task_id = self.get_task_id(output)
- LOGGER.debug('task_id : %s', task_id)
-
- if task_id is None:
- LOGGER.error('Failed to retrieve task_id, validating task...')
- cmd = (["rally", "task", "validate", "--task", task_file,
- "--task-args", str(self._build_task_args(test_name))])
- LOGGER.debug('running command: %s', cmd)
- proc = subprocess.Popen(cmd, stdout=subprocess.PIPE,
- stderr=subprocess.STDOUT)
- output = self.get_cmd_output(proc)
- LOGGER.error("Task validation result:" + "\n" + output)
- return
-
+ def _save_results(self, test_name, task_id):
+ """ Generate and save task execution results"""
# check for result directory and create it otherwise
- if not os.path.exists(self.RESULTS_DIR):
+ if not os.path.exists(self.results_dir):
LOGGER.debug('%s does not exist, we create it.',
- self.RESULTS_DIR)
- os.makedirs(self.RESULTS_DIR)
-
- # write html report file
- report_html_name = 'opnfv-{}.html'.format(test_name)
- report_html_dir = os.path.join(self.RESULTS_DIR, report_html_name)
- cmd = (["rally", "task", "report", task_id, "--out", report_html_dir])
+ self.results_dir)
+ os.makedirs(self.results_dir)
+ # put detailed result to log
+ cmd = (["rally", "task", "detailed", "--uuid", task_id])
LOGGER.debug('running command: %s', cmd)
- subprocess.Popen(cmd, stdout=subprocess.PIPE,
- stderr=subprocess.STDOUT)
-
- # get and save rally operation JSON result
- cmd = (["rally", "task", "results", task_id])
+ output = subprocess.check_output(cmd, stderr=subprocess.STDOUT)
+ LOGGER.info("%s\n%s", " ".join(cmd), output.decode("utf-8"))
+
+ # save report as JSON
+ report_json_name = f'{test_name}.json'
+ report_json_dir = os.path.join(self.results_dir, report_json_name)
+ cmd = (["rally", "task", "report", "--json", "--uuid", task_id,
+ "--out", report_json_dir])
LOGGER.debug('running command: %s', cmd)
- proc = subprocess.Popen(cmd, stdout=subprocess.PIPE,
- stderr=subprocess.STDOUT)
- json_results = self.get_cmd_output(proc)
- report_json_name = 'opnfv-{}.json'.format(test_name)
- report_json_dir = os.path.join(self.RESULTS_DIR, report_json_name)
- with open(report_json_dir, 'w') as r_file:
- LOGGER.debug('saving json file')
- r_file.write(json_results)
+ output = subprocess.check_output(cmd, stderr=subprocess.STDOUT)
+ LOGGER.info("%s\n%s", " ".join(cmd), output.decode("utf-8"))
+
+ with open(report_json_dir, encoding='utf-8') as json_file:
+ json_results = json_file.read()
+ self._append_summary(json_results, test_name)
# parse JSON operation result
if self.task_succeed(json_results):
- LOGGER.info('Test scenario: "{}" OK.'.format(test_name) + "\n")
+ LOGGER.info('Test scenario: "%s" OK.', test_name)
else:
- LOGGER.info('Test scenario: "{}" Failed.'.format(test_name) + "\n")
+ LOGGER.info('Test scenario: "%s" Failed.', test_name)
- def _get_output(self, proc, test_name):
- result = ""
+ def run_task(self, test_name):
+ """Run a task."""
+ LOGGER.info('Starting test scenario "%s" ...', test_name)
+ LOGGER.debug('running command: %s', self.run_cmd)
+ if six.PY3:
+ subprocess.call(
+ self.run_cmd, timeout=self.task_timeout,
+ stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
+ else:
+ with open(os.devnull, 'wb') as devnull:
+ subprocess.call(self.run_cmd, stdout=devnull, stderr=devnull)
+ task_id = self.get_task_id(test_name)
+ LOGGER.debug('task_id : %s', task_id)
+ if not task_id:
+ LOGGER.error("Failed to retrieve task_id")
+ raise Exception("Failed to retrieve task id")
+ self._save_results(test_name, task_id)
+
+ def _append_summary(self, json_raw, test_name):
+ # pylint: disable=too-many-locals
+ """Update statistics summary info."""
nb_tests = 0
+ nb_success = 0
overall_duration = 0.0
- success = 0.0
- nb_totals = 0
-
- while proc.poll() is None:
- line = proc.stdout.readline()
- if ("Load duration" in line or
- "started" in line or
- "finished" in line or
- " Preparing" in line or
- "+-" in line or
- "|" in line):
- result += line
- elif "test scenario" in line:
- result += "\n" + line
- elif "Full duration" in line:
- result += line + "\n\n"
-
- # parse output for summary report
- if ("| " in line and
- "| action" not in line and
- "| Starting" not in line and
- "| Completed" not in line and
- "| ITER" not in line and
- "| " not in line and
- "| total" not in line):
- nb_tests += 1
- elif "| total" in line:
- percentage = ((line.split('|')[8]).strip(' ')).strip('%')
- try:
- success += float(percentage)
- except ValueError:
- LOGGER.info('Percentage error: %s, %s',
- percentage, line)
- nb_totals += 1
- elif "Full duration" in line:
- duration = line.split(': ')[1]
- try:
- overall_duration += float(duration)
- except ValueError:
- LOGGER.info('Duration error: %s, %s', duration, line)
-
- overall_duration = "{:10.2f}".format(overall_duration)
- if nb_totals == 0:
- success_avg = 0
- else:
- success_avg = "{:0.2f}".format(success / nb_totals)
+ success = []
+ failures = []
+
+ rally_report = json.loads(json_raw)
+ for task in rally_report.get('tasks'):
+ for subtask in task.get('subtasks'):
+ has_errors = False
+ for workload in subtask.get('workloads'):
+ if workload.get('full_duration'):
+ overall_duration += workload.get('full_duration')
+
+ if workload.get('data'):
+ nb_tests += len(workload.get('data'))
+
+ for result in workload.get('data'):
+ if not result.get('error'):
+ nb_success += 1
+ else:
+ has_errors = True
+
+ if has_errors:
+ failures.append(subtask['title'])
+ else:
+ success.append(subtask['title'])
scenario_summary = {'test_name': test_name,
'overall_duration': overall_duration,
'nb_tests': nb_tests,
- 'success': success_avg}
+ 'nb_success': nb_success,
+ 'success': success,
+ 'failures': failures,
+ 'task_status': self.task_succeed(json_raw)}
self.summary.append(scenario_summary)
- LOGGER.debug("\n" + result)
-
- return result
-
- def _prepare_env(self):
- LOGGER.debug('Validating the test name...')
- if self.test_name not in self.TESTS:
- raise Exception("Test name '%s' is invalid" % self.test_name)
-
- network_name = self.RALLY_PRIVATE_NET_NAME + self.guid
- subnet_name = self.RALLY_PRIVATE_SUBNET_NAME + self.guid
- router_name = self.RALLY_ROUTER_NAME + self.guid
- self.image_name = self.GLANCE_IMAGE_NAME + self.guid
- self.flavor_name = self.FLAVOR_NAME + self.guid
- self.flavor_alt_name = self.FLAVOR_ALT_NAME + self.guid
- self.ext_net_name = snaps_utils.get_ext_net_name(self.os_creds)
- self.compute_cnt = snaps_utils.get_active_compute_cnt(self.os_creds)
-
- LOGGER.debug("Creating image '%s'...", self.image_name)
- image_creator = deploy_utils.create_image(
- self.os_creds, ImageConfig(
- name=self.image_name,
- image_file=self.GLANCE_IMAGE_PATH,
- img_format=self.GLANCE_IMAGE_FORMAT,
- image_user=self.GLANCE_IMAGE_USERNAME,
- public=True,
- extra_properties=self.GLANCE_IMAGE_EXTRA_PROPERTIES))
- if image_creator is None:
- raise Exception("Failed to create image")
- self.creators.append(image_creator)
-
- LOGGER.debug("Creating network '%s'...", network_name)
-
- rally_network_type = None
- rally_physical_network = None
- rally_segmentation_id = None
-
- if hasattr(CONST, 'rally_network_type'):
- rally_network_type = CONST.__getattribute__(
- 'rally_network_type')
- if hasattr(CONST, 'rally_physical_network'):
- rally_physical_network = CONST.__getattribute__(
- 'rally_physical_network')
- if hasattr(CONST, 'rally_segmentation_id'):
- rally_segmentation_id = CONST.__getattribute__(
- 'rally_segmentation_id')
-
- network_creator = deploy_utils.create_network(
- self.os_creds, NetworkConfig(
- name=network_name,
- shared=True,
- network_type=rally_network_type,
- physical_network=rally_physical_network,
- segmentation_id=rally_segmentation_id,
- subnet_settings=[SubnetConfig(
- name=subnet_name,
- cidr=self.RALLY_PRIVATE_SUBNET_CIDR)
- ]))
- if network_creator is None:
- raise Exception("Failed to create private network")
- self.priv_net_id = network_creator.get_network().id
- self.creators.append(network_creator)
-
- LOGGER.debug("Creating router '%s'...", router_name)
- router_creator = deploy_utils.create_router(
- self.os_creds, RouterConfig(
- name=router_name,
- external_gateway=self.ext_net_name,
- internal_subnets=[subnet_name]))
- if router_creator is None:
- raise Exception("Failed to create router")
- self.creators.append(router_creator)
-
- LOGGER.debug("Creating flavor '%s'...", self.flavor_name)
- flavor_creator = OpenStackFlavor(
- self.os_creds, FlavorConfig(
- name=self.flavor_name, ram=self.FLAVOR_RAM, disk=1, vcpus=1,
- metadata=self.FLAVOR_EXTRA_SPECS))
- if flavor_creator is None or flavor_creator.create() is None:
- raise Exception("Failed to create flavor")
- self.creators.append(flavor_creator)
-
- LOGGER.debug("Creating flavor '%s'...", self.flavor_alt_name)
- flavor_alt_creator = OpenStackFlavor(
- self.os_creds, FlavorConfig(
- name=self.flavor_alt_name, ram=self.FLAVOR_RAM_ALT, disk=1,
- vcpus=1, metadata=self.FLAVOR_EXTRA_SPECS))
- if flavor_alt_creator is None or flavor_alt_creator.create() is None:
- raise Exception("Failed to create flavor")
- self.creators.append(flavor_alt_creator)
-
- def _run_tests(self):
- if self.test_name == 'all':
- for test in self.TESTS:
- if test == 'all' or test == 'vm':
- continue
- self._run_task(test)
- else:
- self._run_task(self.test_name)
+ def prepare_run(self, **kwargs):
+ """Prepare resources needed by test scenarios."""
+ assert self.cloud
+ LOGGER.debug('Validating run tests...')
+ for test in kwargs.get('tests', self.stests):
+ if test in self.stests:
+ self.tests.append(test)
+ else:
+ raise Exception(f"Test name '{test}' is invalid")
+
+ if not os.path.exists(self.task_dir):
+ os.makedirs(self.task_dir)
+
+ task = os.path.join(self.rally_dir, 'task.yaml')
+ if not os.path.exists(task):
+ LOGGER.error("Task file '%s' does not exist.", task)
+ raise Exception(f"Task file '{task}' does not exist.")
+ self.task_file = os.path.join(self.task_dir, 'task.yaml')
+ shutil.copyfile(task, self.task_file)
+
+ task_macro = os.path.join(self.rally_dir, 'macro')
+ if not os.path.exists(task_macro):
+ LOGGER.error("Task macro dir '%s' does not exist.", task_macro)
+ raise Exception(f"Task macro dir '{task_macro}' does not exist.")
+ macro_dir = os.path.join(self.task_dir, 'macro')
+ if os.path.exists(macro_dir):
+ shutil.rmtree(macro_dir)
+ shutil.copytree(task_macro, macro_dir)
+
+ self.update_keystone_default_role()
+ self.compute_cnt = self.count_hypervisors()
+ self.network_extensions = self.cloud.get_network_extensions()
+ self.flavor_alt = self.create_flavor_alt()
+ self.services = [service.name for service in
+ functest_utils.list_services(self.cloud)]
+
+ LOGGER.debug("flavor: %s", self.flavor_alt)
+
+ def prepare_task(self, test_name):
+ """Prepare resources for test run."""
+ file_name = self._prepare_test_list(test_name)
+ if self.file_is_empty(file_name):
+ LOGGER.info('No tests for scenario "%s"', test_name)
+ return False
+ self.run_cmd = (["rally", "task", "start", "--tag", test_name,
+ "--abort-on-sla-failure",
+ "--task", self.task_file, "--task-args",
+ str(self.build_task_args(test_name))])
+ return True
+
+ def run_tests(self, **kwargs):
+ """Execute tests."""
+ optional = kwargs.get('optional', [])
+ for test in self.tests:
+ if test in self.services or test not in optional:
+ if self.prepare_task(test):
+ self.run_task(test)
def _generate_report(self):
- report = (
- "\n"
- " "
- "\n"
- " Rally Summary Report\n"
- "\n"
- "+===================+============+===============+===========+"
- "\n"
- "| Module | Duration | nb. Test Run | Success |"
- "\n"
- "+===================+============+===============+===========+"
- "\n")
+ """Generate test execution summary report."""
+ total_duration = 0.0
+ total_nb_tests = 0
+ total_nb_success = 0
+ nb_modules = 0
payload = []
+ res_table = prettytable.PrettyTable(
+ padding_width=2,
+ field_names=['Module', 'Duration', 'nb. Test Run', 'Success'])
+ res_table.align['Module'] = "l"
+ res_table.align['Duration'] = "r"
+ res_table.align['Success'] = "r"
+
# for each scenario we draw a row for the table
- total_duration = 0.0
- total_nb_tests = 0
- total_success = 0.0
for item in self.summary:
- name = "{0:<17}".format(item['test_name'])
- duration = float(item['overall_duration'])
- total_duration += duration
- duration = time.strftime("%M:%S", time.gmtime(duration))
- duration = "{0:<10}".format(duration)
- nb_tests = "{0:<13}".format(item['nb_tests'])
- total_nb_tests += int(item['nb_tests'])
- success = "{0:<10}".format(str(item['success']) + '%')
- total_success += float(item['success'])
- report += ("" +
- "| " + name + " | " + duration + " | " +
- nb_tests + " | " + success + "|\n" +
- "+-------------------+------------"
- "+---------------+-----------+\n")
- payload.append({'module': name,
+ if item['task_status'] is True:
+ nb_modules += 1
+ total_duration += item['overall_duration']
+ total_nb_tests += item['nb_tests']
+ total_nb_success += item['nb_success']
+ try:
+ success_avg = 100 * item['nb_success'] / item['nb_tests']
+ except ZeroDivisionError:
+ success_avg = 0
+ success_str = f"{success_avg:0.2f}%"
+ duration_str = time.strftime("%H:%M:%S",
+ time.gmtime(item['overall_duration']))
+ res_table.add_row([item['test_name'], duration_str,
+ item['nb_tests'], success_str])
+ payload.append({'module': item['test_name'],
'details': {'duration': item['overall_duration'],
'nb tests': item['nb_tests'],
- 'success': item['success']}})
+ 'success rate': success_str,
+ 'success': item['success'],
+ 'failures': item['failures']}})
total_duration_str = time.strftime("%H:%M:%S",
time.gmtime(total_duration))
- total_duration_str2 = "{0:<10}".format(total_duration_str)
- total_nb_tests_str = "{0:<13}".format(total_nb_tests)
-
try:
- self.result = total_success / len(self.summary)
+ self.result = 100 * total_nb_success / total_nb_tests
except ZeroDivisionError:
self.result = 100
+ success_rate = f"{self.result:0.2f}"
+ success_rate_str = str(success_rate) + '%'
+ res_table.add_row(["", "", "", ""])
+ res_table.add_row(["TOTAL:", total_duration_str, total_nb_tests,
+ success_rate_str])
+
+ LOGGER.info("Rally Summary Report:\n\n%s\n", res_table.get_string())
+ LOGGER.info("Rally '%s' success_rate is %s%% in %s/%s modules",
+ self.case_name, success_rate, nb_modules,
+ len(self.summary))
+ self.details['summary'] = {'duration': total_duration,
+ 'nb tests': total_nb_tests,
+ 'nb success': success_rate}
+ self.details["modules"] = payload
- success_rate = "{:0.2f}".format(self.result)
- success_rate_str = "{0:<10}".format(str(success_rate) + '%')
- report += ("+===================+============"
- "+===============+===========+")
- report += "\n"
- report += ("| TOTAL: | " + total_duration_str2 + " | " +
- total_nb_tests_str + " | " + success_rate_str + "|\n")
- report += ("+===================+============"
- "+===============+===========+")
- report += "\n"
-
- LOGGER.info("\n" + report)
- payload.append({'summary': {'duration': total_duration,
- 'nb tests': total_nb_tests,
- 'nb success': success_rate}})
-
- self.details = payload
-
- LOGGER.info("Rally '%s' success_rate is %s%%",
- self.case_name, success_rate)
-
- def _clean_up(self):
- for creator in reversed(self.creators):
- try:
- creator.clean()
- except Exception as e:
- LOGGER.error('Unexpected error cleaning - %s', e)
+ @staticmethod
+ def export_task(file_name, export_type="html"):
+ """Export all task results (e.g. html or xunit report)
+
+ Raises:
+ subprocess.CalledProcessError: if Rally doesn't return 0
+
+ Returns:
+ None
+ """
+ cmd = ["rally", "task", "export", "--type", export_type,
+ "--deployment",
+ str(getattr(config.CONF, 'rally_deployment_name')),
+ "--to", file_name]
+ LOGGER.debug('running command: %s', cmd)
+ output = subprocess.check_output(cmd, stderr=subprocess.STDOUT)
+ LOGGER.info("%s\n%s", " ".join(cmd), output.decode("utf-8"))
+
+ @staticmethod
+ def verify_report(file_name, uuid, export_type="html"):
+ """Generate the verifier report (e.g. html or xunit report)
+
+ Raises:
+ subprocess.CalledProcessError: if Rally doesn't return 0
+
+ Returns:
+ None
+ """
+ cmd = ["rally", "verify", "report", "--type", export_type,
+ "--uuid", uuid, "--to", file_name]
+ LOGGER.debug('running command: %s', cmd)
+ output = subprocess.check_output(cmd, stderr=subprocess.STDOUT)
+ LOGGER.info("%s\n%s", " ".join(cmd), output.decode("utf-8"))
+
+ def clean(self):
+ """Cleanup of OpenStack resources. Should be called on completion."""
+ self.clean_rally_conf()
+ self.clean_rally_logs()
+ if self.flavor_alt:
+ self.orig_cloud.delete_flavor(self.flavor_alt.id)
+ super().clean()
+
+ def is_successful(self):
+ """The overall result of the test."""
+ for item in self.summary:
+ if item['task_status'] is False:
+ return testcase.TestCase.EX_TESTCASE_FAILED
+
+ return super().is_successful()
+
+ @staticmethod
+ def update_rally_logs(res_dir, rally_conf='/etc/rally/rally.conf'):
+ """Print rally logs in res dir"""
+ if not os.path.exists(res_dir):
+ os.makedirs(res_dir)
+ rconfig = configparser.RawConfigParser()
+ rconfig.read(rally_conf)
+ rconfig.set('DEFAULT', 'debug', True)
+ rconfig.set('DEFAULT', 'use_stderr', False)
+ rconfig.set('DEFAULT', 'log-file', 'rally.log')
+ rconfig.set('DEFAULT', 'log_dir', res_dir)
+ with open(rally_conf, 'w', encoding='utf-8') as config_file:
+ rconfig.write(config_file)
+
+ @staticmethod
+ def clean_rally_logs(rally_conf='/etc/rally/rally.conf'):
+ """Clean Rally config"""
+ rconfig = configparser.RawConfigParser()
+ rconfig.read(rally_conf)
+ if rconfig.has_option('DEFAULT', 'use_stderr'):
+ rconfig.remove_option('DEFAULT', 'use_stderr')
+ if rconfig.has_option('DEFAULT', 'debug'):
+ rconfig.remove_option('DEFAULT', 'debug')
+ if rconfig.has_option('DEFAULT', 'log-file'):
+ rconfig.remove_option('DEFAULT', 'log-file')
+ if rconfig.has_option('DEFAULT', 'log_dir'):
+ rconfig.remove_option('DEFAULT', 'log_dir')
+ with open(rally_conf, 'w', encoding='utf-8') as config_file:
+ rconfig.write(config_file)
- @energy.enable_recording
def run(self, **kwargs):
"""Run testcase."""
self.start_time = time.time()
try:
- conf_utils.create_rally_deployment()
- self._prepare_env()
- self._run_tests()
+ assert super().run(
+ **kwargs) == testcase.TestCase.EX_OK
+ self.update_rally_logs(self.res_dir)
+ self.create_rally_deployment(environ=self.project.get_environ())
+ self.prepare_run(**kwargs)
+ self.run_tests(**kwargs)
self._generate_report()
+ self.export_task(
+ f"{self.results_dir}/{self.case_name}.html")
+ self.export_task(
+ f"{self.results_dir}/{self.case_name}.xml",
+ export_type="junit-xml")
res = testcase.TestCase.EX_OK
- except Exception as exc: # pylint: disable=broad-except
- LOGGER.error('Error with run: %s', exc)
+ except Exception: # pylint: disable=broad-except
+ LOGGER.exception('Error with run:')
+ self.result = 0
res = testcase.TestCase.EX_RUN_ERROR
- finally:
- self._clean_up()
-
self.stop_time = time.time()
return res
@@ -664,22 +719,120 @@ class RallySanity(RallyBase):
"""Initialize RallySanity object."""
if "case_name" not in kwargs:
kwargs["case_name"] = "rally_sanity"
- super(RallySanity, self).__init__(**kwargs)
- self.mode = 'sanity'
- self.test_name = 'all'
+ super().__init__(**kwargs)
self.smoke = True
- self.scenario_dir = os.path.join(self.RALLY_SCENARIO_DIR, 'sanity')
+ self.scenario_dir = os.path.join(self.rally_scenario_dir, 'sanity')
class RallyFull(RallyBase):
"""Rally full testcase implementation."""
+ task_timeout = 7200
+
def __init__(self, **kwargs):
"""Initialize RallyFull object."""
if "case_name" not in kwargs:
kwargs["case_name"] = "rally_full"
- super(RallyFull, self).__init__(**kwargs)
- self.mode = 'full'
- self.test_name = 'all'
+ super().__init__(**kwargs)
self.smoke = False
- self.scenario_dir = os.path.join(self.RALLY_SCENARIO_DIR, 'full')
+ self.scenario_dir = os.path.join(self.rally_scenario_dir, 'full')
+
+
+class RallyJobs(RallyBase):
+ """Rally OpenStack CI testcase implementation."""
+
+ stests = ["neutron"]
+ task_timeout = 7200
+
+ def __init__(self, **kwargs):
+ """Initialize RallyJobs object."""
+ if "case_name" not in kwargs:
+ kwargs["case_name"] = "rally_jobs"
+ super().__init__(**kwargs)
+ self.task_file = os.path.join(self.rally_dir, 'rally_jobs.yaml')
+ self.task_yaml = None
+
+ def prepare_run(self, **kwargs):
+ """Create resources needed by test scenarios."""
+ super().prepare_run(**kwargs)
+ with open(
+ os.path.join(self.rally_dir, 'rally_jobs.yaml'),
+ 'r', encoding='utf-8') as task_file:
+ self.task_yaml = yaml.safe_load(task_file)
+
+ for task in self.task_yaml:
+ if task not in self.tests:
+ raise Exception(f"Test '{task}' not in '{self.tests}'")
+
+ def apply_blacklist(self, case_file_name, result_file_name):
+ # pylint: disable=too-many-branches
+ """Apply blacklist."""
+ LOGGER.debug("Applying blacklist...")
+ black_tests = list(set(self.excl_func() +
+ self.excl_scenario()))
+ if black_tests:
+ LOGGER.debug("Blacklisted tests: %s", str(black_tests))
+
+ template = YAML(typ='jinja2')
+ with open(case_file_name, 'r', encoding='utf-8') as fname:
+ cases = template.load(fname)
+ if cases.get("version", 1) == 1:
+ # scenarios in dictionary
+ for name in cases.keys():
+ if self.in_iterable_re(name, black_tests):
+ cases.pop(name)
+ else:
+ # workloads in subtasks
+ for sind, subtask in reversed(list(
+ enumerate(cases.get('subtasks', [])))):
+ for wind, workload in reversed(list(
+ enumerate(subtask.get('workloads', [])))):
+ scenario = workload.get('scenario', {})
+ for name in scenario.keys():
+ if self.in_iterable_re(name, black_tests):
+ cases['subtasks'][sind]['workloads'].pop(wind)
+ break
+ if 'workloads' in cases['subtasks'][sind]:
+ if not cases['subtasks'][sind]['workloads']:
+ cases['subtasks'].pop(sind)
+ # scenarios in subtasks
+ for sind, subtask in reversed(list(
+ enumerate(cases.get('subtasks', [])))):
+ scenario = subtask.get('scenario', {})
+ for name in scenario.keys():
+ if self.in_iterable_re(name, black_tests):
+ cases['subtasks'].pop(sind)
+ break
+
+ with open(result_file_name, 'w', encoding='utf-8') as fname:
+ template.dump(cases, fname)
+
+ def build_task_args(self, test_name):
+ """Build arguments for the Rally task."""
+ task_args = {}
+ if self.ext_net:
+ task_args['floating_network'] = str(self.ext_net.name)
+ else:
+ task_args['floating_network'] = ''
+ task_args['image_name'] = str(self.image.name)
+ task_args['flavor_name'] = str(self.flavor.name)
+ return task_args
+
+ def prepare_task(self, test_name):
+ """Prepare resources for test run."""
+ jobs_dir = os.path.join(
+ getattr(config.CONF, 'dir_rally_data'), test_name, 'rally-jobs')
+ task_name = self.task_yaml.get(test_name).get("task")
+ task = os.path.join(jobs_dir, task_name)
+ if not os.path.exists(task):
+ raise Exception(f"The scenario '{task}' does not exist.")
+ LOGGER.debug('Scenario fetched from : %s', task)
+
+ if not os.path.exists(self.temp_dir):
+ os.makedirs(self.temp_dir)
+ task_file_name = os.path.join(self.temp_dir, task_name)
+ self.apply_blacklist(task, task_file_name)
+ self.run_cmd = (["rally", "task", "start", "--tag", test_name,
+ "--task", task_file_name,
+ "--task-args", str(self.build_task_args(test_name))])
+ return True
diff --git a/functest/opnfv_tests/openstack/rally/rally_jobs.yaml b/functest/opnfv_tests/openstack/rally/rally_jobs.yaml
new file mode 100644
index 000000000..2092fb4cf
--- /dev/null
+++ b/functest/opnfv_tests/openstack/rally/rally_jobs.yaml
@@ -0,0 +1,3 @@
+---
+neutron:
+ task: task-neutron.yaml
diff --git a/functest/opnfv_tests/openstack/rally/scenario/full/opnfv-ceilometer.yaml b/functest/opnfv_tests/openstack/rally/scenario/full/opnfv-ceilometer.yaml
deleted file mode 100644
index 7efb5a83b..000000000
--- a/functest/opnfv_tests/openstack/rally/scenario/full/opnfv-ceilometer.yaml
+++ /dev/null
@@ -1,458 +0,0 @@
- CeilometerMeters.list_meters:
- -
- runner:
- {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
- context:
- {% call user_context(tenants_amount, users_amount, use_existing_users) %}
- ceilometer:
- counter_name: "benchmark_meter"
- counter_type: "gauge"
- counter_unit: "%"
- counter_volume: 100
- resources_per_tenant: 100
- samples_per_resource: 100
- timestamp_interval: 10
- metadata_list:
- -
- status: "active"
- name: "rally benchmark on"
- deleted: "false"
- -
- status: "terminated"
- name: "rally benchmark off"
- deleted: "true"
- {% endcall %}
- args:
- limit: 50
- metadata_query:
- status: "terminated"
- sla:
- {{ no_failures_sla() }}
-
- CeilometerResource.list_resources:
- -
- runner:
- {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
- context:
- {% call user_context(tenants_amount, users_amount, use_existing_users) %}
- ceilometer:
- counter_name: "benchmark_meter"
- counter_type: "gauge"
- counter_unit: "%"
- counter_volume: 100
- resources_per_tenant: 100
- samples_per_resource: 100
- timestamp_interval: 10
- metadata_list:
- -
- status: "active"
- name: "rally benchmark on"
- deleted: "false"
- -
- status: "terminated"
- name: "rally benchmark off"
- deleted: "true"
- {% endcall %}
- args:
- limit: 50
- metadata_query:
- status: "terminated"
- sla:
- {{ no_failures_sla() }}
-
- CeilometerAlarms.create_alarm_and_get_history:
- -
- args:
- meter_name: "ram_util"
- threshold: 10.0
- type: "threshold"
- state: "ok"
- statistic: "avg"
- alarm_actions: ["http://localhost:8776/alarm"]
- ok_actions: ["http://localhost:8776/ok"]
- insufficient_data_actions: ["http://localhost:8776/notok"]
- runner:
- {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
- context:
- {{ user_context(tenants_amount, users_amount, use_existing_users) }}
- sla:
- {{ no_failures_sla() }}
-
- CeilometerAlarms.create_and_delete_alarm:
- -
- args:
- meter_name: "ram_util"
- threshold: 10.0
- type: "threshold"
- statistic: "avg"
- alarm_actions: ["http://localhost:8776/alarm"]
- ok_actions: ["http://localhost:8776/ok"]
- insufficient_data_actions: ["http://localhost:8776/notok"]
- runner:
- {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
- context:
- {{ user_context(tenants_amount, users_amount, use_existing_users) }}
- sla:
- {{ no_failures_sla() }}
-
- CeilometerAlarms.create_and_get_alarm:
- -
- args:
- meter_name: "ram_util"
- threshold: 10.0
- type: "threshold"
- statistic: "avg"
- alarm_actions: ["http://localhost:8776/alarm"]
- ok_actions: ["http://localhost:8776/ok"]
- insufficient_data_actions: ["http://localhost:8776/notok"]
- runner:
- {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
- context:
- {{ user_context(tenants_amount, users_amount, use_existing_users) }}
- sla:
- {{ no_failures_sla() }}
-
- CeilometerAlarms.create_and_list_alarm:
- -
- args:
- meter_name: "ram_util"
- threshold: 10.0
- type: "threshold"
- statistic: "avg"
- alarm_actions: ["http://localhost:8776/alarm"]
- ok_actions: ["http://localhost:8776/ok"]
- insufficient_data_actions: ["http://localhost:8776/notok"]
- runner:
- {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
- context:
- {{ user_context(tenants_amount, users_amount, use_existing_users) }}
- sla:
- {{ no_failures_sla() }}
-
- CeilometerQueries.create_and_query_alarm_history:
- -
- args:
- orderby: !!null
- limit: !!null
- meter_name: "ram_util"
- threshold: 10.0
- type: "threshold"
- statistic: "avg"
- alarm_actions: ["http://localhost:8776/alarm"]
- ok_actions: ["http://localhost:8776/ok"]
- insufficient_data_actions: ["http://localhost:8776/notok"]
- runner:
- {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
- context:
- {{ user_context(tenants_amount, users_amount, use_existing_users) }}
- sla:
- {{ no_failures_sla() }}
-
- CeilometerQueries.create_and_query_alarms:
- -
- args:
- filter: {"and": [{"!=": {"state": "dummy_state"}},{"=": {"type": "threshold"}}]}
- orderby: !!null
- limit: 10
- meter_name: "ram_util"
- threshold: 10.0
- type: "threshold"
- statistic: "avg"
- alarm_actions: ["http://localhost:8776/alarm"]
- ok_actions: ["http://localhost:8776/ok"]
- insufficient_data_actions: ["http://localhost:8776/notok"]
- runner:
- {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
- context:
- {{ user_context(tenants_amount, users_amount, use_existing_users) }}
- sla:
- {{ no_failures_sla() }}
-
- CeilometerQueries.create_and_query_samples:
- -
- args:
- filter: {"=": {"counter_unit": "instance"}}
- orderby: !!null
- limit: 10
- counter_name: "cpu_util"
- counter_type: "gauge"
- counter_unit: "instance"
- counter_volume: 1.0
- resource_id: "resource_id"
- runner:
- {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
- context:
- {{ user_context(tenants_amount, users_amount, use_existing_users) }}
- sla:
- {{ no_failures_sla() }}
-
- CeilometerAlarms.create_and_update_alarm:
- -
- args:
- meter_name: "ram_util"
- threshold: 10.0
- type: "threshold"
- statistic: "avg"
- alarm_actions: ["http://localhost:8776/alarm"]
- ok_actions: ["http://localhost:8776/ok"]
- insufficient_data_actions: ["http://localhost:8776/notok"]
- runner:
- {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
- context:
- {{ user_context(tenants_amount, users_amount, use_existing_users) }}
- sla:
- {{ no_failures_sla() }}
-
- CeilometerStats.create_meter_and_get_stats:
- -
- args:
- user_id: "user-id"
- resource_id: "resource-id"
- counter_volume: 1.0
- counter_unit: ""
- counter_type: "cumulative"
- runner:
- {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
- context:
- {{ user_context(tenants_amount, users_amount, use_existing_users) }}
- sla:
- {{ no_failures_sla() }}
-
- CeilometerEvents.create_user_and_get_event:
- -
- runner:
- {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
- context:
- {{ user_context(tenants_amount, users_amount, use_existing_users) }}
- sla:
- {{ no_failures_sla() }}
-
- CeilometerEvents.create_user_and_list_events:
- -
- runner:
- {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
- context:
- {{ user_context(tenants_amount, users_amount, use_existing_users) }}
- sla:
- {{ no_failures_sla() }}
-
- CeilometerEvents.create_user_and_list_event_types:
- -
- runner:
- {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
- context:
- {{ user_context(tenants_amount, users_amount, use_existing_users) }}
- sla:
- {{ no_failures_sla() }}
-
- CeilometerTraits.create_user_and_list_trait_descriptions:
- -
- runner:
- {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
- context:
- {{ user_context(tenants_amount, users_amount, use_existing_users) }}
- sla:
- {{ no_failures_sla() }}
-
- CeilometerTraits.create_user_and_list_traits:
- -
- runner:
- {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
- context:
- {{ user_context(tenants_amount, users_amount, use_existing_users) }}
- sla:
- {{ no_failures_sla() }}
-
- CeilometerStats.get_stats:
- -
- runner:
- {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
- context:
- {% call user_context(tenants_amount, users_amount, use_existing_users) %}
- ceilometer:
- counter_name: "benchmark_meter"
- counter_type: "gauge"
- counter_unit: "%"
- counter_volume: 100
- resources_per_tenant: 100
- samples_per_resource: 100
- timestamp_interval: 10
- metadata_list:
- -
- status: "active"
- name: "rally benchmark on"
- deleted: "false"
- -
- status: "terminated"
- name: "rally benchmark off"
- deleted: "true"
- {% endcall %}
- args:
- meter_name: "benchmark_meter"
- filter_by_user_id: true
- filter_by_project_id: true
- filter_by_resource_id: true
- metadata_query:
- status: "terminated"
- period: 300
- groupby: "resource_id"
- sla:
- {{ no_failures_sla() }}
-
- CeilometerResource.get_tenant_resources:
- -
- runner:
- {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
- context:
- {% call user_context(tenants_amount, users_amount, use_existing_users) %}
- ceilometer:
- counter_name: "cpu_util"
- counter_type: "gauge"
- counter_volume: 1.0
- counter_unit: "instance"
- {% endcall %}
- sla:
- {{ no_failures_sla() }}
-
- CeilometerAlarms.list_alarms:
- -
- runner:
- {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
- context:
- {{ user_context(tenants_amount, users_amount, use_existing_users) }}
- sla:
- {{ no_failures_sla() }}
-
- CeilometerSamples.list_matched_samples:
- -
- runner:
- {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
- context:
- {% call user_context(tenants_amount, users_amount, use_existing_users) %}
- ceilometer:
- counter_name: "cpu_util"
- counter_type: "gauge"
- counter_unit: "instance"
- counter_volume: 1.0
- resources_per_tenant: 100
- samples_per_resource: 100
- timestamp_interval: 60
- metadata_list:
- - status: "active"
- name: "fake_resource"
- deleted: "False"
- created_at: "2015-09-04T12:34:19.000000"
- - status: "not_active"
- name: "fake_resource_1"
- deleted: "False"
- created_at: "2015-09-10T06:55:12.000000"
- {% endcall %}
- args:
- limit: 50
- filter_by_user_id: true
- filter_by_project_id: true
- filter_by_resource_id: true
- metadata_query:
- status: "not_active"
- sla:
- {{ no_failures_sla() }}
-
- CeilometerMeters.list_matched_meters:
- -
- runner:
- {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
- context:
- {% call user_context(tenants_amount, users_amount, use_existing_users) %}
- ceilometer:
- counter_name: "benchmark_meter"
- counter_type: "gauge"
- counter_unit: "%"
- counter_volume: 100
- resources_per_tenant: 100
- samples_per_resource: 100
- timestamp_interval: 10
- metadata_list:
- -
- status: "active"
- name: "rally benchmark on"
- deleted: "false"
- -
- status: "terminated"
- name: "rally benchmark off"
- deleted: "true"
- {% endcall %}
- args:
- limit: 50
- filter_by_user_id: true
- filter_by_project_id: true
- filter_by_resource_id: true
- metadata_query:
- status: "terminated"
- sla:
- {{ no_failures_sla() }}
-
- CeilometerResource.list_matched_resources:
- -
- runner:
- {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
- context:
- {% call user_context(tenants_amount, users_amount, use_existing_users) %}
- ceilometer:
- counter_name: "benchmark_meter"
- counter_type: "gauge"
- counter_unit: "%"
- counter_volume: 100
- resources_per_tenant: 100
- samples_per_resource: 100
- timestamp_interval: 10
- metadata_list:
- -
- status: "active"
- name: "rally benchmark on"
- deleted: "false"
- -
- status: "terminated"
- name: "rally benchmark off"
- deleted: "true"
- {% endcall %}
- args:
- limit: 50
- filter_by_user_id: true
- filter_by_project_id: true
- metadata_query:
- status: "terminated"
- sla:
- {{ no_failures_sla() }}
-
- CeilometerSamples.list_samples:
- -
- runner:
- {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
- context:
- {% call user_context(tenants_amount, users_amount, use_existing_users) %}
- ceilometer:
- counter_name: "cpu_util"
- counter_type: "gauge"
- counter_unit: "instance"
- counter_volume: 1.0
- resources_per_tenant: 100
- samples_per_resource: 100
- timestamp_interval: 60
- metadata_list:
- - status: "active"
- name: "fake_resource"
- deleted: "False"
- created_at: "2015-09-04T12:34:19.000000"
- - status: "not_active"
- name: "fake_resource_1"
- deleted: "False"
- created_at: "2015-09-10T06:55:12.000000"
- batch_size: 5
- {% endcall %}
- args:
- limit: 50
- metadata_query:
- status: "not_active"
- sla:
- {{ no_failures_sla() }}
-
diff --git a/functest/opnfv_tests/openstack/rally/scenario/full/opnfv-cinder.yaml b/functest/opnfv_tests/openstack/rally/scenario/full/opnfv-cinder.yaml
index 87fae11a3..7abeeac68 100644
--- a/functest/opnfv_tests/openstack/rally/scenario/full/opnfv-cinder.yaml
+++ b/functest/opnfv_tests/openstack/rally/scenario/full/opnfv-cinder.yaml
@@ -8,6 +8,8 @@
{% call user_context(tenants_amount, users_amount, use_existing_users) %}
quotas:
{{ unlimited_volumes() }}
+ api_versions:
+ {{ volume_service(version=volume_version, service_type=volume_service_type) }}
{% endcall %}
runner:
{{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
@@ -23,6 +25,8 @@
{% call user_context(tenants_amount, users_amount, use_existing_users) %}
quotas:
{{ unlimited_volumes() }}
+ api_versions:
+ {{ volume_service(version=volume_version, service_type=volume_service_type) }}
{{ volumes() }}
{% endcall %}
runner:
@@ -39,6 +43,8 @@
{% call user_context(tenants_amount, users_amount, use_existing_users) %}
quotas:
{{ unlimited_volumes() }}
+ api_versions:
+ {{ volume_service(version=volume_version, service_type=volume_service_type) }}
{% endcall %}
runner:
{{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
@@ -52,6 +58,8 @@
{% call user_context(tenants_amount, users_amount, use_existing_users) %}
quotas:
{{ unlimited_volumes() }}
+ api_versions:
+ {{ volume_service(version=volume_version, service_type=volume_service_type) }}
{% endcall %}
runner:
{{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
@@ -70,6 +78,8 @@
{% call user_context(tenants_amount, users_amount, use_existing_users) %}
quotas:
{{ unlimited_volumes() }}
+ api_versions:
+ {{ volume_service(version=volume_version, service_type=volume_service_type) }}
{% endcall %}
runner:
{{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
@@ -84,10 +94,15 @@
size:
max: 1
min: 1
+ create_vm_params:
+ nics:
+ - net-id: {{ netid }}
context:
{% call user_context(tenants_amount, users_amount, use_existing_users) %}
quotas:
{{ unlimited_volumes() }}
+ api_versions:
+ {{ volume_service(version=volume_version, service_type=volume_service_type) }}
{% endcall %}
runner:
{{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
@@ -100,11 +115,16 @@
{{ vm_params(image_name,flavor_name) }}
size:
min: 1
- max: 5
+ max: 1
+ create_vm_params:
+ nics:
+ - net-id: {{ netid }}
context:
{% call user_context(tenants_amount, users_amount, use_existing_users) %}
quotas:
{{ unlimited_volumes() }}
+ api_versions:
+ {{ volume_service(version=volume_version, service_type=volume_service_type) }}
{% endcall %}
runner:
{{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
@@ -117,17 +137,21 @@
size: 1
context:
{{ user_context(tenants_amount, users_amount, use_existing_users) }}
+ api_versions:
+ {{ volume_service(version=volume_version, service_type=volume_service_type) }}
runner:
{{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
-
args:
size:
min: 1
- max: 5
+ max: 1
context:
{% call user_context(tenants_amount, users_amount, use_existing_users) %}
quotas:
{{ unlimited_volumes() }}
+ api_versions:
+ {{ volume_service(version=volume_version, service_type=volume_service_type) }}
{% endcall %}
runner:
{{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
@@ -142,6 +166,8 @@
{% call user_context(tenants_amount, users_amount, use_existing_users) %}
quotas:
{{ unlimited_volumes() }}
+ api_versions:
+ {{ volume_service(version=volume_version, service_type=volume_service_type) }}
volumes:
size: 1
volumes_per_tenant: 4
@@ -159,6 +185,8 @@
{% call user_context(tenants_amount, users_amount, use_existing_users) %}
quotas:
{{ unlimited_volumes() }}
+ api_versions:
+ {{ volume_service(version=volume_version, service_type=volume_service_type) }}
{{ volumes() }}
{% endcall %}
runner:
@@ -176,6 +204,8 @@
{% call user_context(tenants_amount, users_amount, use_existing_users) %}
quotas:
{{ unlimited_volumes() }}
+ api_versions:
+ {{ volume_service(version=volume_version, service_type=volume_service_type) }}
{% endcall %}
runner:
{{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
@@ -188,6 +218,8 @@
{% call user_context(tenants_amount, users_amount, use_existing_users) %}
quotas:
{{ unlimited_volumes() }}
+ api_versions:
+ {{ volume_service(version=volume_version, service_type=volume_service_type) }}
{% endcall %}
runner:
{{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
@@ -200,6 +232,8 @@
{% call user_context(tenants_amount, users_amount, use_existing_users) %}
quotas:
{{ unlimited_volumes() }}
+ api_versions:
+ {{ volume_service(version=volume_version, service_type=volume_service_type) }}
{% endcall %}
runner:
{{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
@@ -215,6 +249,8 @@
{% call user_context(tenants_amount, users_amount, use_existing_users) %}
quotas:
{{ unlimited_volumes() }}
+ api_versions:
+ {{ volume_service(version=volume_version, service_type=volume_service_type) }}
{% endcall %}
runner:
{{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
@@ -229,6 +265,8 @@
{% call user_context(tenants_amount, users_amount, use_existing_users) %}
quotas:
{{ unlimited_volumes() }}
+ api_versions:
+ {{ volume_service(version=volume_version, service_type=volume_service_type) }}
{{ volumes() }}
{% endcall %}
runner:
@@ -244,6 +282,8 @@
read_iops_sec: "1000"
context:
{{ user_context(tenants_amount, users_amount, use_existing_users) }}
+ api_versions:
+ {{ volume_service(version=volume_version, service_type=volume_service_type) }}
runner:
{{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
sla:
@@ -257,6 +297,8 @@
read_iops_sec: "1000"
context:
{{ user_context(tenants_amount, users_amount, use_existing_users) }}
+ api_versions:
+ {{ volume_service(version=volume_version, service_type=volume_service_type) }}
runner:
{{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
sla:
@@ -273,6 +315,8 @@
set_read_iops_sec: "1001"
context:
{{ user_context(tenants_amount, users_amount, use_existing_users) }}
+ api_versions:
+ {{ volume_service(version=volume_version, service_type=volume_service_type) }}
runner:
{{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
sla:
@@ -284,6 +328,8 @@
description: "rally tests creating types"
context:
{{ user_context(tenants_amount, users_amount, use_existing_users) }}
+ api_versions:
+ {{ volume_service(version=volume_version, service_type=volume_service_type) }}
runner:
{{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
sla:
@@ -295,18 +341,8 @@
description: "rally tests creating types"
context:
{{ user_context(tenants_amount, users_amount, use_existing_users) }}
- runner:
- {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
- sla:
- {{ no_failures_sla() }}
-
- CinderVolumeTypes.create_and_update_volume_type:
- -
- args:
- description: "test"
- update_description: "test update"
- context:
- {{ user_context(tenants_amount, users_amount, use_existing_users) }}
+ api_versions:
+ {{ volume_service(version=volume_version, service_type=volume_service_type) }}
runner:
{{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
sla:
@@ -322,17 +358,8 @@
control_location: "front-end"
context:
{{ user_context(tenants_amount, users_amount, use_existing_users) }}
- runner:
- {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
- sla:
- {{ no_failures_sla() }}
-
- CinderVolumeTypes.create_volume_type_add_and_list_type_access:
- -
- args:
- description: "rally tests creating types"
- context:
- {{ user_context(tenants_amount, users_amount, use_existing_users) }}
+ api_versions:
+ {{ volume_service(version=volume_version, service_type=volume_service_type) }}
runner:
{{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
sla:
diff --git a/functest/opnfv_tests/openstack/rally/scenario/full/opnfv-glance.yaml b/functest/opnfv_tests/openstack/rally/scenario/full/opnfv-glance.yaml
index dfc1fc156..993b83ff7 100644
--- a/functest/opnfv_tests/openstack/rally/scenario/full/opnfv-glance.yaml
+++ b/functest/opnfv_tests/openstack/rally/scenario/full/opnfv-glance.yaml
@@ -36,8 +36,9 @@
flavor:
name: {{ flavor_name }}
number_instances: 2
- nics:
- - net-id: {{ netid }}
+ boot_server_kwargs:
+ nics:
+ - net-id: {{ netid }}
context:
{{ user_context(tenants_amount, users_amount, use_existing_users) }}
quotas:
diff --git a/functest/opnfv_tests/openstack/rally/scenario/full/opnfv-gnocchi.yaml b/functest/opnfv_tests/openstack/rally/scenario/full/opnfv-gnocchi.yaml
new file mode 100644
index 000000000..b4487daa0
--- /dev/null
+++ b/functest/opnfv_tests/openstack/rally/scenario/full/opnfv-gnocchi.yaml
@@ -0,0 +1,181 @@
+ Gnocchi.list_capabilities:
+ -
+ context:
+ {{ user_context(tenants_amount, users_amount, use_existing_users) }}
+ runner:
+ {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
+ sla:
+ {{ no_failures_sla() }}
+
+ Gnocchi.get_status:
+ -
+ args:
+ detailed: false
+ context:
+ {{ user_context(tenants_amount, users_amount, use_existing_users) }}
+ runner:
+ {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
+ sla:
+ {{ no_failures_sla() }}
+
+ GnocchiArchivePolicyRule.list_archive_policy_rule:
+ -
+ context:
+ {{ user_context(tenants_amount, users_amount, use_existing_users) }}
+ runner:
+ {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
+ sla:
+ {{ no_failures_sla() }}
+
+ GnocchiArchivePolicyRule.create_archive_policy_rule:
+ -
+ args:
+ metric_pattern: "cpu_*"
+ archive_policy_name: "low"
+ context:
+ {{ user_context(tenants_amount, users_amount, use_existing_users) }}
+ runner:
+ {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
+ sla:
+ {{ no_failures_sla() }}
+
+ GnocchiArchivePolicyRule.create_delete_archive_policy_rule:
+ -
+ args:
+ metric_pattern: "cpu_*"
+ archive_policy_name: "low"
+ context:
+ {{ user_context(tenants_amount, users_amount, use_existing_users) }}
+ runner:
+ {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
+ sla:
+ {{ no_failures_sla() }}
+
+ GnocchiArchivePolicy.list_archive_policy:
+ -
+ context:
+ {{ user_context(tenants_amount, users_amount, use_existing_users) }}
+ runner:
+ {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
+ sla:
+ {{ no_failures_sla() }}
+
+ GnocchiArchivePolicy.create_archive_policy:
+ -
+ args:
+ definition:
+ - granularity: "0:00:01"
+ timespan: "1:00:00"
+ context:
+ {{ user_context(tenants_amount, users_amount, use_existing_users) }}
+ runner:
+ {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
+ sla:
+ {{ no_failures_sla() }}
+
+ GnocchiArchivePolicy.create_delete_archive_policy:
+ -
+ args:
+ definition:
+ - granularity: "0:00:01"
+ timespan: "1:00:00"
+ context:
+ {{ user_context(tenants_amount, users_amount, use_existing_users) }}
+ runner:
+ {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
+ sla:
+ {{ no_failures_sla() }}
+
+ GnocchiResourceType.list_resource_type:
+ -
+ context:
+ {{ user_context(tenants_amount, users_amount, use_existing_users) }}
+ runner:
+ {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
+ sla:
+ {{ no_failures_sla() }}
+
+ GnocchiResourceType.create_resource_type:
+ -
+ args:
+ attributes:
+ foo:
+ required: false
+ type: "string"
+ bar:
+ required: true
+ type: "number"
+ context:
+ {{ user_context(tenants_amount, users_amount, use_existing_users) }}
+ runner:
+ {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
+ sla:
+ {{ no_failures_sla() }}
+
+ GnocchiResourceType.create_delete_resource_type:
+ -
+ args:
+ attributes:
+ foo:
+ required: false
+ type: "string"
+ bar:
+ required: true
+ type: "number"
+ context:
+ {{ user_context(tenants_amount, users_amount, use_existing_users) }}
+ runner:
+ {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
+ sla:
+ {{ no_failures_sla() }}
+
+ GnocchiMetric.list_metric:
+ -
+ args:
+ limit: 10000
+ context:
+ {{ user_context(tenants_amount, users_amount, use_existing_users) }}
+ runner:
+ {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
+ sla:
+ {{ no_failures_sla() }}
+
+ GnocchiMetric.create_metric:
+ -
+ args:
+ archive_policy_name: "low"
+ context:
+ {{ user_context(tenants_amount, users_amount, use_existing_users) }}
+ runner:
+ {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
+ sla:
+ {{ no_failures_sla() }}
+
+ GnocchiMetric.create_delete_metric:
+ -
+ args:
+ archive_policy_name: "low"
+ context:
+ {{ user_context(tenants_amount, users_amount, use_existing_users) }}
+ runner:
+ {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
+ sla:
+ {{ no_failures_sla() }}
+
+ GnocchiResource.create_resource:
+ -
+ context:
+ {{ user_context(tenants_amount, users_amount, use_existing_users) }}
+ runner:
+ {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
+ sla:
+ {{ no_failures_sla() }}
+
+ GnocchiResource.create_delete_resource:
+ -
+ context:
+ {{ user_context(tenants_amount, users_amount, use_existing_users) }}
+ runner:
+ {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
+ sla:
+ {{ no_failures_sla() }}
diff --git a/functest/opnfv_tests/openstack/rally/scenario/full/opnfv-neutron.yaml b/functest/opnfv_tests/openstack/rally/scenario/full/opnfv-neutron.yaml
index 2951e953a..b2248d499 100644
--- a/functest/opnfv_tests/openstack/rally/scenario/full/opnfv-neutron.yaml
+++ b/functest/opnfv_tests/openstack/rally/scenario/full/opnfv-neutron.yaml
@@ -27,7 +27,8 @@
ports_per_network: 1
context:
{% call user_context(tenants_amount, users_amount, use_existing_users) %}
- network: {}
+ network:
+ router: {}
quotas:
neutron:
network: -1
@@ -50,7 +51,6 @@
subnets_per_network: 1
context:
{% call user_context(tenants_amount, users_amount, use_existing_users) %}
- network: {}
quotas:
neutron:
network: -1
@@ -74,7 +74,6 @@
subnets_per_network: 1
context:
{% call user_context(tenants_amount, users_amount, use_existing_users) %}
- network: {}
quotas:
neutron:
network: -1
@@ -108,7 +107,8 @@
ports_per_network: 1
context:
{% call user_context(tenants_amount, users_amount, use_existing_users) %}
- network: {}
+ network:
+ router: {}
quotas:
neutron:
network: -1
@@ -129,7 +129,6 @@
subnets_per_network: 1
context:
{% call user_context(tenants_amount, users_amount, use_existing_users) %}
- network: {}
quotas:
neutron:
network: -1
@@ -151,7 +150,6 @@
subnets_per_network: 1
context:
{% call user_context(tenants_amount, users_amount, use_existing_users) %}
- network: {}
quotas:
neutron:
network: -1
@@ -185,7 +183,8 @@
ports_per_network: 1
context:
{% call user_context(tenants_amount, users_amount, use_existing_users) %}
- network: {}
+ network:
+ router: {}
quotas:
neutron:
network: -1
@@ -206,7 +205,6 @@
subnets_per_network: 1
context:
{% call user_context(tenants_amount, users_amount, use_existing_users) %}
- network: {}
quotas:
neutron:
network: -1
@@ -227,7 +225,6 @@
subnets_per_network: 1
context:
{% call user_context(tenants_amount, users_amount, use_existing_users) %}
- network: {}
quotas:
neutron:
network: -1
@@ -315,7 +312,8 @@
ports_per_network: 2
context:
{% call user_context(tenants_amount, users_amount, use_existing_users) %}
- network: {}
+ network:
+ router: {}
quotas:
neutron:
network: -1
@@ -332,7 +330,6 @@
subnets_per_network: 2
context:
{% call user_context(tenants_amount, users_amount, use_existing_users) %}
- network: {}
quotas:
neutron:
network: -1
@@ -350,7 +347,8 @@
subnets_per_network: 2
context:
{% call user_context(tenants_amount, users_amount, use_existing_users) %}
- network: {}
+ network:
+ router: {}
quotas:
neutron:
network: -1
diff --git a/functest/opnfv_tests/openstack/rally/scenario/full/opnfv-nova.yaml b/functest/opnfv_tests/openstack/rally/scenario/full/opnfv-nova.yaml
index 512448fd4..210591f9b 100644
--- a/functest/opnfv_tests/openstack/rally/scenario/full/opnfv-nova.yaml
+++ b/functest/opnfv_tests/openstack/rally/scenario/full/opnfv-nova.yaml
@@ -39,9 +39,6 @@
- net-id: {{ netid }}
context:
{% call user_context(tenants_amount, users_amount, use_existing_users) %}
- network:
- networks_per_tenant: 1
- start_cidr: "100.1.0.0/25"
quotas:
{{ unlimited_neutron() }}
{{ unlimited_nova() }}
@@ -59,9 +56,6 @@
- net-id: {{ netid }}
context:
{% call user_context(tenants_amount, users_amount, use_existing_users) %}
- network:
- networks_per_tenant: 1
- start_cidr: "100.1.0.0/25"
quotas:
{{ unlimited_neutron() }}
{{ unlimited_nova() }}
@@ -80,9 +74,6 @@
- net-id: {{ netid }}
context:
{% call user_context(tenants_amount, users_amount, use_existing_users) %}
- network:
- networks_per_tenant: 1
- start_cidr: "100.1.0.0/25"
quotas:
{{ unlimited_neutron() }}
{{ unlimited_nova() }}
@@ -104,9 +95,6 @@
- net-id: {{ netid }}
context:
{% call user_context(tenants_amount, users_amount, use_existing_users) %}
- network:
- networks_per_tenant: 1
- start_cidr: "100.1.0.0/25"
quotas:
{{ unlimited_neutron() }}
{{ unlimited_nova() }}
@@ -124,9 +112,6 @@
- net-id: {{ netid }}
context:
{% call user_context(tenants_amount, users_amount, use_existing_users) %}
- network:
- networks_per_tenant: 1
- start_cidr: "100.1.0.0/25"
quotas:
{{ unlimited_neutron() }}
{{ unlimited_nova() }}
@@ -140,11 +125,13 @@
-
args:
{{ vm_params(image_name, flavor_name) }}
- volume_size: 10
+ volume_size: 1
nics:
- net-id: {{ netid }}
context:
{{ user_context(tenants_amount, users_amount, use_existing_users) }}
+ api_versions:
+ {{ volume_service(version=volume_version, service_type=volume_service_type) }}
runner:
{{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
sla:
@@ -200,7 +187,7 @@
NovaServers.boot_and_live_migrate_server:
- args:
{{ vm_params(image_name, flavor_name) }}
- block_migration: false
+ block_migration: {{ block_migration }}
nics:
- net-id: {{ netid }}
context:
@@ -214,13 +201,15 @@
-
args:
{{ vm_params(image_name, flavor_name) }}
- size: 10
- block_migration: false
+ size: 1
+ block_migration: {{ block_migration }}
boot_server_kwargs:
nics:
- net-id: {{ netid }}
context:
{{ user_context(tenants_amount, users_amount, use_existing_users) }}
+ api_versions:
+ {{ volume_service(version=volume_version, service_type=volume_service_type) }}
runner:
{{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
sla:
@@ -229,13 +218,15 @@
NovaServers.boot_server_from_volume_and_live_migrate:
- args:
{{ vm_params(image_name, flavor_name) }}
- block_migration: false
- volume_size: 10
+ block_migration: {{ block_migration }}
+ volume_size: 1
force_delete: false
nics:
- net-id: {{ netid }}
context:
{{ user_context(tenants_amount, users_amount, use_existing_users) }}
+ api_versions:
+ {{ volume_service(version=volume_version, service_type=volume_service_type) }}
runner:
{{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
sla:
@@ -245,14 +236,11 @@
-
args:
{{ vm_params(image_name, flavor_name) }}
- server_kwargs:
+ boot_server_kwargs:
nics:
- net-id: {{ netid }}
context:
{% call user_context(tenants_amount, users_amount, use_existing_users) %}
- network:
- networks_per_tenant: 1
- start_cidr: "100.1.0.0/25"
quotas:
{{ unlimited_neutron() }}
{{ unlimited_nova(keypairs=true) }}
@@ -266,18 +254,17 @@
-
args:
{{ vm_params(image_name, flavor_name) }}
- volume_size: 5
+ volume_size: 1
nics:
- net-id: {{ netid }}
context:
{% call user_context(tenants_amount, users_amount, use_existing_users) %}
- network:
- networks_per_tenant: 1
- start_cidr: "100.1.0.0/25"
quotas:
{{ unlimited_volumes() }}
{{ unlimited_neutron() }}
{{ unlimited_nova() }}
+ api_versions:
+ {{ volume_service(version=volume_version, service_type=volume_service_type) }}
{% endcall %}
runner:
{{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
@@ -293,9 +280,6 @@
- net-id: {{ netid }}
context:
{% call user_context(tenants_amount, users_amount, use_existing_users) %}
- network:
- networks_per_tenant: 1
- start_cidr: "100.1.0.0/25"
quotas:
{{ unlimited_neutron() }}
{{ unlimited_nova() }}
@@ -375,6 +359,40 @@
context:
{% call user_context(tenants_amount, users_amount, use_existing_users) %}
network: {}
+ api_versions:
+ {{ volume_service(version=volume_version, service_type=volume_service_type) }}
+ {% endcall %}
+ runner:
+ {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
+ sla:
+ {{ no_failures_sla() }}
+
+ NovaServers.boot_server_associate_and_dissociate_floating_ip:
+ -
+ args:
+ {{ vm_params(image_name, flavor_name) }}
+ floating_network: {{ floating_network }}
+ nics:
+ - net-id: {{ netid }}
+ context:
+ {% call user_context(tenants_amount, users_amount, use_existing_users) %}
+ network: {}
+ {% endcall %}
+ runner:
+ {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
+ sla:
+ {{ no_failures_sla() }}
+
+ NovaServers.boot_and_associate_floating_ip:
+ -
+ args:
+ {{ vm_params(image_name, flavor_name) }}
+ floating_network: {{ floating_network }}
+ nics:
+ - net-id: {{ netid }}
+ context:
+ {% call user_context(tenants_amount, users_amount, use_existing_users) %}
+ network: {}
{% endcall %}
runner:
{{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
diff --git a/functest/opnfv_tests/openstack/rally/scenario/opnfv-barbican.yaml b/functest/opnfv_tests/openstack/rally/scenario/opnfv-barbican.yaml
new file mode 100644
index 000000000..9dd9ca271
--- /dev/null
+++ b/functest/opnfv_tests/openstack/rally/scenario/opnfv-barbican.yaml
@@ -0,0 +1,98 @@
+ BarbicanContainers.create_and_add:
+ -
+ runner:
+ {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
+ context:
+ {{ user_context(tenants_amount, users_amount, use_existing_users) }}
+ sla:
+ {{ no_failures_sla() }}
+
+ BarbicanContainers.create_certificate_and_delete:
+ -
+ runner:
+ {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
+ context:
+ {{ user_context(tenants_amount, users_amount, use_existing_users) }}
+ sla:
+ {{ no_failures_sla() }}
+
+ BarbicanContainers.create_and_delete:
+ -
+ runner:
+ {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
+ context:
+ {{ user_context(tenants_amount, users_amount, use_existing_users) }}
+ sla:
+ {{ no_failures_sla() }}
+
+ BarbicanContainers.create_rsa_and_delete:
+ -
+ runner:
+ {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
+ context:
+ {{ user_context(tenants_amount, users_amount, use_existing_users) }}
+ sla:
+ {{ no_failures_sla() }}
+
+ BarbicanSecrets.create_and_delete:
+ -
+ runner:
+ {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
+ context:
+ {{ user_context(tenants_amount, users_amount, use_existing_users) }}
+ sla:
+ {{ no_failures_sla() }}
+
+ BarbicanSecrets.create_and_get:
+ -
+ runner:
+ {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
+ context:
+ {{ user_context(tenants_amount, users_amount, use_existing_users) }}
+ sla:
+ {{ no_failures_sla() }}
+
+ BarbicanSecrets.create_and_list:
+ -
+ runner:
+ {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
+ context:
+ {{ user_context(tenants_amount, users_amount, use_existing_users) }}
+ sla:
+ {{ no_failures_sla() }}
+
+ BarbicanSecrets.create:
+ -
+ runner:
+ {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
+ context:
+ {{ user_context(tenants_amount, users_amount, use_existing_users) }}
+ sla:
+ {{ no_failures_sla() }}
+
+ BarbicanSecrets.get:
+ -
+ runner:
+ {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
+ context:
+ {{ user_context(tenants_amount, users_amount, use_existing_users) }}
+ sla:
+ {{ no_failures_sla() }}
+
+ BarbicanContainers.list:
+ -
+ runner:
+ {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
+ context:
+ {{ user_context(tenants_amount, users_amount, use_existing_users) }}
+ sla:
+ {{ no_failures_sla() }}
+
+ BarbicanSecrets.list:
+ -
+ runner:
+ {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
+ context:
+ {{ user_context(tenants_amount, users_amount, use_existing_users) }}
+ sla:
+ {{ no_failures_sla() }}
diff --git a/functest/opnfv_tests/openstack/rally/scenario/opnfv-quotas.yaml b/functest/opnfv_tests/openstack/rally/scenario/opnfv-quotas.yaml
index a0682acce..dcb007c50 100644
--- a/functest/opnfv_tests/openstack/rally/scenario/opnfv-quotas.yaml
+++ b/functest/opnfv_tests/openstack/rally/scenario/opnfv-quotas.yaml
@@ -4,6 +4,8 @@
max_quota: 1024
context:
{{ user_context(tenants_amount, users_amount, use_existing_users) }}
+ api_versions:
+ {{ volume_service(version=volume_version, service_type=volume_service_type) }}
runner:
{{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
sla:
@@ -15,6 +17,8 @@
max_quota: 1024
context:
{{ user_context(tenants_amount, users_amount, use_existing_users) }}
+ api_versions:
+ {{ volume_service(version=volume_version, service_type=volume_service_type) }}
runner:
{{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
sla:
@@ -31,17 +35,6 @@
sla:
{{ no_failures_sla() }}
- Quotas.nova_update_and_delete:
- -
- args:
- max_quota: 1024
- context:
- {{ user_context(tenants_amount, users_amount, use_existing_users) }}
- runner:
- {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
- sla:
- {{ no_failures_sla() }}
-
Quotas.nova_update:
-
args:
diff --git a/functest/opnfv_tests/openstack/rally/scenario/opnfv-swift.yaml b/functest/opnfv_tests/openstack/rally/scenario/opnfv-swift.yaml
new file mode 100644
index 000000000..66d7cd24d
--- /dev/null
+++ b/functest/opnfv_tests/openstack/rally/scenario/opnfv-swift.yaml
@@ -0,0 +1,71 @@
+ SwiftObjects.create_container_and_object_then_list_objects:
+ -
+ args:
+ objects_per_container: 2
+ object_size: 5120
+ runner:
+ {{ constant_runner(concurrency=1, times=iterations, is_smoke=smoke) }}
+ context:
+ {{ user_context(tenants_amount, users_amount, use_existing_users) }}
+ roles:
+ - "admin"
+ sla:
+ {{ no_failures_sla() }}
+
+ SwiftObjects.list_objects_in_containers:
+ -
+ runner:
+ {{ constant_runner(concurrency=1, times=iterations, is_smoke=smoke) }}
+ context:
+ {{ user_context(tenants_amount, users_amount, use_existing_users) }}
+ roles:
+ - "admin"
+ swift_objects:
+ containers_per_tenant: 1
+ objects_per_container: 10
+ object_size: 1024
+ sla:
+ {{ no_failures_sla() }}
+
+ SwiftObjects.create_container_and_object_then_download_object:
+ -
+ args:
+ objects_per_container: 5
+ object_size: 1024
+ runner:
+ {{ constant_runner(concurrency=1, times=iterations, is_smoke=smoke) }}
+ context:
+ {{ user_context(tenants_amount, users_amount, use_existing_users) }}
+ roles:
+ - "admin"
+ sla:
+ {{ no_failures_sla() }}
+
+ SwiftObjects.create_container_and_object_then_delete_all:
+ -
+ args:
+ objects_per_container: 5
+ object_size: 102400
+ runner:
+ {{ constant_runner(concurrency=1, times=iterations, is_smoke=smoke) }}
+ context:
+ {{ user_context(tenants_amount, users_amount, use_existing_users) }}
+ roles:
+ - "admin"
+ sla:
+ {{ no_failures_sla() }}
+
+ SwiftObjects.list_and_download_objects_in_containers:
+ -
+ runner:
+ {{ constant_runner(concurrency=1, times=iterations, is_smoke=smoke) }}
+ context:
+ {{ user_context(tenants_amount, users_amount, use_existing_users) }}
+ roles:
+ - "admin"
+ swift_objects:
+ containers_per_tenant: 1
+ objects_per_container: 5
+ object_size: 10240
+ sla:
+ {{ no_failures_sla() }}
diff --git a/functest/opnfv_tests/openstack/rally/scenario/opnfv-vm.yaml b/functest/opnfv_tests/openstack/rally/scenario/opnfv-vm.yaml
index 74f509925..3aa8ac8e5 100644
--- a/functest/opnfv_tests/openstack/rally/scenario/opnfv-vm.yaml
+++ b/functest/opnfv_tests/openstack/rally/scenario/opnfv-vm.yaml
@@ -1,42 +1,19 @@
- VMTasks.boot_runcommand_delete:
+ VMTasks.dd_load_test:
-
args:
- {{ vm_params(image_name, flavor_name) }}
- floating_network: {{ floating_network }}
- force_delete: false
- command:
- interpreter: /bin/sh
- script_file: {{ sup_dir }}/instance_dd_test.sh
- username: cirros
+ flavor:
+ name: {{ flavor_name }}
+ image:
+ name: {{ image_name }}
nics:
- net-id: {{ netid }}
- context:
- {% call user_context(tenants_amount, users_amount, use_existing_users) %}
- network: {}
- {% endcall %}
- runner:
- {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
- sla:
- {{ no_failures_sla() }}
-
- -
- args:
- {{ vm_params(image_name, flavor_name) }}
- fixed_network: private
floating_network: {{ floating_network }}
force_delete: false
- command:
- interpreter: /bin/sh
- script_file: {{ sup_dir }}/instance_dd_test.sh
- use_floatingip: true
- username: cirros
- nics:
- - net-id: {{ netid }}
- volume_args:
- size: 2
+ username: {{ username }}
+ runner:
+ {{ constant_runner(concurrency=1, times=iterations, is_smoke=smoke) }}
context:
{{ user_context(tenants_amount, users_amount, use_existing_users) }}
- runner:
- {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
+ network: {}
sla:
{{ no_failures_sla() }}
diff --git a/functest/opnfv_tests/openstack/rally/scenario/sanity/opnfv-ceilometer.yaml b/functest/opnfv_tests/openstack/rally/scenario/sanity/opnfv-ceilometer.yaml
deleted file mode 100644
index bb070cd3a..000000000
--- a/functest/opnfv_tests/openstack/rally/scenario/sanity/opnfv-ceilometer.yaml
+++ /dev/null
@@ -1,247 +0,0 @@
- CeilometerAlarms.create_alarm_and_get_history:
- -
- args:
- meter_name: "ram_util"
- threshold: 10.0
- type: "threshold"
- state: "ok"
- statistic: "avg"
- alarm_actions: ["http://localhost:8776/alarm"]
- ok_actions: ["http://localhost:8776/ok"]
- insufficient_data_actions: ["http://localhost:8776/notok"]
- runner:
- {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
- context:
- {{ user_context(tenants_amount, users_amount, use_existing_users) }}
- sla:
- {{ no_failures_sla() }}
-
- CeilometerAlarms.create_and_delete_alarm:
- -
- args:
- meter_name: "ram_util"
- threshold: 10.0
- type: "threshold"
- statistic: "avg"
- alarm_actions: ["http://localhost:8776/alarm"]
- ok_actions: ["http://localhost:8776/ok"]
- insufficient_data_actions: ["http://localhost:8776/notok"]
- runner:
- {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
- context:
- {{ user_context(tenants_amount, users_amount, use_existing_users) }}
- sla:
- {{ no_failures_sla() }}
-
- CeilometerAlarms.create_and_get_alarm:
- -
- args:
- meter_name: "ram_util"
- threshold: 10.0
- type: "threshold"
- statistic: "avg"
- alarm_actions: ["http://localhost:8776/alarm"]
- ok_actions: ["http://localhost:8776/ok"]
- insufficient_data_actions: ["http://localhost:8776/notok"]
- runner:
- {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
- context:
- {{ user_context(tenants_amount, users_amount, use_existing_users) }}
- sla:
- {{ no_failures_sla() }}
-
- CeilometerAlarms.create_and_list_alarm:
- -
- args:
- meter_name: "ram_util"
- threshold: 10.0
- type: "threshold"
- statistic: "avg"
- alarm_actions: ["http://localhost:8776/alarm"]
- ok_actions: ["http://localhost:8776/ok"]
- insufficient_data_actions: ["http://localhost:8776/notok"]
- runner:
- {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
- context:
- {{ user_context(tenants_amount, users_amount, use_existing_users) }}
- sla:
- {{ no_failures_sla() }}
-
- CeilometerQueries.create_and_query_alarm_history:
- -
- args:
- orderby: !!null
- limit: !!null
- meter_name: "ram_util"
- threshold: 10.0
- type: "threshold"
- statistic: "avg"
- alarm_actions: ["http://localhost:8776/alarm"]
- ok_actions: ["http://localhost:8776/ok"]
- insufficient_data_actions: ["http://localhost:8776/notok"]
- runner:
- {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
- context:
- {{ user_context(tenants_amount, users_amount, use_existing_users) }}
- sla:
- {{ no_failures_sla() }}
-
- CeilometerQueries.create_and_query_alarms:
- -
- args:
- filter: {"and": [{"!=": {"state": "dummy_state"}},{"=": {"type": "threshold"}}]}
- orderby: !!null
- limit: 10
- meter_name: "ram_util"
- threshold: 10.0
- type: "threshold"
- statistic: "avg"
- alarm_actions: ["http://localhost:8776/alarm"]
- ok_actions: ["http://localhost:8776/ok"]
- insufficient_data_actions: ["http://localhost:8776/notok"]
- runner:
- {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
- context:
- {{ user_context(tenants_amount, users_amount, use_existing_users) }}
- sla:
- {{ no_failures_sla() }}
-
- CeilometerQueries.create_and_query_samples:
- -
- args:
- filter: {"=": {"counter_unit": "instance"}}
- orderby: !!null
- limit: 10
- counter_name: "cpu_util"
- counter_type: "gauge"
- counter_unit: "instance"
- counter_volume: 1.0
- resource_id: "resource_id"
- runner:
- {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
- context:
- {{ user_context(tenants_amount, users_amount, use_existing_users) }}
- sla:
- {{ no_failures_sla() }}
-
- CeilometerAlarms.create_and_update_alarm:
- -
- args:
- meter_name: "ram_util"
- threshold: 10.0
- type: "threshold"
- statistic: "avg"
- alarm_actions: ["http://localhost:8776/alarm"]
- ok_actions: ["http://localhost:8776/ok"]
- insufficient_data_actions: ["http://localhost:8776/notok"]
- runner:
- {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
- context:
- {{ user_context(tenants_amount, users_amount, use_existing_users) }}
- sla:
- {{ no_failures_sla() }}
-
- CeilometerEvents.create_user_and_get_event:
- -
- runner:
- {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
- context:
- {{ user_context(tenants_amount, users_amount, use_existing_users) }}
- sla:
- {{ no_failures_sla() }}
-
- CeilometerEvents.create_user_and_list_events:
- -
- runner:
- {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
- context:
- {{ user_context(tenants_amount, users_amount, use_existing_users) }}
- sla:
- {{ no_failures_sla() }}
-
- CeilometerEvents.create_user_and_list_event_types:
- -
- runner:
- {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
- context:
- {{ user_context(tenants_amount, users_amount, use_existing_users) }}
- sla:
- {{ no_failures_sla() }}
-
- CeilometerTraits.create_user_and_list_trait_descriptions:
- -
- runner:
- {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
- context:
- {{ user_context(tenants_amount, users_amount, use_existing_users) }}
- sla:
- {{ no_failures_sla() }}
-
- CeilometerTraits.create_user_and_list_traits:
- -
- runner:
- {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
- context:
- {{ user_context(tenants_amount, users_amount, use_existing_users) }}
- sla:
- {{ no_failures_sla() }}
-
- CeilometerStats.get_stats:
- -
- runner:
- {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
- context:
- {% call user_context(tenants_amount, users_amount, use_existing_users) %}
- ceilometer:
- counter_name: "benchmark_meter"
- counter_type: "gauge"
- counter_unit: "%"
- counter_volume: 100
- resources_per_tenant: 100
- samples_per_resource: 100
- timestamp_interval: 10
- metadata_list:
- -
- status: "active"
- name: "rally benchmark on"
- deleted: "false"
- -
- status: "terminated"
- name: "rally benchmark off"
- deleted: "true"
- {% endcall %}
- args:
- meter_name: "benchmark_meter"
- filter_by_user_id: true
- filter_by_project_id: true
- filter_by_resource_id: true
- metadata_query:
- status: "terminated"
- period: 300
- groupby: "resource_id"
- sla:
- {{ no_failures_sla() }}
-
- CeilometerResource.get_tenant_resources:
- -
- runner:
- {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
- context:
- {% call user_context(tenants_amount, users_amount, use_existing_users) %}
- ceilometer:
- counter_name: "cpu_util"
- counter_type: "gauge"
- counter_volume: 1.0
- counter_unit: "instance"
- {% endcall %}
- sla:
- {{ no_failures_sla() }}
-
- CeilometerAlarms.list_alarms:
- -
- runner:
- {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
- context:
- {{ user_context(tenants_amount, users_amount, use_existing_users) }}
- sla:
- {{ no_failures_sla() }}
diff --git a/functest/opnfv_tests/openstack/rally/scenario/sanity/opnfv-cinder.yaml b/functest/opnfv_tests/openstack/rally/scenario/sanity/opnfv-cinder.yaml
index 832358075..f94a5a1a4 100644
--- a/functest/opnfv_tests/openstack/rally/scenario/sanity/opnfv-cinder.yaml
+++ b/functest/opnfv_tests/openstack/rally/scenario/sanity/opnfv-cinder.yaml
@@ -6,6 +6,8 @@
{% call user_context(tenants_amount, users_amount, use_existing_users) %}
quotas:
{{ unlimited_volumes() }}
+ api_versions:
+ {{ volume_service(version=volume_version, service_type=volume_service_type) }}
{{ volumes() }}
{% endcall %}
runner:
@@ -23,6 +25,8 @@
{% call user_context(tenants_amount, users_amount, use_existing_users) %}
quotas:
{{ unlimited_volumes() }}
+ api_versions:
+ {{ volume_service(version=volume_version, service_type=volume_service_type) }}
{% endcall %}
runner:
{{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
@@ -35,6 +39,8 @@
{% call user_context(tenants_amount, users_amount, use_existing_users) %}
quotas:
{{ unlimited_volumes() }}
+ api_versions:
+ {{ volume_service(version=volume_version, service_type=volume_service_type) }}
{% endcall %}
runner:
{{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
@@ -47,6 +53,8 @@
{% call user_context(tenants_amount, users_amount, use_existing_users) %}
quotas:
{{ unlimited_volumes() }}
+ api_versions:
+ {{ volume_service(version=volume_version, service_type=volume_service_type) }}
{% endcall %}
runner:
{{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
@@ -62,6 +70,8 @@
{% call user_context(tenants_amount, users_amount, use_existing_users) %}
quotas:
{{ unlimited_volumes() }}
+ api_versions:
+ {{ volume_service(version=volume_version, service_type=volume_service_type) }}
{% endcall %}
runner:
{{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
@@ -76,6 +86,8 @@
{% call user_context(tenants_amount, users_amount, use_existing_users) %}
quotas:
{{ unlimited_volumes() }}
+ api_versions:
+ {{ volume_service(version=volume_version, service_type=volume_service_type) }}
{{ volumes() }}
{% endcall %}
runner:
@@ -91,6 +103,8 @@
read_iops_sec: "1000"
context:
{{ user_context(tenants_amount, users_amount, use_existing_users) }}
+ api_versions:
+ {{ volume_service(version=volume_version, service_type=volume_service_type) }}
runner:
{{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
sla:
@@ -107,6 +121,8 @@
set_read_iops_sec: "1001"
context:
{{ user_context(tenants_amount, users_amount, use_existing_users) }}
+ api_versions:
+ {{ volume_service(version=volume_version, service_type=volume_service_type) }}
runner:
{{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
sla:
@@ -118,6 +134,8 @@
description: "rally tests creating types"
context:
{{ user_context(tenants_amount, users_amount, use_existing_users) }}
+ api_versions:
+ {{ volume_service(version=volume_version, service_type=volume_service_type) }}
runner:
{{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
sla:
@@ -133,6 +151,8 @@
control_location: "front-end"
context:
{{ user_context(tenants_amount, users_amount, use_existing_users) }}
+ api_versions:
+ {{ volume_service(version=volume_version, service_type=volume_service_type) }}
runner:
{{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
sla:
diff --git a/functest/opnfv_tests/openstack/rally/scenario/sanity/opnfv-glance.yaml b/functest/opnfv_tests/openstack/rally/scenario/sanity/opnfv-glance.yaml
index 1b61762f9..279e81439 100644
--- a/functest/opnfv_tests/openstack/rally/scenario/sanity/opnfv-glance.yaml
+++ b/functest/opnfv_tests/openstack/rally/scenario/sanity/opnfv-glance.yaml
@@ -36,8 +36,9 @@
flavor:
name: {{ flavor_name }}
number_instances: 2
- nics:
- - net-id: {{ netid }}
+ boot_server_kwargs:
+ nics:
+ - net-id: {{ netid }}
context:
{{ user_context(tenants_amount, users_amount, use_existing_users) }}
quotas:
diff --git a/functest/opnfv_tests/openstack/rally/scenario/sanity/opnfv-gnocchi.yaml b/functest/opnfv_tests/openstack/rally/scenario/sanity/opnfv-gnocchi.yaml
new file mode 100644
index 000000000..d99b15f81
--- /dev/null
+++ b/functest/opnfv_tests/openstack/rally/scenario/sanity/opnfv-gnocchi.yaml
@@ -0,0 +1,119 @@
+ Gnocchi.list_capabilities:
+ -
+ context:
+ {{ user_context(tenants_amount, users_amount, use_existing_users) }}
+ runner:
+ {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
+ sla:
+ {{ no_failures_sla() }}
+
+ Gnocchi.get_status:
+ -
+ args:
+ detailed: false
+ context:
+ {{ user_context(tenants_amount, users_amount, use_existing_users) }}
+ runner:
+ {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
+ sla:
+ {{ no_failures_sla() }}
+
+ GnocchiArchivePolicyRule.list_archive_policy_rule:
+ -
+ context:
+ {{ user_context(tenants_amount, users_amount, use_existing_users) }}
+ runner:
+ {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
+ sla:
+ {{ no_failures_sla() }}
+
+ GnocchiArchivePolicyRule.create_delete_archive_policy_rule:
+ -
+ args:
+ metric_pattern: "cpu_*"
+ archive_policy_name: "low"
+ context:
+ {{ user_context(tenants_amount, users_amount, use_existing_users) }}
+ runner:
+ {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
+ sla:
+ {{ no_failures_sla() }}
+
+ GnocchiArchivePolicy.list_archive_policy:
+ -
+ context:
+ {{ user_context(tenants_amount, users_amount, use_existing_users) }}
+ runner:
+ {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
+ sla:
+ {{ no_failures_sla() }}
+
+ GnocchiArchivePolicy.create_delete_archive_policy:
+ -
+ args:
+ definition:
+ - granularity: "0:00:01"
+ timespan: "1:00:00"
+ context:
+ {{ user_context(tenants_amount, users_amount, use_existing_users) }}
+ runner:
+ {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
+ sla:
+ {{ no_failures_sla() }}
+
+ GnocchiResourceType.list_resource_type:
+ -
+ context:
+ {{ user_context(tenants_amount, users_amount, use_existing_users) }}
+ runner:
+ {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
+ sla:
+ {{ no_failures_sla() }}
+
+ GnocchiResourceType.create_delete_resource_type:
+ -
+ args:
+ attributes:
+ foo:
+ required: false
+ type: "string"
+ bar:
+ required: true
+ type: "number"
+ context:
+ {{ user_context(tenants_amount, users_amount, use_existing_users) }}
+ runner:
+ {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
+ sla:
+ {{ no_failures_sla() }}
+
+ GnocchiMetric.list_metric:
+ -
+ args:
+ limit: 10000
+ context:
+ {{ user_context(tenants_amount, users_amount, use_existing_users) }}
+ runner:
+ {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
+ sla:
+ {{ no_failures_sla() }}
+
+ GnocchiMetric.create_delete_metric:
+ -
+ args:
+ archive_policy_name: "low"
+ context:
+ {{ user_context(tenants_amount, users_amount, use_existing_users) }}
+ runner:
+ {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
+ sla:
+ {{ no_failures_sla() }}
+
+ GnocchiResource.create_delete_resource:
+ -
+ context:
+ {{ user_context(tenants_amount, users_amount, use_existing_users) }}
+ runner:
+ {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
+ sla:
+ {{ no_failures_sla() }}
diff --git a/functest/opnfv_tests/openstack/rally/scenario/sanity/opnfv-neutron.yaml b/functest/opnfv_tests/openstack/rally/scenario/sanity/opnfv-neutron.yaml
index da99a48b5..3eb7652c0 100644
--- a/functest/opnfv_tests/openstack/rally/scenario/sanity/opnfv-neutron.yaml
+++ b/functest/opnfv_tests/openstack/rally/scenario/sanity/opnfv-neutron.yaml
@@ -21,7 +21,8 @@
ports_per_network: 1
context:
{% call user_context(tenants_amount, users_amount, use_existing_users) %}
- network: {}
+ network:
+ router: {}
quotas:
neutron:
network: -1
@@ -42,7 +43,6 @@
subnets_per_network: 1
context:
{% call user_context(tenants_amount, users_amount, use_existing_users) %}
- network: {}
quotas:
neutron:
network: -1
@@ -64,7 +64,8 @@
subnets_per_network: 1
context:
{% call user_context(tenants_amount, users_amount, use_existing_users) %}
- network: {}
+ network:
+ router: {}
quotas:
neutron:
network: -1
@@ -98,7 +99,8 @@
ports_per_network: 1
context:
{% call user_context(tenants_amount, users_amount, use_existing_users) %}
- network: {}
+ network:
+ router: {}
quotas:
neutron:
network: -1
@@ -119,7 +121,6 @@
subnets_per_network: 1
context:
{% call user_context(tenants_amount, users_amount, use_existing_users) %}
- network: {}
quotas:
neutron:
network: -1
@@ -140,7 +141,6 @@
subnets_per_network: 1
context:
{% call user_context(tenants_amount, users_amount, use_existing_users) %}
- network: {}
quotas:
neutron:
network: -1
diff --git a/functest/opnfv_tests/openstack/rally/scenario/sanity/opnfv-nova.yaml b/functest/opnfv_tests/openstack/rally/scenario/sanity/opnfv-nova.yaml
index 801938c4e..1fbfccb5a 100644
--- a/functest/opnfv_tests/openstack/rally/scenario/sanity/opnfv-nova.yaml
+++ b/functest/opnfv_tests/openstack/rally/scenario/sanity/opnfv-nova.yaml
@@ -1,7 +1,7 @@
NovaServers.boot_and_live_migrate_server:
- args:
{{ vm_params(image_name, flavor_name) }}
- block_migration: false
+ block_migration: {{ block_migration }}
nics:
- net-id: {{ netid }}
context:
@@ -15,13 +15,15 @@
-
args:
{{ vm_params(image_name, flavor_name) }}
- size: 10
- block_migration: false
+ size: 1
+ block_migration: {{ block_migration }}
boot_server_kwargs:
nics:
- net-id: {{ netid }}
context:
{{ user_context(tenants_amount, users_amount, use_existing_users) }}
+ api_versions:
+ {{ volume_service(version=volume_version, service_type=volume_service_type) }}
runner:
{{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
sla:
@@ -30,13 +32,15 @@
NovaServers.boot_server_from_volume_and_live_migrate:
- args:
{{ vm_params(image_name, flavor_name) }}
- block_migration: false
- volume_size: 10
+ block_migration: {{ block_migration }}
+ volume_size: 1
force_delete: false
nics:
- net-id: {{ netid }}
context:
{{ user_context(tenants_amount, users_amount, use_existing_users) }}
+ api_versions:
+ {{ volume_service(version=volume_version, service_type=volume_service_type) }}
runner:
{{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
sla:
@@ -46,14 +50,11 @@
-
args:
{{ vm_params(image_name, flavor_name) }}
- server_kwargs:
+ boot_server_kwargs:
nics:
- net-id: {{ netid }}
context:
{% call user_context(tenants_amount, users_amount, use_existing_users) %}
- network:
- networks_per_tenant: 1
- start_cidr: "100.1.0.0/25"
quotas:
{{ unlimited_neutron() }}
{{ unlimited_nova(keypairs=true) }}
@@ -67,18 +68,17 @@
-
args:
{{ vm_params(image_name, flavor_name) }}
- volume_size: 5
+ volume_size: 1
nics:
- net-id: {{ netid }}
context:
{% call user_context(tenants_amount, users_amount, use_existing_users) %}
- network:
- networks_per_tenant: 1
- start_cidr: "100.1.0.0/25"
quotas:
{{ unlimited_volumes() }}
{{ unlimited_neutron() }}
{{ unlimited_nova() }}
+ api_versions:
+ {{ volume_service(version=volume_version, service_type=volume_service_type) }}
{% endcall %}
runner:
{{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
@@ -94,9 +94,6 @@
- net-id: {{ netid }}
context:
{% call user_context(tenants_amount, users_amount, use_existing_users) %}
- network:
- networks_per_tenant: 1
- start_cidr: "100.1.0.0/25"
quotas:
{{ unlimited_neutron() }}
{{ unlimited_nova() }}
@@ -122,7 +119,24 @@
-
args:
{{ vm_params(image_name, flavor_name) }}
- auto_assign_nic: true
+ nics:
+ - net-id: {{ netid }}
+ context:
+ {% call user_context(tenants_amount, users_amount, use_existing_users) %}
+ network: {}
+ {% endcall %}
+ runner:
+ {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
+ sla:
+ {{ no_failures_sla() }}
+
+ NovaServers.boot_server_associate_and_dissociate_floating_ip:
+ -
+ args:
+ {{ vm_params(image_name, flavor_name) }}
+ floating_network: {{ floating_network }}
+ nics:
+ - net-id: {{ netid }}
context:
{% call user_context(tenants_amount, users_amount, use_existing_users) %}
network: {}
diff --git a/functest/opnfv_tests/openstack/rally/scenario/support/instance_dd_test.sh b/functest/opnfv_tests/openstack/rally/scenario/support/instance_dd_test.sh
deleted file mode 100644
index e3bf23405..000000000
--- a/functest/opnfv_tests/openstack/rally/scenario/support/instance_dd_test.sh
+++ /dev/null
@@ -1,13 +0,0 @@
-#!/bin/sh
-time_seconds(){ (time -p $1 ) 2>&1 |awk '/real/{print $2}'; }
-file=/tmp/test.img
-c=${1:-$SIZE}
-c=${c:-1000} #default is 1GB
-write_seq=$(time_seconds "dd if=/dev/zero of=$file bs=1M count=$c")
-read_seq=$(time_seconds "dd if=$file of=/dev/null bs=1M count=$c")
-[ -f $file ] && rm $file
-
-echo "{
- \"write_seq_${c}m\": $write_seq,
- \"read_seq_${c}m\": $read_seq
- }"
diff --git a/functest/opnfv_tests/openstack/rally/scenario/templates/server_with_ports.yaml.template b/functest/opnfv_tests/openstack/rally/scenario/templates/server_with_ports.yaml.template
index 35b107838..75afb2dbe 100644
--- a/functest/opnfv_tests/openstack/rally/scenario/templates/server_with_ports.yaml.template
+++ b/functest/opnfv_tests/openstack/rally/scenario/templates/server_with_ports.yaml.template
@@ -7,7 +7,7 @@ parameters:
default: public
image:
type: string
- default: cirros-0.4.0-x86_64-uec
+ default: cirros-0.6.1-x86_64-uec
flavor:
type: string
default: m1.tiny
diff --git a/functest/opnfv_tests/openstack/rally/scenario/templates/server_with_volume.yaml.template b/functest/opnfv_tests/openstack/rally/scenario/templates/server_with_volume.yaml.template
index 5c9a86b79..9a0f1aa72 100644
--- a/functest/opnfv_tests/openstack/rally/scenario/templates/server_with_volume.yaml.template
+++ b/functest/opnfv_tests/openstack/rally/scenario/templates/server_with_volume.yaml.template
@@ -4,7 +4,7 @@ parameters:
# set all correct defaults for parameters before launch test
image:
type: string
- default: cirros-0.4.0-x86_64-uec
+ default: cirros-0.5.1-x86_64-uec
flavor:
type: string
default: m1.tiny
diff --git a/functest/opnfv_tests/openstack/rally/task.yaml b/functest/opnfv_tests/openstack/rally/task.yaml
index 65f101fbe..649c04557 100644
--- a/functest/opnfv_tests/openstack/rally/task.yaml
+++ b/functest/opnfv_tests/openstack/rally/task.yaml
@@ -4,7 +4,7 @@
{%- endif %}
{%- from "macro/macro.yaml" import user_context, vm_params, unlimited_volumes, constant_runner, rps_runner, no_failures_sla -%}
-{%- from "macro/macro.yaml" import volumes, unlimited_nova, unlimited_neutron, glance_args -%}
+{%- from "macro/macro.yaml" import volumes, unlimited_nova, unlimited_neutron, glance_args, volume_service -%}
---
{% if "authenticate" in service_list %}
@@ -15,6 +15,10 @@
{%- include "var/opnfv-cinder.yaml"-%}
{% endif %}
+{% if "gnocchi" in service_list %}
+{%- include "var/opnfv-gnocchi.yaml"-%}
+{% endif %}
+
{% if "keystone" in service_list %}
{%- include "var/opnfv-keystone.yaml"-%}
{% endif %}
@@ -31,10 +35,6 @@
{%- include "var/opnfv-neutron.yaml"-%}
{% endif %}
-{% if "ceilometer" in service_list %}
-{%- include "var/opnfv-ceilometer.yaml"-%}
-{% endif %}
-
{% if "quotas" in service_list %}
{%- include "var/opnfv-quotas.yaml"-%}
{% endif %}
@@ -43,6 +43,14 @@
{%- include "var/opnfv-heat.yaml"-%}
{% endif %}
+{% if "swift" in service_list %}
+{%- include "var/opnfv-swift.yaml"-%}
+{% endif %}
+
+{% if "barbican" in service_list %}
+{%- include "var/opnfv-barbican.yaml"-%}
+{% endif %}
+
{% if "vm" in service_list %}
{%- include "var/opnfv-vm.yaml"-%}
{% endif %}
diff --git a/functest/api/resources/__init__.py b/functest/opnfv_tests/openstack/refstack/__init__.py
index e69de29bb..e69de29bb 100644
--- a/functest/api/resources/__init__.py
+++ b/functest/opnfv_tests/openstack/refstack/__init__.py
diff --git a/functest/opnfv_tests/openstack/refstack/refstack.py b/functest/opnfv_tests/openstack/refstack/refstack.py
new file mode 100644
index 000000000..87932020b
--- /dev/null
+++ b/functest/opnfv_tests/openstack/refstack/refstack.py
@@ -0,0 +1,81 @@
+#!/usr/bin/env python
+
+# Copyright (c) 2017 Huawei Technologies Co.,Ltd and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+
+"""Refstack testcase implementation."""
+
+import logging
+import os
+import re
+import subprocess
+import yaml
+
+from functest.opnfv_tests.openstack.tempest import tempest
+from functest.utils import config
+
+
+class Refstack(tempest.TempestCommon):
+ """Refstack testcase implementation class."""
+
+ __logger = logging.getLogger(__name__)
+
+ def _extract_refstack_data(self, refstack_list):
+ yaml_data = ""
+ with open(refstack_list, encoding='utf-8') as def_file:
+ for line in def_file:
+ try:
+ grp = re.search(r'^([^\[]*)(\[.*\])\n*$', line)
+ yaml_data = f"{yaml_data}\n{grp.group(1)}: {grp.group(2)}"
+ except Exception: # pylint: disable=broad-except
+ self.__logger.warning("Cannot parse %s", line)
+ return yaml.full_load(yaml_data)
+
+ def _extract_tempest_data(self):
+ olddir = os.getcwd()
+ try:
+ os.chdir(self.verifier_repo_dir)
+ cmd = ['stestr', 'list', '^tempest.']
+ output = subprocess.check_output(cmd)
+ except subprocess.CalledProcessError as cpe:
+ self.__logger.error(
+ "Exception when listing tempest tests: %s\n%s",
+ cpe.cmd, cpe.output.decode("utf-8"))
+ raise
+ finally:
+ os.chdir(olddir)
+ yaml_data2 = ""
+ for line in output.splitlines():
+ try:
+ grp = re.search(r'^([^\[]*)(\[.*\])\n*$', line.decode("utf-8"))
+ yaml_data2 = f"{yaml_data2}\n{grp.group(1)}: {grp.group(2)}"
+ except Exception: # pylint: disable=broad-except
+ self.__logger.warning("Cannot parse %s. skipping it", line)
+ return yaml.full_load(yaml_data2)
+
+ def generate_test_list(self, **kwargs):
+ refstack_list = os.path.join(
+ getattr(config.CONF, 'dir_refstack_data'),
+ f"{kwargs.get('target', 'compute')}.txt")
+ self.backup_tempest_config(self.conf_file, '/etc')
+ refstack_data = self._extract_refstack_data(refstack_list)
+ tempest_data = self._extract_tempest_data()
+ with open(self.list, 'w', encoding='utf-8') as ref_file:
+ for key in refstack_data.keys():
+ try:
+ for data in tempest_data[key]:
+ if data == refstack_data[key][0]:
+ break
+ else:
+ self.__logger.info("%s: ids differ. skipping it", key)
+ continue
+ value = str(tempest_data[key]).replace(
+ "'", "").replace(", ", ",")
+ ref_file.write(f"{key}{value}\n")
+ except Exception: # pylint: disable=broad-except
+ self.__logger.info("%s: not found. skipping it", key)
+ continue
diff --git a/functest/opnfv_tests/openstack/refstack_client/refstack_client.py b/functest/opnfv_tests/openstack/refstack_client/refstack_client.py
deleted file mode 100644
index fe32da66b..000000000
--- a/functest/opnfv_tests/openstack/refstack_client/refstack_client.py
+++ /dev/null
@@ -1,261 +0,0 @@
-#!/usr/bin/env python
-
-# Copyright (c) 2017 Huawei Technologies Co.,Ltd and others.
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-
-"""Refstack client testcase implemenation."""
-
-from __future__ import division
-
-import argparse
-import logging
-import os
-import re
-import sys
-import subprocess
-import time
-
-import pkg_resources
-
-from functest.core import testcase
-from functest.energy import energy
-from functest.opnfv_tests.openstack.refstack_client.tempest_conf \
- import TempestConf
-from functest.opnfv_tests.openstack.tempest import conf_utils
-from functest.utils.constants import CONST
-import functest.utils.functest_utils as ft_utils
-
-__author__ = ("Matthew Li <matthew.lijun@huawei.com>,"
- "Linda Wang <wangwulin@huawei.com>")
-
-# logging configuration """
-LOGGER = logging.getLogger(__name__)
-
-
-class RefstackClient(testcase.TestCase):
- """RefstackClient testcase implementation class."""
-
- def __init__(self, **kwargs):
- """Initialize RefstackClient testcase object."""
- if "case_name" not in kwargs:
- kwargs["case_name"] = "refstack_defcore"
- super(RefstackClient, self).__init__(**kwargs)
- self.tempestconf = None
- self.conf_path = pkg_resources.resource_filename(
- 'functest',
- 'opnfv_tests/openstack/refstack_client/refstack_tempest.conf')
- self.functest_test = pkg_resources.resource_filename(
- 'functest', 'opnfv_tests')
- self.defcore_list = 'openstack/refstack_client/defcore.txt'
- self.confpath = os.path.join(self.functest_test,
- self.conf_path)
- self.defcorelist = pkg_resources.resource_filename(
- 'functest', 'opnfv_tests/openstack/refstack_client/defcore.txt')
- self.testlist = None
- self.insecure = ''
- if ('https' in CONST.__getattribute__('OS_AUTH_URL') and
- CONST.__getattribute__('OS_INSECURE').lower() == 'true'):
- self.insecure = '-k'
-
- def generate_conf(self):
- if not os.path.exists(conf_utils.REFSTACK_RESULTS_DIR):
- os.makedirs(conf_utils.REFSTACK_RESULTS_DIR)
-
- self.tempestconf = TempestConf()
- self.tempestconf.generate_tempestconf()
-
- def run_defcore(self, conf, testlist):
- """Run defcore sys command."""
- cmd = ("refstack-client test {0} -c {1} -v --test-list {2}"
- .format(self.insecure, conf, testlist))
- LOGGER.info("Starting Refstack_defcore test case: '%s'.", cmd)
- ft_utils.execute_command(cmd)
-
- def run_defcore_default(self):
- """Run default defcore sys command."""
- options = ["-v"] if not self.insecure else ["-v", self.insecure]
- cmd = (["refstack-client", "test", "-c", self.confpath] +
- options + ["--test-list", self.defcorelist])
- LOGGER.info("Starting Refstack_defcore test case: '%s'.", cmd)
-
- with open(os.path.join(conf_utils.REFSTACK_RESULTS_DIR,
- "environment.log"), 'w+') as f_env:
- f_env.write(
- ("Refstack environment:\n"
- " SUT: {}\n Scenario: {}\n Node: {}\n Date: {}\n").format(
- CONST.__getattribute__('INSTALLER_TYPE'),
- CONST.__getattribute__('DEPLOY_SCENARIO'),
- CONST.__getattribute__('NODE_NAME'),
- time.strftime("%a %b %d %H:%M:%S %Z %Y")))
-
- with open(os.path.join(conf_utils.REFSTACK_RESULTS_DIR,
- "refstack.log"), 'w+') as f_stdout:
- subprocess.call(cmd, shell=False, stdout=f_stdout,
- stderr=subprocess.STDOUT)
-
- def parse_refstack_result(self):
- """Parse Refstack results."""
- try:
- with open(os.path.join(conf_utils.REFSTACK_RESULTS_DIR,
- "refstack.log"), 'r') as logfile:
- for line in logfile.readlines():
- if 'Tests' in line:
- break
- if re.search(r"\} tempest\.", line):
- LOGGER.info(line.replace('\n', ''))
-
- with open(os.path.join(conf_utils.REFSTACK_RESULTS_DIR,
- "refstack.log"), 'r') as logfile:
- output = logfile.read()
-
- for match in re.findall(r"Ran: (\d+) tests in (\d+\.\d{4}) sec.",
- output):
- num_tests = match[0]
- LOGGER.info("Ran: %s tests in %s sec.", num_tests, match[1])
- for match in re.findall(r"(- Passed: )(\d+)", output):
- num_success = match[1]
- LOGGER.info("".join(match))
- for match in re.findall(r"(- Skipped: )(\d+)", output):
- num_skipped = match[1]
- LOGGER.info("".join(match))
- for match in re.findall(r"(- Failed: )(\d+)", output):
- num_failures = match[1]
- LOGGER.info("".join(match))
- success_testcases = []
- for match in re.findall(r"\{0\} (.*?) \.{3} ok", output):
- success_testcases.append(match)
- failed_testcases = []
- for match in re.findall(r"\{0\} (.*?) \.{3} FAILED", output):
- failed_testcases.append(match)
- skipped_testcases = []
- for match in re.findall(r"\{0\} (.*?) \.{3} SKIPPED:", output):
- skipped_testcases.append(match)
-
- num_executed = int(num_tests) - int(num_skipped)
-
- try:
- self.result = 100 * int(num_success) / int(num_executed)
- except ZeroDivisionError:
- LOGGER.error("No test has been executed")
-
- self.details = {"tests": int(num_tests),
- "failures": int(num_failures),
- "success": success_testcases,
- "errors": failed_testcases,
- "skipped": skipped_testcases}
- except Exception:
- self.result = 0
-
- LOGGER.info("Testcase %s success_rate is %s%%",
- self.case_name, self.result)
-
- @energy.enable_recording
- def run(self, **kwargs):
- """
- Start RefstackClient testcase.
-
- used for functest command line,
- functest testcase run refstack_defcore
- """
- self.start_time = time.time()
-
- try:
- # Make sure that Tempest is configured
- if not self.tempestconf:
- self.generate_conf()
- self.run_defcore_default()
- self.parse_refstack_result()
- res = testcase.TestCase.EX_OK
- except Exception:
- LOGGER.exception("Error with run")
- res = testcase.TestCase.EX_RUN_ERROR
- finally:
- self.tempestconf.clean()
-
- self.stop_time = time.time()
- return res
-
- def _prep_test(self):
- """Check that the config file exists."""
- if not os.path.isfile(self.confpath):
- LOGGER.error("Conf file not valid: %s", self.confpath)
- if not os.path.isfile(self.testlist):
- LOGGER.error("testlist file not valid: %s", self.testlist)
-
- def main(self, **kwargs):
- """
- Execute RefstackClient testcase manually.
-
- used for manually running,
- python refstack_client.py -c <tempest_conf_path>
- --testlist <testlist_path>
- can generate a reference refstack_tempest.conf by
- python tempest_conf.py
- """
- try:
- self.confpath = kwargs['config']
- self.testlist = kwargs['testlist']
- except KeyError as exc:
- LOGGER.error("Cannot run refstack client. Please check "
- "%s", exc)
- return self.EX_RUN_ERROR
- try:
- self._prep_test()
- self.run_defcore(self.confpath, self.testlist)
- res = testcase.TestCase.EX_OK
- except Exception as exc:
- LOGGER.error('Error with run: %s', exc)
- res = testcase.TestCase.EX_RUN_ERROR
-
- return res
-
-
-class RefstackClientParser(object): # pylint: disable=too-few-public-methods
- """Command line argument parser helper."""
-
- def __init__(self):
- """Initialize helper object."""
- self.functest_test = pkg_resources.resource_filename(
- 'functest', 'opnfv_tests')
- self.conf_path = pkg_resources.resource_filename(
- 'functest',
- 'opnfv_tests/openstack/refstack_client/refstack_tempest.conf')
- self.defcore_list = pkg_resources.resource_filename(
- 'functest', 'opnfv_tests/openstack/refstack_client/defcore.txt')
- self.confpath = os.path.join(self.functest_test,
- self.conf_path)
- self.defcorelist = os.path.join(self.functest_test,
- self.defcore_list)
- self.parser = argparse.ArgumentParser()
- self.parser.add_argument(
- '-c', '--config',
- help='the file path of refstack_tempest.conf',
- default=self.confpath)
- self.parser.add_argument(
- '-t', '--testlist',
- help='Specify the file path or URL of a test list text file. '
- 'This test list will contain specific test cases that '
- 'should be tested.',
- default=self.defcorelist)
-
- def parse_args(self, argv=None):
- """Parse command line arguments."""
- return vars(self.parser.parse_args(argv))
-
-
-def main():
- """Run RefstackClient testcase with CLI."""
- logging.basicConfig()
- refstackclient = RefstackClient()
- parser = RefstackClientParser()
- args = parser.parse_args(sys.argv[1:])
- try:
- result = refstackclient.main(**args)
- if result != testcase.TestCase.EX_OK:
- return result
- except Exception:
- return testcase.TestCase.EX_RUN_ERROR
diff --git a/functest/opnfv_tests/openstack/refstack_client/tempest_conf.py b/functest/opnfv_tests/openstack/refstack_client/tempest_conf.py
deleted file mode 100644
index db7452271..000000000
--- a/functest/opnfv_tests/openstack/refstack_client/tempest_conf.py
+++ /dev/null
@@ -1,67 +0,0 @@
-#!/usr/bin/env python
-
-# matthew.lijun@huawei.com
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-import logging
-import pkg_resources
-
-from functest.opnfv_tests.openstack.tempest import conf_utils
-from functest.utils import openstack_utils
-from functest.utils.constants import CONST
-from functest.opnfv_tests.openstack.tempest.tempest \
- import TempestResourcesManager
-
-""" logging configuration """
-logger = logging.getLogger(__name__)
-
-
-class TempestConf(object):
- def __init__(self, **kwargs):
- self.VERIFIER_ID = conf_utils.get_verifier_id()
- self.VERIFIER_REPO_DIR = conf_utils.get_verifier_repo_dir(
- self.VERIFIER_ID)
- self.DEPLOYMENT_ID = conf_utils.get_verifier_deployment_id()
- self.DEPLOYMENT_DIR = conf_utils.get_verifier_deployment_dir(
- self.VERIFIER_ID, self.DEPLOYMENT_ID)
- self.confpath = pkg_resources.resource_filename(
- 'functest',
- 'opnfv_tests/openstack/refstack_client/refstack_tempest.conf')
- self.resources = TempestResourcesManager(**kwargs)
-
- def generate_tempestconf(self):
- try:
- openstack_utils.source_credentials(
- CONST.__getattribute__('openstack_creds'))
- resources = self.resources.create(create_project=True,
- use_custom_images=True,
- use_custom_flavors=True)
- conf_utils.configure_tempest_defcore(
- self.DEPLOYMENT_DIR,
- image_id=resources.get("image_id"),
- flavor_id=resources.get("flavor_id"),
- image_id_alt=resources.get("image_id_alt"),
- flavor_id_alt=resources.get("flavor_id_alt"),
- tenant_id=resources.get("project_id"))
- except Exception as e:
- logger.error("error with generating refstack client "
- "reference tempest conf file: %s", e)
-
- def main(self):
- try:
- self.generate_tempestconf()
- logger.info("a reference tempest conf file generated "
- "at %s", self.confpath)
- except Exception as e:
- logger.error('Error with run: %s', e)
-
- def clean(self):
- self.resources.cleanup()
-
-
-def main():
- logging.basicConfig()
- tempestconf = TempestConf()
- tempestconf.main()
diff --git a/functest/api/resources/v1/__init__.py b/functest/opnfv_tests/openstack/shaker/__init__.py
index e69de29bb..e69de29bb 100644
--- a/functest/api/resources/v1/__init__.py
+++ b/functest/opnfv_tests/openstack/shaker/__init__.py
diff --git a/functest/opnfv_tests/openstack/shaker/shaker.py b/functest/opnfv_tests/openstack/shaker/shaker.py
new file mode 100644
index 000000000..275cc3077
--- /dev/null
+++ b/functest/opnfv_tests/openstack/shaker/shaker.py
@@ -0,0 +1,147 @@
+#!/usr/bin/env python
+
+# Copyright (c) 2018 Orange and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+
+"""
+Shaker_ wraps around popular system network testing tools like iperf, iperf3
+and netperf (with help of flent). Shaker is able to deploy OpenStack instances
+and networks in different topologies. Shaker scenario specifies the deployment
+and list of tests to execute.
+
+.. _Shaker: http://pyshaker.readthedocs.io/en/latest/
+"""
+
+import logging
+import os
+
+import json
+import scp
+
+from functest.core import singlevm
+from functest.utils import env
+
+
+class Shaker(singlevm.SingleVm2):
+ """Run shaker full+perf l2 and l3"""
+ # pylint: disable=too-many-instance-attributes
+
+ __logger = logging.getLogger(__name__)
+
+ filename = '/home/opnfv/functest/images/shaker-image-1.3.4+stretch.qcow2'
+ flavor_ram = 512
+ flavor_vcpus = 1
+ flavor_disk = 3
+ username = 'debian'
+ port = 9000
+ ssh_connect_loops = 12
+ create_server_timeout = 300
+ check_console_loop = 12
+ shaker_timeout = '3600'
+ quota_instances = -1
+ quota_cores = -1
+ check_console_loop = 12
+
+ def __init__(self, **kwargs):
+ super().__init__(**kwargs)
+ self.role = None
+
+ def check_requirements(self):
+ if self.count_hypervisors() < 2:
+ self.__logger.warning("Shaker requires at least 2 hypervisors")
+ self.is_skipped = True
+ self.project.clean()
+
+ def prepare(self):
+ super().prepare()
+ self.cloud.create_security_group_rule(
+ self.sec.id, port_range_min=self.port, port_range_max=self.port,
+ protocol='tcp', direction='ingress')
+
+ def execute(self):
+ """
+ Returns:
+ - 0 if success
+ - 1 on operation error
+ """
+ assert self.ssh
+ endpoint = self.get_public_auth_url(self.orig_cloud)
+ self.__logger.debug("keystone endpoint: %s", endpoint)
+ if self.orig_cloud.get_role("admin"):
+ role_name = "admin"
+ elif self.orig_cloud.get_role("Admin"):
+ role_name = "Admin"
+ else:
+ raise Exception("Cannot detect neither admin nor Admin")
+ self.orig_cloud.grant_role(
+ role_name, user=self.project.user.id,
+ project=self.project.project.id,
+ domain=self.project.domain.id)
+ if not self.orig_cloud.get_role("heat_stack_owner"):
+ self.role = self.orig_cloud.create_role("heat_stack_owner")
+ self.orig_cloud.grant_role(
+ "heat_stack_owner", user=self.project.user.id,
+ project=self.project.project.id,
+ domain=self.project.domain.id)
+ self.orig_cloud.set_compute_quotas(
+ self.project.project.name,
+ instances=self.quota_instances,
+ cores=self.quota_cores)
+ scpc = scp.SCPClient(self.ssh.get_transport())
+ scpc.put('/home/opnfv/functest/conf/env_file', remote_path='~/')
+ if os.environ.get('OS_CACERT'):
+ scpc.put(os.environ.get('OS_CACERT'), remote_path='~/os_cacert')
+ opt = 'export OS_CACERT=~/os_cacert && ' if os.environ.get(
+ 'OS_CACERT') else ''
+ (_, stdout, stderr) = self.ssh.exec_command(
+ 'source ~/env_file && '
+ 'export OS_INTERFACE=public && '
+ f'export OS_AUTH_URL={endpoint} && '
+ f'export OS_USERNAME={self.project.user.name} && '
+ f'export OS_PROJECT_NAME={self.project.project.name} && '
+ f'export OS_PROJECT_ID={self.project.project.id} && '
+ 'unset OS_TENANT_NAME && '
+ 'unset OS_TENANT_ID && '
+ 'unset OS_ENDPOINT_TYPE && '
+ f'export OS_PASSWORD="{self.project.password}" && '
+ f'{opt}'
+ 'env && '
+ f'timeout {self.shaker_timeout} shaker --debug '
+ f'--image-name {self.image.name} --flavor-name {self.flavor.name} '
+ f'--server-endpoint {self.fip.floating_ip_address}:9000 '
+ f'--external-net {self.ext_net.id} '
+ f"--dns-nameservers {env.get('NAMESERVER')} "
+ '--scenario openstack/full_l2,'
+ 'openstack/full_l3_east_west,'
+ 'openstack/full_l3_north_south,'
+ 'openstack/perf_l3_north_south '
+ '--report report.html --output report.json')
+ self.__logger.info("output:\n%s", stdout.read().decode("utf-8"))
+ self.__logger.info("error:\n%s", stderr.read().decode("utf-8"))
+ if not os.path.exists(self.res_dir):
+ os.makedirs(self.res_dir)
+ try:
+ scpc.get('report.json', self.res_dir)
+ scpc.get('report.html', self.res_dir)
+ except scp.SCPException:
+ self.__logger.exception("cannot get report files")
+ return 1
+ with open(
+ os.path.join(self.res_dir, 'report.json'),
+ encoding='utf-8') as json_file:
+ data = json.load(json_file)
+ for value in data["records"].values():
+ if value["status"] != "ok":
+ self.__logger.error(
+ "%s failed\n%s", value["scenario"], value["stderr"])
+ return 1
+ return stdout.channel.recv_exit_status()
+
+ def clean(self):
+ super().clean()
+ if self.role:
+ self.orig_cloud.delete_role(self.role.id)
diff --git a/functest/opnfv_tests/openstack/snaps/__init__.py b/functest/opnfv_tests/openstack/snaps/__init__.py
deleted file mode 100644
index e69de29bb..000000000
--- a/functest/opnfv_tests/openstack/snaps/__init__.py
+++ /dev/null
diff --git a/functest/opnfv_tests/openstack/snaps/api_check.py b/functest/opnfv_tests/openstack/snaps/api_check.py
deleted file mode 100644
index e708b4dec..000000000
--- a/functest/opnfv_tests/openstack/snaps/api_check.py
+++ /dev/null
@@ -1,41 +0,0 @@
-# Copyright (c) 2017 Cable Television Laboratories, Inc. and others.
-#
-# This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-
-import unittest
-
-from functest.opnfv_tests.openstack.snaps import snaps_suite_builder
-from functest.opnfv_tests.openstack.snaps.snaps_test_runner import \
- SnapsTestRunner
-
-
-class ApiCheck(SnapsTestRunner):
- """
- This test executes the Python Tests included with the SNAPS libraries
- that exercise many of the OpenStack APIs within Keystone, Glance, Neutron,
- and Nova
- """
- def __init__(self, **kwargs):
- if "case_name" not in kwargs:
- kwargs["case_name"] = "api_check"
- super(ApiCheck, self).__init__(**kwargs)
-
- self.suite = unittest.TestSuite()
-
- def run(self, **kwargs):
- """
- Builds the test suite then calls super.run()
- :param kwargs: the arguments to pass on
- :return:
- """
- snaps_suite_builder.add_openstack_api_tests(
- suite=self.suite,
- os_creds=self.os_creds,
- ext_net_name=self.ext_net_name,
- use_keystone=self.use_keystone,
- image_metadata=self.image_metadata)
- return super(self.__class__, self).run()
diff --git a/functest/opnfv_tests/openstack/snaps/connection_check.py b/functest/opnfv_tests/openstack/snaps/connection_check.py
deleted file mode 100644
index 1fc49349e..000000000
--- a/functest/opnfv_tests/openstack/snaps/connection_check.py
+++ /dev/null
@@ -1,40 +0,0 @@
-# Copyright (c) 2017 Cable Television Laboratories, Inc. and others.
-#
-# This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-
-import unittest
-
-from functest.opnfv_tests.openstack.snaps import snaps_suite_builder
-from functest.opnfv_tests.openstack.snaps.snaps_test_runner import \
- SnapsTestRunner
-
-
-class ConnectionCheck(SnapsTestRunner):
- """
- This test executes the Python Tests included with the SNAPS libraries
- that simply obtain the different OpenStack clients and may perform
- simple queries
- """
- def __init__(self, **kwargs):
- if "case_name" not in kwargs:
- kwargs["case_name"] = "connection_check"
- super(ConnectionCheck, self).__init__(**kwargs)
-
- self.suite = unittest.TestSuite()
-
- def run(self, **kwargs):
- """
- Builds the test suite then calls super.run()
- :param kwargs: the arguments to pass on
- :return:
- """
- snaps_suite_builder.add_openstack_client_tests(
- suite=self.suite,
- os_creds=self.os_creds,
- ext_net_name=self.ext_net_name,
- use_keystone=self.use_keystone)
- return super(self.__class__, self).run()
diff --git a/functest/opnfv_tests/openstack/snaps/health_check.py b/functest/opnfv_tests/openstack/snaps/health_check.py
deleted file mode 100644
index 837c2eae7..000000000
--- a/functest/opnfv_tests/openstack/snaps/health_check.py
+++ /dev/null
@@ -1,45 +0,0 @@
-# Copyright (c) 2017 Cable Television Laboratories, Inc. and others.
-#
-# This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-
-import unittest
-
-from functest.opnfv_tests.openstack.snaps.snaps_test_runner import (
- SnapsTestRunner)
-
-from snaps.openstack.tests.os_source_file_test import OSIntegrationTestCase
-from snaps.openstack.tests.create_instance_tests import SimpleHealthCheck
-
-
-class HealthCheck(SnapsTestRunner):
- """
- This test executes the SNAPS Python Test case SimpleHealthCheck which
- creates a VM with a single port with an IPv4 address that is assigned by
- DHCP. This test then validates the expected IP with the actual
- """
- def __init__(self, **kwargs):
- if "case_name" not in kwargs:
- kwargs["case_name"] = "snaps_images_cirros"
- super(HealthCheck, self).__init__(**kwargs)
-
- self.suite = unittest.TestSuite()
-
- def run(self, **kwargs):
- """
- Builds the test suite then calls super.run()
- :param kwargs: the arguments to pass on
- :return:
- """
- self.suite.addTest(
- OSIntegrationTestCase.parameterize(
- SimpleHealthCheck, os_creds=self.os_creds,
- ext_net_name=self.ext_net_name,
- use_keystone=self.use_keystone,
- flavor_metadata=self.flavor_metadata,
- image_metadata=self.image_metadata,
- netconf_override=self.netconf_override))
- return super(self.__class__, self).run()
diff --git a/functest/opnfv_tests/openstack/snaps/smoke.py b/functest/opnfv_tests/openstack/snaps/smoke.py
deleted file mode 100644
index ded149d0c..000000000
--- a/functest/opnfv_tests/openstack/snaps/smoke.py
+++ /dev/null
@@ -1,44 +0,0 @@
-# Copyright (c) 2017 Cable Television Laboratories, Inc. and others.
-#
-# This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-
-import unittest
-
-from functest.opnfv_tests.openstack.snaps import snaps_suite_builder
-from functest.opnfv_tests.openstack.snaps.snaps_test_runner import (
- SnapsTestRunner)
-
-
-class SnapsSmoke(SnapsTestRunner):
- """
- This test executes the Python Tests included with the SNAPS libraries
- that exercise many of the OpenStack APIs within Keystone, Glance, Neutron,
- and Nova
- """
- def __init__(self, **kwargs):
- if "case_name" not in kwargs:
- kwargs["case_name"] = "snaps_smoke"
- super(SnapsSmoke, self).__init__(**kwargs)
-
- self.suite = unittest.TestSuite()
-
- def run(self, **kwargs):
- """
- Builds the test suite then calls super.run()
- :param kwargs: the arguments to pass on
- :return:
- """
- snaps_suite_builder.add_openstack_integration_tests(
- suite=self.suite,
- os_creds=self.os_creds,
- ext_net_name=self.ext_net_name,
- use_keystone=self.use_keystone,
- flavor_metadata=self.flavor_metadata,
- image_metadata=self.image_metadata,
- use_floating_ips=self.use_fip,
- netconf_override=self.netconf_override)
- return super(self.__class__, self).run()
diff --git a/functest/opnfv_tests/openstack/snaps/snaps_suite_builder.py b/functest/opnfv_tests/openstack/snaps/snaps_suite_builder.py
deleted file mode 100644
index 3e7c0a39f..000000000
--- a/functest/opnfv_tests/openstack/snaps/snaps_suite_builder.py
+++ /dev/null
@@ -1,433 +0,0 @@
-#!/usr/bin/env python
-
-# Copyright (c) 2017 Cable Television Laboratories, Inc. and others.
-#
-# This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-
-import logging
-
-from snaps.openstack.tests.create_flavor_tests import (
- CreateFlavorTests)
-from snaps.openstack.tests.create_image_tests import (
- CreateImageSuccessTests, CreateImageNegativeTests,
- CreateMultiPartImageTests)
-from snaps.openstack.tests.create_instance_tests import (
- CreateInstanceSingleNetworkTests, CreateInstanceOnComputeHost,
- CreateInstanceSimpleTests, InstanceSecurityGroupTests,
- CreateInstancePortManipulationTests, SimpleHealthCheck,
- CreateInstanceFromThreePartImage, CreateInstanceTwoNetTests,
- CreateInstanceVolumeTests)
-from snaps.openstack.tests.create_keypairs_tests import (
- CreateKeypairsTests, CreateKeypairsCleanupTests)
-from snaps.openstack.tests.create_network_tests import (
- CreateNetworkSuccessTests)
-from snaps.openstack.tests.create_project_tests import (
- CreateProjectSuccessTests, CreateProjectUserTests)
-from snaps.openstack.tests.create_qos_tests import (
- CreateQoSTests)
-from snaps.openstack.tests.create_router_tests import (
- CreateRouterSuccessTests, CreateRouterNegativeTests)
-from snaps.openstack.tests.create_security_group_tests import (
- CreateSecurityGroupTests)
-from snaps.openstack.tests.create_stack_tests import (
- CreateStackSuccessTests, CreateStackNegativeTests,
- CreateStackFlavorTests, CreateStackFloatingIpTests,
- CreateStackKeypairTests, CreateStackVolumeTests,
- CreateStackSecurityGroupTests)
-from snaps.openstack.tests.create_user_tests import (
- CreateUserSuccessTests)
-from snaps.openstack.tests.create_volume_tests import (
- CreateSimpleVolumeSuccessTests,
- CreateVolumeWithTypeTests, CreateVolumeWithImageTests,
- CreateSimpleVolumeFailureTests)
-from snaps.openstack.tests.create_volume_type_tests import (
- CreateSimpleVolumeTypeSuccessTests,
- CreateVolumeTypeComplexTests)
-from snaps.openstack.tests.os_source_file_test import (
- OSComponentTestCase, OSIntegrationTestCase)
-from snaps.openstack.utils.tests.cinder_utils_tests import (
- CinderSmokeTests, CinderUtilsQoSTests, CinderUtilsSimpleVolumeTypeTests,
- CinderUtilsAddEncryptionTests, CinderUtilsVolumeTypeCompleteTests,
- CinderUtilsVolumeTests)
-from snaps.openstack.utils.tests.glance_utils_tests import (
- GlanceSmokeTests, GlanceUtilsTests)
-from snaps.openstack.utils.tests.heat_utils_tests import (
- HeatSmokeTests, HeatUtilsCreateSimpleStackTests,
- HeatUtilsCreateComplexStackTests, HeatUtilsFlavorTests,
- HeatUtilsKeypairTests, HeatUtilsSecurityGroupTests)
-from snaps.openstack.utils.tests.keystone_utils_tests import (
- KeystoneSmokeTests, KeystoneUtilsTests)
-from snaps.openstack.utils.tests.neutron_utils_tests import (
- NeutronSmokeTests, NeutronUtilsNetworkTests, NeutronUtilsSubnetTests,
- NeutronUtilsRouterTests, NeutronUtilsSecurityGroupTests,
- NeutronUtilsFloatingIpTests)
-from snaps.openstack.utils.tests.nova_utils_tests import (
- NovaSmokeTests, NovaUtilsKeypairTests, NovaUtilsFlavorTests,
- NovaUtilsInstanceTests, NovaUtilsInstanceVolumeTests)
-from snaps.provisioning.tests.ansible_utils_tests import (
- AnsibleProvisioningTests)
-
-
-def add_openstack_client_tests(suite, os_creds, ext_net_name,
- use_keystone=True, log_level=logging.INFO):
- """
- Adds tests written to exercise OpenStack client retrieval
- :param suite: the unittest.TestSuite object to which to add the tests
- :param os_creds: and instance of OSCreds that holds the credentials
- required by OpenStack
- :param ext_net_name: the name of an external network on the cloud under
- test
- :param use_keystone: when True, tests requiring direct access to Keystone
- are added as these need to be running on a host that
- has access to the cloud's private network
- :param log_level: the logging level
- :return: None as the tests will be adding to the 'suite' parameter object
- """
- # Basic connection tests
- suite.addTest(
- OSComponentTestCase.parameterize(
- GlanceSmokeTests, os_creds=os_creds, ext_net_name=ext_net_name,
- log_level=log_level))
-
- if use_keystone:
- suite.addTest(
- OSComponentTestCase.parameterize(
- KeystoneSmokeTests, os_creds=os_creds,
- ext_net_name=ext_net_name, log_level=log_level))
-
- suite.addTest(
- OSComponentTestCase.parameterize(
- NeutronSmokeTests, os_creds=os_creds, ext_net_name=ext_net_name,
- log_level=log_level))
- suite.addTest(
- OSComponentTestCase.parameterize(
- NovaSmokeTests, os_creds=os_creds, ext_net_name=ext_net_name,
- log_level=log_level))
- suite.addTest(
- OSComponentTestCase.parameterize(
- HeatSmokeTests, os_creds=os_creds, ext_net_name=ext_net_name,
- log_level=log_level))
- suite.addTest(
- OSComponentTestCase.parameterize(
- CinderSmokeTests, os_creds=os_creds, ext_net_name=ext_net_name,
- log_level=log_level))
-
-
-def add_openstack_api_tests(suite, os_creds, ext_net_name, use_keystone=True,
- image_metadata=None, log_level=logging.INFO):
- """
- Adds tests written to exercise all existing OpenStack APIs
- :param suite: the unittest.TestSuite object to which to add the tests
- :param os_creds: Instance of OSCreds that holds the credentials
- required by OpenStack
- :param ext_net_name: the name of an external network on the cloud under
- test
- :param use_keystone: when True, tests requiring direct access to Keystone
- are added as these need to be running on a host that
- has access to the cloud's private network
- :param image_metadata: dict() object containing metadata for creating an
- image with custom config
- (see YAML files in examples/image-metadata)
- :param log_level: the logging level
- :return: None as the tests will be adding to the 'suite' parameter object
- """
- # Tests the OpenStack API calls
- if use_keystone:
- suite.addTest(OSComponentTestCase.parameterize(
- KeystoneUtilsTests, os_creds=os_creds, ext_net_name=ext_net_name,
- log_level=log_level))
- suite.addTest(OSComponentTestCase.parameterize(
- CreateUserSuccessTests, os_creds=os_creds,
- ext_net_name=ext_net_name, log_level=log_level))
- suite.addTest(OSComponentTestCase.parameterize(
- CreateProjectSuccessTests, os_creds=os_creds,
- ext_net_name=ext_net_name, log_level=log_level))
- suite.addTest(OSComponentTestCase.parameterize(
- CreateProjectUserTests, os_creds=os_creds,
- ext_net_name=ext_net_name, log_level=log_level))
-
- suite.addTest(OSComponentTestCase.parameterize(
- GlanceUtilsTests, os_creds=os_creds, ext_net_name=ext_net_name,
- image_metadata=image_metadata,
- log_level=log_level))
- suite.addTest(OSComponentTestCase.parameterize(
- NeutronUtilsNetworkTests, os_creds=os_creds, ext_net_name=ext_net_name,
- log_level=log_level))
- suite.addTest(OSComponentTestCase.parameterize(
- NeutronUtilsSubnetTests, os_creds=os_creds, ext_net_name=ext_net_name,
- log_level=log_level))
- suite.addTest(OSComponentTestCase.parameterize(
- NeutronUtilsRouterTests, os_creds=os_creds, ext_net_name=ext_net_name,
- log_level=log_level))
- suite.addTest(OSComponentTestCase.parameterize(
- NeutronUtilsSecurityGroupTests, os_creds=os_creds,
- ext_net_name=ext_net_name, log_level=log_level))
- suite.addTest(OSComponentTestCase.parameterize(
- NeutronUtilsFloatingIpTests, os_creds=os_creds,
- ext_net_name=ext_net_name, log_level=log_level))
- suite.addTest(OSComponentTestCase.parameterize(
- NovaUtilsKeypairTests, os_creds=os_creds, ext_net_name=ext_net_name,
- log_level=log_level))
- suite.addTest(OSComponentTestCase.parameterize(
- NovaUtilsFlavorTests, os_creds=os_creds, ext_net_name=ext_net_name,
- log_level=log_level))
- suite.addTest(OSComponentTestCase.parameterize(
- NovaUtilsInstanceTests, os_creds=os_creds, ext_net_name=ext_net_name,
- log_level=log_level, image_metadata=image_metadata))
- suite.addTest(OSComponentTestCase.parameterize(
- NovaUtilsInstanceVolumeTests, os_creds=os_creds,
- ext_net_name=ext_net_name, log_level=log_level,
- image_metadata=image_metadata))
- suite.addTest(OSComponentTestCase.parameterize(
- CreateFlavorTests, os_creds=os_creds, ext_net_name=ext_net_name,
- log_level=log_level))
- suite.addTest(OSComponentTestCase.parameterize(
- HeatUtilsCreateSimpleStackTests, os_creds=os_creds,
- ext_net_name=ext_net_name, log_level=log_level,
- image_metadata=image_metadata))
- suite.addTest(OSComponentTestCase.parameterize(
- HeatUtilsCreateComplexStackTests, os_creds=os_creds,
- ext_net_name=ext_net_name, log_level=log_level,
- image_metadata=image_metadata))
- suite.addTest(OSComponentTestCase.parameterize(
- HeatUtilsFlavorTests, os_creds=os_creds,
- ext_net_name=ext_net_name, log_level=log_level,
- image_metadata=image_metadata))
- suite.addTest(OSComponentTestCase.parameterize(
- HeatUtilsKeypairTests, os_creds=os_creds,
- ext_net_name=ext_net_name, log_level=log_level,
- image_metadata=image_metadata))
- suite.addTest(OSComponentTestCase.parameterize(
- HeatUtilsSecurityGroupTests, os_creds=os_creds,
- ext_net_name=ext_net_name, log_level=log_level,
- image_metadata=image_metadata))
- suite.addTest(OSComponentTestCase.parameterize(
- CinderUtilsQoSTests, os_creds=os_creds,
- ext_net_name=ext_net_name, log_level=log_level,
- image_metadata=image_metadata))
- suite.addTest(OSComponentTestCase.parameterize(
- CinderUtilsVolumeTests, os_creds=os_creds,
- ext_net_name=ext_net_name, log_level=log_level,
- image_metadata=image_metadata))
- suite.addTest(OSComponentTestCase.parameterize(
- CinderUtilsSimpleVolumeTypeTests, os_creds=os_creds,
- ext_net_name=ext_net_name, log_level=log_level,
- image_metadata=image_metadata))
- suite.addTest(OSComponentTestCase.parameterize(
- CinderUtilsAddEncryptionTests, os_creds=os_creds,
- ext_net_name=ext_net_name, log_level=log_level,
- image_metadata=image_metadata))
- suite.addTest(OSComponentTestCase.parameterize(
- CinderUtilsVolumeTypeCompleteTests, os_creds=os_creds,
- ext_net_name=ext_net_name, log_level=log_level,
- image_metadata=image_metadata))
-
-
-def add_openstack_integration_tests(suite, os_creds, ext_net_name,
- use_keystone=True, flavor_metadata=None,
- image_metadata=None, use_floating_ips=True,
- netconf_override=None,
- log_level=logging.INFO):
- """
- Adds tests written to exercise all long-running OpenStack integration tests
- meaning they will be creating VM instances and potentially performing some
- SSH functions through floatingIPs
- :param suite: the unittest.TestSuite object to which to add the tests
- :param os_creds: and instance of OSCreds that holds the credentials
- required by OpenStack
- :param ext_net_name: the name of an external network on the cloud under
- test
- :param use_keystone: when True, tests requiring direct access to Keystone
- are added as these need to be running on a host that
- has access to the cloud's private network
- :param image_metadata: dict() object containing metadata for creating an
- image with custom config
- (see YAML files in examples/image-metadata)
- :param flavor_metadata: dict() object containing the metadata required by
- your flavor based on your configuration:
- (i.e. {'hw:mem_page_size': 'large'})
- :param use_floating_ips: when true, all tests requiring Floating IPs will
- be added to the suite
- :param netconf_override: dict() containing the reconfigured network_type,
- physical_network and segmentation_id
- :param log_level: the logging level
- :return: None as the tests will be adding to the 'suite' parameter object
- """
- # Tests the OpenStack API calls via a creator. If use_keystone, objects
- # will be created with a custom user and project
-
- # Creator Object tests
- suite.addTest(OSIntegrationTestCase.parameterize(
- CreateSecurityGroupTests, os_creds=os_creds, ext_net_name=ext_net_name,
- use_keystone=use_keystone,
- flavor_metadata=flavor_metadata, image_metadata=image_metadata,
- log_level=log_level))
- suite.addTest(OSIntegrationTestCase.parameterize(
- CreateImageSuccessTests, os_creds=os_creds, ext_net_name=ext_net_name,
- use_keystone=use_keystone,
- flavor_metadata=flavor_metadata, image_metadata=image_metadata,
- log_level=log_level))
- suite.addTest(OSIntegrationTestCase.parameterize(
- CreateImageNegativeTests, os_creds=os_creds, ext_net_name=ext_net_name,
- use_keystone=use_keystone,
- flavor_metadata=flavor_metadata, image_metadata=image_metadata,
- log_level=log_level))
- suite.addTest(OSIntegrationTestCase.parameterize(
- CreateMultiPartImageTests, os_creds=os_creds,
- ext_net_name=ext_net_name, use_keystone=use_keystone,
- flavor_metadata=flavor_metadata, image_metadata=image_metadata,
- log_level=log_level))
- suite.addTest(OSIntegrationTestCase.parameterize(
- CreateKeypairsTests, os_creds=os_creds, ext_net_name=ext_net_name,
- use_keystone=use_keystone,
- flavor_metadata=flavor_metadata, image_metadata=image_metadata,
- log_level=log_level))
- suite.addTest(OSIntegrationTestCase.parameterize(
- CreateKeypairsCleanupTests, os_creds=os_creds,
- ext_net_name=ext_net_name,
- use_keystone=use_keystone,
- flavor_metadata=flavor_metadata, image_metadata=image_metadata,
- log_level=log_level))
- suite.addTest(OSIntegrationTestCase.parameterize(
- CreateNetworkSuccessTests, os_creds=os_creds,
- ext_net_name=ext_net_name, use_keystone=use_keystone,
- flavor_metadata=flavor_metadata, image_metadata=image_metadata,
- log_level=log_level))
- suite.addTest(OSIntegrationTestCase.parameterize(
- CreateRouterSuccessTests, os_creds=os_creds, ext_net_name=ext_net_name,
- use_keystone=use_keystone,
- flavor_metadata=flavor_metadata, image_metadata=image_metadata,
- log_level=log_level))
- suite.addTest(OSIntegrationTestCase.parameterize(
- CreateRouterNegativeTests, os_creds=os_creds,
- ext_net_name=ext_net_name, use_keystone=use_keystone,
- flavor_metadata=flavor_metadata, image_metadata=image_metadata,
- log_level=log_level))
- suite.addTest(OSIntegrationTestCase.parameterize(
- CreateQoSTests, os_creds=os_creds,
- ext_net_name=ext_net_name, use_keystone=use_keystone,
- flavor_metadata=flavor_metadata, image_metadata=image_metadata,
- log_level=log_level))
- suite.addTest(OSIntegrationTestCase.parameterize(
- CreateSimpleVolumeTypeSuccessTests, os_creds=os_creds,
- ext_net_name=ext_net_name, use_keystone=use_keystone,
- flavor_metadata=flavor_metadata, image_metadata=image_metadata,
- log_level=log_level))
- suite.addTest(OSIntegrationTestCase.parameterize(
- CreateVolumeTypeComplexTests, os_creds=os_creds,
- ext_net_name=ext_net_name, use_keystone=use_keystone,
- flavor_metadata=flavor_metadata, image_metadata=image_metadata,
- log_level=log_level))
- suite.addTest(OSIntegrationTestCase.parameterize(
- CreateSimpleVolumeSuccessTests, os_creds=os_creds,
- ext_net_name=ext_net_name, use_keystone=use_keystone,
- flavor_metadata=flavor_metadata, image_metadata=image_metadata,
- log_level=log_level))
- suite.addTest(OSIntegrationTestCase.parameterize(
- CreateSimpleVolumeFailureTests, os_creds=os_creds,
- ext_net_name=ext_net_name, use_keystone=use_keystone,
- flavor_metadata=flavor_metadata, image_metadata=image_metadata,
- log_level=log_level))
- suite.addTest(OSIntegrationTestCase.parameterize(
- CreateVolumeWithTypeTests, os_creds=os_creds,
- ext_net_name=ext_net_name, use_keystone=use_keystone,
- flavor_metadata=flavor_metadata, image_metadata=image_metadata,
- log_level=log_level))
- suite.addTest(OSIntegrationTestCase.parameterize(
- CreateVolumeWithImageTests, os_creds=os_creds,
- ext_net_name=ext_net_name, use_keystone=use_keystone,
- flavor_metadata=flavor_metadata, image_metadata=image_metadata,
- log_level=log_level))
-
- # VM Instances
- suite.addTest(OSIntegrationTestCase.parameterize(
- SimpleHealthCheck, os_creds=os_creds, ext_net_name=ext_net_name,
- use_keystone=use_keystone,
- flavor_metadata=flavor_metadata, image_metadata=image_metadata,
- log_level=log_level))
- suite.addTest(OSIntegrationTestCase.parameterize(
- CreateInstanceTwoNetTests, os_creds=os_creds,
- ext_net_name=ext_net_name, use_keystone=use_keystone,
- flavor_metadata=flavor_metadata, image_metadata=image_metadata,
- log_level=log_level))
- suite.addTest(OSIntegrationTestCase.parameterize(
- CreateInstanceSimpleTests, os_creds=os_creds,
- ext_net_name=ext_net_name, use_keystone=use_keystone,
- flavor_metadata=flavor_metadata, image_metadata=image_metadata,
- netconf_override=netconf_override, log_level=log_level))
- suite.addTest(OSIntegrationTestCase.parameterize(
- CreateInstancePortManipulationTests, os_creds=os_creds,
- ext_net_name=ext_net_name, use_keystone=use_keystone,
- flavor_metadata=flavor_metadata, image_metadata=image_metadata,
- netconf_override=netconf_override, log_level=log_level))
- suite.addTest(OSIntegrationTestCase.parameterize(
- InstanceSecurityGroupTests, os_creds=os_creds,
- ext_net_name=ext_net_name, use_keystone=use_keystone,
- flavor_metadata=flavor_metadata, image_metadata=image_metadata,
- netconf_override=netconf_override, log_level=log_level))
- suite.addTest(OSIntegrationTestCase.parameterize(
- CreateInstanceOnComputeHost, os_creds=os_creds,
- ext_net_name=ext_net_name, use_keystone=use_keystone,
- flavor_metadata=flavor_metadata, image_metadata=image_metadata,
- netconf_override=netconf_override, log_level=log_level))
- suite.addTest(OSIntegrationTestCase.parameterize(
- CreateInstanceFromThreePartImage, os_creds=os_creds,
- ext_net_name=ext_net_name, use_keystone=use_keystone,
- flavor_metadata=flavor_metadata, image_metadata=image_metadata,
- netconf_override=netconf_override, log_level=log_level))
- suite.addTest(OSIntegrationTestCase.parameterize(
- CreateInstanceVolumeTests, os_creds=os_creds,
- ext_net_name=ext_net_name, use_keystone=use_keystone,
- flavor_metadata=flavor_metadata, image_metadata=image_metadata,
- netconf_override=netconf_override, log_level=log_level))
- suite.addTest(OSIntegrationTestCase.parameterize(
- CreateStackSuccessTests, os_creds=os_creds, ext_net_name=ext_net_name,
- use_keystone=use_keystone,
- flavor_metadata=flavor_metadata, image_metadata=image_metadata,
- log_level=log_level))
- suite.addTest(OSIntegrationTestCase.parameterize(
- CreateStackVolumeTests, os_creds=os_creds, ext_net_name=ext_net_name,
- use_keystone=use_keystone,
- flavor_metadata=flavor_metadata, image_metadata=image_metadata,
- log_level=log_level))
- suite.addTest(OSIntegrationTestCase.parameterize(
- CreateStackFlavorTests, os_creds=os_creds, ext_net_name=ext_net_name,
- use_keystone=use_keystone,
- flavor_metadata=flavor_metadata, image_metadata=image_metadata,
- log_level=log_level))
- suite.addTest(OSIntegrationTestCase.parameterize(
- CreateStackKeypairTests, os_creds=os_creds, ext_net_name=ext_net_name,
- use_keystone=use_keystone,
- flavor_metadata=flavor_metadata, image_metadata=image_metadata,
- log_level=log_level))
- suite.addTest(OSIntegrationTestCase.parameterize(
- CreateStackSecurityGroupTests, os_creds=os_creds,
- ext_net_name=ext_net_name, use_keystone=use_keystone,
- flavor_metadata=flavor_metadata, image_metadata=image_metadata,
- log_level=log_level))
- suite.addTest(OSIntegrationTestCase.parameterize(
- CreateStackNegativeTests, os_creds=os_creds, ext_net_name=ext_net_name,
- use_keystone=use_keystone,
- flavor_metadata=flavor_metadata, image_metadata=image_metadata,
- log_level=log_level))
-
- if use_floating_ips:
- suite.addTest(OSIntegrationTestCase.parameterize(
- CreateInstanceSingleNetworkTests, os_creds=os_creds,
- ext_net_name=ext_net_name, use_keystone=use_keystone,
- flavor_metadata=flavor_metadata, image_metadata=image_metadata,
- log_level=log_level))
- suite.addTest(OSIntegrationTestCase.parameterize(
- CreateStackFloatingIpTests, os_creds=os_creds,
- ext_net_name=ext_net_name, use_keystone=use_keystone,
- flavor_metadata=flavor_metadata, image_metadata=image_metadata,
- log_level=log_level))
- suite.addTest(OSIntegrationTestCase.parameterize(
- AnsibleProvisioningTests, os_creds=os_creds,
- ext_net_name=ext_net_name, use_keystone=use_keystone,
- flavor_metadata=flavor_metadata, image_metadata=image_metadata,
- log_level=log_level))
diff --git a/functest/opnfv_tests/openstack/snaps/snaps_test_runner.py b/functest/opnfv_tests/openstack/snaps/snaps_test_runner.py
deleted file mode 100644
index 6dc8288bf..000000000
--- a/functest/opnfv_tests/openstack/snaps/snaps_test_runner.py
+++ /dev/null
@@ -1,63 +0,0 @@
-# Copyright (c) 2017 Cable Television Laboratories, Inc. and others.
-#
-# This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-
-import logging
-
-from functest.core import unit
-from functest.opnfv_tests.openstack.snaps import snaps_utils
-from functest.utils.constants import CONST
-
-from snaps.openstack import create_flavor
-from snaps.openstack.tests import openstack_tests
-
-
-class SnapsTestRunner(unit.Suite):
- """
- This test executes the SNAPS Python Tests
- """
- def __init__(self, **kwargs):
- super(SnapsTestRunner, self).__init__(**kwargs)
- self.logger = logging.getLogger(__name__)
-
- if 'os_creds' in kwargs:
- self.os_creds = kwargs['os_creds']
- else:
- creds_override = None
- if hasattr(CONST, 'snaps_os_creds_override'):
- creds_override = CONST.__getattribute__(
- 'snaps_os_creds_override')
- self.os_creds = openstack_tests.get_credentials(
- os_env_file=CONST.__getattribute__('openstack_creds'),
- proxy_settings_str=None, ssh_proxy_cmd=None,
- overrides=creds_override)
-
- if 'ext_net_name' in kwargs:
- self.ext_net_name = kwargs['ext_net_name']
- else:
- self.ext_net_name = snaps_utils.get_ext_net_name(self.os_creds)
-
- self.netconf_override = None
- if hasattr(CONST, 'snaps_network_config'):
- self.netconf_override = CONST.__getattribute__(
- 'snaps_network_config')
-
- self.use_fip = (
- CONST.__getattribute__('snaps_use_floating_ips') == 'True')
- self.use_keystone = (
- CONST.__getattribute__('snaps_use_keystone') == 'True')
- scenario = CONST.__getattribute__('DEPLOY_SCENARIO')
-
- self.flavor_metadata = None
- if 'ovs' in scenario or 'fdio' in scenario:
- self.flavor_metadata = create_flavor.MEM_PAGE_SIZE_LARGE
-
- self.logger.info("Using flavor metadata '%s'", self.flavor_metadata)
-
- self.image_metadata = None
- if hasattr(CONST, 'snaps_images'):
- self.image_metadata = CONST.__getattribute__('snaps_images')
diff --git a/functest/opnfv_tests/openstack/snaps/snaps_utils.py b/functest/opnfv_tests/openstack/snaps/snaps_utils.py
deleted file mode 100644
index 284e88b51..000000000
--- a/functest/opnfv_tests/openstack/snaps/snaps_utils.py
+++ /dev/null
@@ -1,38 +0,0 @@
-# Copyright (c) 2015 All rights reserved
-# This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-
-from functest.utils.constants import CONST
-
-from snaps.openstack.utils import neutron_utils, nova_utils
-
-
-def get_ext_net_name(os_creds):
- """
- Returns the configured external network name or
- the first retrieved external network name
- :param: os_creds: an instance of snaps OSCreds object
- :return:
- """
- neutron = neutron_utils.neutron_client(os_creds)
- ext_nets = neutron_utils.get_external_networks(neutron)
- if (hasattr(CONST, 'EXTERNAL_NETWORK')):
- extnet_config = CONST.__getattribute__('EXTERNAL_NETWORK')
- for ext_net in ext_nets:
- if ext_net.name == extnet_config:
- return extnet_config
- return ext_nets[0].name if ext_nets else ""
-
-
-def get_active_compute_cnt(os_creds):
- """
- Returns the number of active compute servers
- :param: os_creds: an instance of snaps OSCreds object
- :return: the number of active compute servers
- """
- nova = nova_utils.nova_client(os_creds)
- computes = nova_utils.get_availability_zone_hosts(nova, zone_name='nova')
- return len(computes)
diff --git a/functest/opnfv_tests/openstack/tempest/conf_utils.py b/functest/opnfv_tests/openstack/tempest/conf_utils.py
deleted file mode 100644
index e61ab8138..000000000
--- a/functest/opnfv_tests/openstack/tempest/conf_utils.py
+++ /dev/null
@@ -1,352 +0,0 @@
-#!/usr/bin/env python
-#
-# Copyright (c) 2015 All rights reserved
-# This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-import ConfigParser
-import logging
-import fileinput
-import os
-import pkg_resources
-import shutil
-import subprocess
-
-import yaml
-
-from functest.utils.constants import CONST
-import functest.utils.functest_utils as ft_utils
-
-
-IMAGE_ID_ALT = None
-FLAVOR_ID_ALT = None
-RALLY_CONF_PATH = "/etc/rally/rally.conf"
-RALLY_AARCH64_PATCH_PATH = pkg_resources.resource_filename(
- 'functest', 'ci/rally_aarch64_patch.conf')
-GLANCE_IMAGE_PATH = os.path.join(
- CONST.__getattribute__('dir_functest_images'),
- CONST.__getattribute__('openstack_image_file_name'))
-TEMPEST_RESULTS_DIR = os.path.join(CONST.__getattribute__('dir_results'),
- 'tempest')
-TEMPEST_CUSTOM = pkg_resources.resource_filename(
- 'functest', 'opnfv_tests/openstack/tempest/custom_tests/test_list.txt')
-TEMPEST_BLACKLIST = pkg_resources.resource_filename(
- 'functest', 'opnfv_tests/openstack/tempest/custom_tests/blacklist.txt')
-TEMPEST_DEFCORE = pkg_resources.resource_filename(
- 'functest',
- 'opnfv_tests/openstack/tempest/custom_tests/defcore_req.txt')
-TEMPEST_RAW_LIST = os.path.join(TEMPEST_RESULTS_DIR, 'test_raw_list.txt')
-TEMPEST_LIST = os.path.join(TEMPEST_RESULTS_DIR, 'test_list.txt')
-REFSTACK_RESULTS_DIR = os.path.join(CONST.__getattribute__('dir_results'),
- 'refstack')
-TEMPEST_CONF_YAML = pkg_resources.resource_filename(
- 'functest', 'opnfv_tests/openstack/tempest/custom_tests/tempest_conf.yaml')
-TEST_ACCOUNTS_FILE = pkg_resources.resource_filename(
- 'functest',
- 'opnfv_tests/openstack/tempest/custom_tests/test_accounts.yaml')
-
-CI_INSTALLER_TYPE = CONST.__getattribute__('INSTALLER_TYPE')
-CI_INSTALLER_IP = CONST.__getattribute__('INSTALLER_IP')
-
-""" logging configuration """
-logger = logging.getLogger(__name__)
-
-
-def create_rally_deployment():
- # set the architecture to default
- pod_arch = os.getenv("POD_ARCH", None)
- arch_filter = ['aarch64']
-
- if pod_arch and pod_arch in arch_filter:
- logger.info("Apply aarch64 specific to rally config...")
- with open(RALLY_AARCH64_PATCH_PATH, "r") as f:
- rally_patch_conf = f.read()
-
- for line in fileinput.input(RALLY_CONF_PATH, inplace=1):
- print line,
- if "cirros|testvm" in line:
- print rally_patch_conf
-
- logger.info("Creating Rally environment...")
-
- cmd = "rally deployment destroy opnfv-rally"
- ft_utils.execute_command(cmd, error_msg=(
- "Deployment %s does not exist."
- % CONST.__getattribute__('rally_deployment_name')),
- verbose=False)
-
- cmd = ("rally deployment create --fromenv --name={0}"
- .format(CONST.__getattribute__('rally_deployment_name')))
- error_msg = "Problem while creating Rally deployment"
- ft_utils.execute_command_raise(cmd, error_msg=error_msg)
-
- cmd = "rally deployment check"
- error_msg = "OpenStack not responding or faulty Rally deployment."
- ft_utils.execute_command_raise(cmd, error_msg=error_msg)
-
-
-def create_verifier():
- logger.info("Create verifier from existing repo...")
- cmd = ("rally verify delete-verifier --id '{0}' --force").format(
- CONST.__getattribute__('tempest_verifier_name'))
- ft_utils.execute_command(cmd, error_msg=(
- "Verifier %s does not exist."
- % CONST.__getattribute__('tempest_verifier_name')),
- verbose=False)
- cmd = ("rally verify create-verifier --source {0} "
- "--name {1} --type tempest --system-wide"
- .format(CONST.__getattribute__('dir_repo_tempest'),
- CONST.__getattribute__('tempest_verifier_name')))
- ft_utils.execute_command_raise(cmd,
- error_msg='Problem while creating verifier')
-
-
-def get_verifier_id():
- """
- Returns verifier id for current Tempest
- """
- create_rally_deployment()
- create_verifier()
- cmd = ("rally verify list-verifiers | awk '/" +
- CONST.__getattribute__('tempest_verifier_name') +
- "/ {print $2}'")
- p = subprocess.Popen(cmd, shell=True,
- stdout=subprocess.PIPE,
- stderr=subprocess.STDOUT)
- deployment_uuid = p.stdout.readline().rstrip()
- if deployment_uuid == "":
- logger.error("Tempest verifier not found.")
- raise Exception('Error with command:%s' % cmd)
- return deployment_uuid
-
-
-def get_verifier_deployment_id():
- """
- Returns deployment id for active Rally deployment
- """
- cmd = ("rally deployment list | awk '/" +
- CONST.__getattribute__('rally_deployment_name') +
- "/ {print $2}'")
- p = subprocess.Popen(cmd, shell=True,
- stdout=subprocess.PIPE,
- stderr=subprocess.STDOUT)
- deployment_uuid = p.stdout.readline().rstrip()
- if deployment_uuid == "":
- logger.error("Rally deployment not found.")
- raise Exception('Error with command:%s' % cmd)
- return deployment_uuid
-
-
-def get_verifier_repo_dir(verifier_id):
- """
- Returns installed verifier repo directory for Tempest
- """
- if not verifier_id:
- verifier_id = get_verifier_id()
-
- return os.path.join(CONST.__getattribute__('dir_rally_inst'),
- 'verification',
- 'verifier-{}'.format(verifier_id),
- 'repo')
-
-
-def get_verifier_deployment_dir(verifier_id, deployment_id):
- """
- Returns Rally deployment directory for current verifier
- """
- if not verifier_id:
- verifier_id = get_verifier_id()
-
- if not deployment_id:
- deployment_id = get_verifier_deployment_id()
-
- return os.path.join(CONST.__getattribute__('dir_rally_inst'),
- 'verification',
- 'verifier-{}'.format(verifier_id),
- 'for-deployment-{}'.format(deployment_id))
-
-
-def backup_tempest_config(conf_file):
- """
- Copy config file to tempest results directory
- """
- if not os.path.exists(TEMPEST_RESULTS_DIR):
- os.makedirs(TEMPEST_RESULTS_DIR)
- shutil.copyfile(conf_file,
- os.path.join(TEMPEST_RESULTS_DIR, 'tempest.conf'))
-
-
-def configure_tempest(deployment_dir, image_id=None, flavor_id=None,
- compute_cnt=None):
- """
- Calls rally verify and updates the generated tempest.conf with
- given parameters
- """
- conf_file = configure_verifier(deployment_dir)
- configure_tempest_update_params(conf_file, image_id, flavor_id,
- compute_cnt)
-
-
-def configure_tempest_defcore(deployment_dir, image_id, flavor_id,
- image_id_alt, flavor_id_alt, tenant_id):
- """
- Add/update needed parameters into tempest.conf file
- """
- conf_file = configure_verifier(deployment_dir)
- configure_tempest_update_params(conf_file, image_id, flavor_id)
-
- logger.debug("Updating selected tempest.conf parameters for defcore...")
- config = ConfigParser.RawConfigParser()
- config.read(conf_file)
- config.set('DEFAULT', 'log_file', '{}/tempest.log'.format(deployment_dir))
- config.set('oslo_concurrency', 'lock_path',
- '{}/lock_files'.format(deployment_dir))
- generate_test_accounts_file(tenant_id=tenant_id)
- config.set('auth', 'test_accounts_file', TEST_ACCOUNTS_FILE)
- config.set('scenario', 'img_dir', '{}'.format(deployment_dir))
- config.set('scenario', 'img_file', 'tempest-image')
- config.set('compute', 'image_ref', image_id)
- config.set('compute', 'image_ref_alt', image_id_alt)
- config.set('compute', 'flavor_ref', flavor_id)
- config.set('compute', 'flavor_ref_alt', flavor_id_alt)
-
- with open(conf_file, 'wb') as config_file:
- config.write(config_file)
-
- confpath = pkg_resources.resource_filename(
- 'functest',
- 'opnfv_tests/openstack/refstack_client/refstack_tempest.conf')
- shutil.copyfile(conf_file, confpath)
-
-
-def generate_test_accounts_file(tenant_id):
- """
- Add needed tenant and user params into test_accounts.yaml
- """
-
- logger.debug("Add needed params into test_accounts.yaml...")
- accounts_list = [
- {
- 'tenant_name':
- CONST.__getattribute__('tempest_identity_tenant_name'),
- 'tenant_id': str(tenant_id),
- 'username': CONST.__getattribute__('tempest_identity_user_name'),
- 'password':
- CONST.__getattribute__('tempest_identity_user_password')
- }
- ]
-
- with open(TEST_ACCOUNTS_FILE, "w") as f:
- yaml.dump(accounts_list, f, default_flow_style=False)
-
-
-def configure_tempest_update_params(tempest_conf_file, image_id=None,
- flavor_id=None, compute_cnt=1):
- """
- Add/update needed parameters into tempest.conf file
- """
- logger.debug("Updating selected tempest.conf parameters...")
- config = ConfigParser.RawConfigParser()
- config.read(tempest_conf_file)
- config.set(
- 'compute',
- 'fixed_network_name',
- CONST.__getattribute__('tempest_private_net_name'))
- config.set('compute', 'volume_device_name',
- CONST.__getattribute__('tempest_volume_device_name'))
-
- if image_id is not None:
- config.set('compute', 'image_ref', image_id)
- if IMAGE_ID_ALT is not None:
- config.set('compute', 'image_ref_alt', IMAGE_ID_ALT)
- if CONST.__getattribute__('tempest_use_custom_flavors'):
- if flavor_id is not None:
- config.set('compute', 'flavor_ref', flavor_id)
- if FLAVOR_ID_ALT is not None:
- config.set('compute', 'flavor_ref_alt', FLAVOR_ID_ALT)
- if compute_cnt > 1:
- # enable multinode tests
- config.set('compute', 'min_compute_nodes', compute_cnt)
- config.set('compute-feature-enabled', 'live_migration', True)
-
- config.set('identity', 'region',
- CONST.__getattribute__('OS_REGION_NAME'))
- identity_api_version = os.getenv(
- "OS_IDENTITY_API_VERSION", os.getenv("IDENTITY_API_VERSION"))
- if (identity_api_version == '3'):
- auth_version = 'v3'
- else:
- auth_version = 'v2'
- config.set('identity', 'auth_version', auth_version)
- config.set(
- 'validation', 'ssh_timeout',
- CONST.__getattribute__('tempest_validation_ssh_timeout'))
- config.set('object-storage', 'operator_role',
- CONST.__getattribute__('tempest_object_storage_operator_role'))
-
- if CONST.__getattribute__('OS_ENDPOINT_TYPE') is not None:
- config.set('identity', 'v3_endpoint_type',
- CONST.__getattribute__('OS_ENDPOINT_TYPE'))
-
- if (identity_api_version == '3'):
- config.set('identity-feature-enabled', 'api_v2', False)
-
- if CONST.__getattribute__('OS_ENDPOINT_TYPE') is not None:
- sections = config.sections()
- services_list = ['compute',
- 'volume',
- 'image',
- 'network',
- 'data-processing',
- 'object-storage',
- 'orchestration']
- for service in services_list:
- if service not in sections:
- config.add_section(service)
- config.set(service, 'endpoint_type',
- CONST.__getattribute__('OS_ENDPOINT_TYPE'))
-
- logger.debug('Add/Update required params defined in tempest_conf.yaml '
- 'into tempest.conf file')
- with open(TEMPEST_CONF_YAML) as f:
- conf_yaml = yaml.safe_load(f)
- if conf_yaml:
- sections = config.sections()
- for section in conf_yaml:
- if section not in sections:
- config.add_section(section)
- sub_conf = conf_yaml.get(section)
- for key, value in sub_conf.items():
- config.set(section, key, value)
-
- with open(tempest_conf_file, 'wb') as config_file:
- config.write(config_file)
-
- backup_tempest_config(tempest_conf_file)
-
-
-def configure_verifier(deployment_dir):
- """
- Execute rally verify configure-verifier, which generates tempest.conf
- """
- tempest_conf_file = os.path.join(deployment_dir, "tempest.conf")
- if os.path.isfile(tempest_conf_file):
- logger.debug("Verifier is already configured.")
- logger.debug("Reconfiguring the current verifier...")
- cmd = "rally verify configure-verifier --reconfigure"
- else:
- logger.info("Configuring the verifier...")
- cmd = "rally verify configure-verifier"
- ft_utils.execute_command(cmd)
-
- logger.debug("Looking for tempest.conf file...")
- if not os.path.isfile(tempest_conf_file):
- logger.error("Tempest configuration file %s NOT found."
- % tempest_conf_file)
- raise Exception("Tempest configuration file %s NOT found."
- % tempest_conf_file)
- else:
- return tempest_conf_file
diff --git a/functest/opnfv_tests/openstack/tempest/custom_tests/blacklist.txt b/functest/opnfv_tests/openstack/tempest/custom_tests/blacklist.txt
deleted file mode 100644
index bb1aed339..000000000
--- a/functest/opnfv_tests/openstack/tempest/custom_tests/blacklist.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-
--
diff --git a/functest/opnfv_tests/openstack/tempest/custom_tests/blacklist.yaml b/functest/opnfv_tests/openstack/tempest/custom_tests/blacklist.yaml
new file mode 100644
index 000000000..43a77fa3c
--- /dev/null
+++ b/functest/opnfv_tests/openstack/tempest/custom_tests/blacklist.yaml
@@ -0,0 +1,19 @@
+---
+-
+ scenarios:
+ - os-ovn-nofeature-ha
+ - os-ovn-nofeature-noha
+ tests:
+ - neutron_tempest_plugin.api.admin.test_dhcp_agent_scheduler
+ - neutron_tempest_plugin.api.admin.test_ports.PortTestCasesResourceRequest.test_port_resource_request
+ - neutron_tempest_plugin.api.admin.test_ports.PortTestCasesResourceRequest.test_port_resource_request_empty
+ - neutron_tempest_plugin.api.admin.test_ports.PortTestCasesResourceRequest.test_port_resource_request_inherited_policy
+ - neutron_tempest_plugin.api.admin.test_ports.PortTestCasesResourceRequest.test_port_resource_request_no_provider_net_conflict
+ - neutron_tempest_plugin.api.test_ports.PortsTestJSON.test_create_update_port_with_dns_name
+ - patrole_tempest_plugin.tests.api.network.test_availability_zones_rbac.AvailabilityZoneExtRbacTest.test_list_availability_zone_rbac
+ - patrole_tempest_plugin.tests.api.network.test_agents_rbac.DHCPAgentSchedulersRbacTest.test_add_dhcp_agent_to_network
+ - patrole_tempest_plugin.tests.api.network.test_agents_rbac.DHCPAgentSchedulersRbacTest.test_delete_network_from_dhcp_agent
+ - patrole_tempest_plugin.tests.api.network.test_agents_rbac.DHCPAgentSchedulersRbacTest.test_list_networks_hosted_by_one_dhcp_agent
+ - patrole_tempest_plugin.tests.api.network.test_networks_rbac.NetworksRbacTest.test_create_network_provider_network_type
+ - patrole_tempest_plugin.tests.api.network.test_networks_rbac.NetworksRbacTest.test_create_network_provider_segmentation_id
+ - tempest.api.network.admin.test_dhcp_agent_scheduler
diff --git a/functest/opnfv_tests/openstack/tempest/custom_tests/public_blacklist.yaml b/functest/opnfv_tests/openstack/tempest/custom_tests/public_blacklist.yaml
new file mode 100644
index 000000000..e53b577b2
--- /dev/null
+++ b/functest/opnfv_tests/openstack/tempest/custom_tests/public_blacklist.yaml
@@ -0,0 +1,15 @@
+---
+-
+ scenarios:
+ - os-*
+ tests:
+ - neutron_tempest_plugin.api.admin.test_floating_ips_admin_actions.FloatingIPAdminTestJSON.test_associate_floating_ip_with_port_from_another_project
+ - neutron_tempest_plugin.api.admin.test_quotas.QuotasTest.test_detail_quotas
+ - neutron_tempest_plugin.api.admin.test_quotas.QuotasTest.test_quotas
+ - neutron_tempest_plugin.api.admin.test_quotas_negative.QuotasAdminNegativeTestJSON.test_create_floatingip_when_quotas_is_full
+ - neutron_tempest_plugin.api.admin.test_quotas_negative.QuotasAdminNegativeTestJSON.test_create_network_when_quotas_is_full
+ - neutron_tempest_plugin.api.admin.test_quotas_negative.QuotasAdminNegativeTestJSON.test_create_port_when_quotas_is_full
+ - neutron_tempest_plugin.api.admin.test_quotas_negative.QuotasAdminNegativeTestJSON.test_create_router_when_quotas_is_full
+ - neutron_tempest_plugin.api.admin.test_quotas_negative.QuotasAdminNegativeTestJSON.test_create_security_group_rule_when_quotas_is_full
+ - neutron_tempest_plugin.api.admin.test_quotas_negative.QuotasAdminNegativeTestJSON.test_create_security_group_when_quotas_is_full
+ - neutron_tempest_plugin.api.admin.test_quotas_negative.QuotasAdminNegativeTestJSON.test_create_subnet_when_quotas_is_full
diff --git a/functest/opnfv_tests/openstack/tempest/custom_tests/tempest_conf.yaml b/functest/opnfv_tests/openstack/tempest/custom_tests/tempest_conf.yaml
index b47a9736a..0ee4ab613 100644
--- a/functest/opnfv_tests/openstack/tempest/custom_tests/tempest_conf.yaml
+++ b/functest/opnfv_tests/openstack/tempest/custom_tests/tempest_conf.yaml
@@ -1,13 +1,104 @@
-# This is an empty configuration file to be filled up with the desired options
-# to generate a custom tempest.conf
-# Examples:
-# network-feature-enabled:
-# port_security: True
-
-# volume-feature-enabled:
-# api_v1: False
-
-# validation:
-# image_ssh_user: root
-# ssh_timeout: 300
-
+---
+compute:
+ min_microversion: '2.44'
+ max_microversion: latest
+compute-feature-enabled:
+ attach_encrypted_volume: false
+ block_migration_for_live_migration: false
+ block_migrate_cinder_iscsi: false
+ change_password: false
+ cold_migration: true
+ config_drive: true
+ console_output: true
+ disk_config: true
+ enable_instance_password: true
+ hostname_fqdn_sanitization: true
+ interface_attach: true
+ live_migration: true
+ live_migrate_back_and_forth: false
+ metadata_service: true
+ pause: true
+ personality: false
+ rdp_console: false
+ rescue: true
+ resize: true
+ scheduler_available_filters: "AvailabilityZoneFilter,ComputeFilter,\
+ ComputeCapabilitiesFilter,ImagePropertiesFilter,ServerGroupAntiAffinityFilter,\
+ ServerGroupAffinityFilter,SameHostFilter,DifferentHostFilter"
+ serial_console: false
+ shelve: true
+ snapshot: true
+ spice_console: false
+ suspend: true
+ swap_volume: false
+ vnc_console: true
+ volume_backed_live_migration: false
+ volume_multiattach: false
+identity:
+ auth_version: v3
+ user_unique_last_password_count: 2
+ user_lockout_duration: 10
+ user_lockout_failure_attempts: 2
+identity-feature-enabled:
+ trust: true
+ api_v2: false
+ api_v2_admin: false
+ security_compliance: true
+ federation: false
+ external_idp: false
+ project_tags: true
+ application_credentials: true
+ access_rules: true
+image-feature-enabled:
+ api_v2: true
+ api_v1: false
+ import_image: false
+network-feature-enabled:
+ port_admin_state_change: true
+ port_security: true
+placement:
+ max_microversion: latest
+validation:
+ image_ssh_user: cirros
+ ssh_timeout: 196
+ ip_version_for_ssh: 4
+ run_validation: true
+volume:
+ max_microversion: latest
+ storage_protocol: ceph
+ manage_volume_ref: source-name,volume-%s
+ manage_snapshot_ref: source-name,snapshot-%s
+volume-feature-enabled:
+ multi_backend: false
+ backup: true
+ snapshot: true
+ clone: true
+ manage_snapshot: true
+ manage_volume: true
+ extend_attached_volume: true
+ extend_attached_encrypted_volume: false
+ consistency_group: false
+ volume_revert: true
+load_balancer:
+ test_with_ipv6: false
+neutron_plugin_options:
+ agent_availability_zone: nova
+ available_type_drivers: flat,geneve,vlan,gre,local,vxlan
+ provider_vlans: public,
+ create_shared_resources: true
+object-storage-feature-enabled:
+ discoverable_apis: "account_quotas,formpost,bulk_upload,bulk_delete,\
+ tempurl,crossdomain,container_quotas,staticweb,account_quotas,slo"
+ object_versioning: true
+ discoverability: true
+ tempurl_digest_hashlib: sha1
+heat_plugin:
+ skip_functional_test_list: EncryptionVolTypeTest
+ skip_scenario_test_list: "AodhAlarmTest,SoftwareConfigIntegrationTest,\
+ VolumeBackupRestoreIntegrationTest,CfnInitIntegrationTest,\
+ LoadBalancerTest"
+ auth_version: 3
+heat_features_enabled:
+ multi_cloud: false
+rbac:
+ enable_rbac: true
diff --git a/functest/opnfv_tests/openstack/tempest/custom_tests/tempest_conf_ovn.yaml b/functest/opnfv_tests/openstack/tempest/custom_tests/tempest_conf_ovn.yaml
new file mode 100644
index 000000000..6b09d8e5a
--- /dev/null
+++ b/functest/opnfv_tests/openstack/tempest/custom_tests/tempest_conf_ovn.yaml
@@ -0,0 +1,104 @@
+---
+compute:
+ min_microversion: '2.44'
+ max_microversion: latest
+compute-feature-enabled:
+ attach_encrypted_volume: false
+ block_migration_for_live_migration: false
+ block_migrate_cinder_iscsi: false
+ change_password: false
+ cold_migration: true
+ config_drive: true
+ console_output: true
+ disk_config: true
+ enable_instance_password: true
+ hostname_fqdn_sanitization: true
+ interface_attach: true
+ live_migration: true
+ live_migrate_back_and_forth: false
+ metadata_service: true
+ pause: true
+ personality: false
+ rdp_console: false
+ rescue: true
+ resize: true
+ scheduler_available_filters: "AvailabilityZoneFilter,ComputeFilter,\
+ ComputeCapabilitiesFilter,ImagePropertiesFilter,ServerGroupAntiAffinityFilter,\
+ ServerGroupAffinityFilter,SameHostFilter,DifferentHostFilter"
+ serial_console: false
+ shelve: true
+ snapshot: true
+ spice_console: false
+ suspend: true
+ swap_volume: false
+ vnc_console: true
+ volume_backed_live_migration: false
+ volume_multiattach: false
+identity:
+ auth_version: v3
+ user_unique_last_password_count: 2
+ user_lockout_duration: 10
+ user_lockout_failure_attempts: 2
+identity-feature-enabled:
+ trust: true
+ api_v2: false
+ api_v2_admin: false
+ security_compliance: true
+ federation: false
+ external_idp: false
+ project_tags: true
+ application_credentials: true
+ access_rules: true
+image-feature-enabled:
+ api_v2: true
+ api_v1: false
+ import_image: false
+network-feature-enabled:
+ port_admin_state_change: true
+ port_security: true
+placement:
+ max_microversion: latest
+validation:
+ image_ssh_user: cirros
+ ssh_timeout: 196
+ ip_version_for_ssh: 4
+ run_validation: true
+volume:
+ max_microversion: latest
+ storage_protocol: ceph
+ manage_volume_ref: source-name,volume-%s
+ manage_snapshot_ref: source-name,snapshot-%s
+volume-feature-enabled:
+ multi_backend: false
+ backup: true
+ snapshot: true
+ clone: true
+ manage_snapshot: true
+ manage_volume: true
+ extend_attached_volume: true
+ extend_attached_encrypted_volume: false
+ consistency_group: false
+ volume_revert: true
+load_balancer:
+ test_with_ipv6: false
+neutron_plugin_options:
+ agent_availability_zone: nova
+ available_type_drivers: flat,geneve,vlan,local
+ provider_vlans: public,
+ create_shared_resources: true
+object-storage-feature-enabled:
+ discoverable_apis: "account_quotas,formpost,bulk_upload,bulk_delete,\
+ tempurl,crossdomain,container_quotas,staticweb,account_quotas,slo"
+ object_versioning: true
+ discoverability: true
+ tempurl_digest_hashlib: sha1
+heat_plugin:
+ skip_functional_test_list: EncryptionVolTypeTest
+ skip_scenario_test_list: "AodhAlarmTest,SoftwareConfigIntegrationTest,\
+ VolumeBackupRestoreIntegrationTest,CfnInitIntegrationTest,\
+ LoadBalancerTest"
+ auth_version: 3
+heat_features_enabled:
+ multi_cloud: false
+rbac:
+ enable_rbac: true
diff --git a/functest/opnfv_tests/openstack/tempest/tempest.py b/functest/opnfv_tests/openstack/tempest/tempest.py
index 5481b13b1..7233ffd60 100644
--- a/functest/opnfv_tests/openstack/tempest/tempest.py
+++ b/functest/opnfv_tests/openstack/tempest/tempest.py
@@ -8,493 +8,767 @@
# http://www.apache.org/licenses/LICENSE-2.0
#
+"""Tempest testcases implementation."""
+
from __future__ import division
+import json
import logging
import os
import re
import shutil
import subprocess
import time
-import uuid
+import pkg_resources
+from six.moves import configparser
+from xtesting.core import testcase
import yaml
-from functest.core import testcase
-from functest.opnfv_tests.openstack.snaps import snaps_utils
-from functest.opnfv_tests.openstack.tempest import conf_utils
-from functest.utils.constants import CONST
-import functest.utils.functest_utils as ft_utils
+from functest.core import singlevm
+from functest.opnfv_tests.openstack.rally import rally
+from functest.utils import config
+from functest.utils import env
+from functest.utils import functest_utils
+
+LOGGER = logging.getLogger(__name__)
+
+
+class TempestCommon(singlevm.VmReady2):
+ # pylint: disable=too-many-instance-attributes,too-many-public-methods
+ """TempestCommon testcases implementation class."""
+
+ visibility = 'public'
+ filename_alt = '/home/opnfv/functest/images/cirros-0.6.1-x86_64-disk.img'
+ shared_network = True
+ tempest_conf_yaml = pkg_resources.resource_filename(
+ 'functest',
+ 'opnfv_tests/openstack/tempest/custom_tests/tempest_conf.yaml')
+ tempest_custom = pkg_resources.resource_filename(
+ 'functest',
+ 'opnfv_tests/openstack/tempest/custom_tests/test_list.txt')
+ tempest_blacklist = pkg_resources.resource_filename(
+ 'functest',
+ 'opnfv_tests/openstack/tempest/custom_tests/blacklist.yaml')
+ tempest_public_blacklist = pkg_resources.resource_filename(
+ 'functest',
+ 'opnfv_tests/openstack/tempest/custom_tests/public_blacklist.yaml')
-from snaps.config.flavor import FlavorConfig
-from snaps.config.network import NetworkConfig, SubnetConfig
-from snaps.config.project import ProjectConfig
-from snaps.config.user import UserConfig
+ def __init__(self, **kwargs):
+ if "case_name" not in kwargs:
+ kwargs["case_name"] = 'tempest'
+ super().__init__(**kwargs)
+ assert self.orig_cloud
+ assert self.cloud
+ assert self.project
+ if self.orig_cloud.get_role("admin"):
+ self.role_name = "admin"
+ elif self.orig_cloud.get_role("Admin"):
+ self.role_name = "Admin"
+ else:
+ raise Exception("Cannot detect neither admin nor Admin")
+ self.orig_cloud.grant_role(
+ self.role_name, user=self.project.user.id,
+ project=self.project.project.id,
+ domain=self.project.domain.id)
+ self.orig_cloud.grant_role(
+ self.role_name, user=self.project.user.id,
+ domain=self.project.domain.id)
+ self.deployment_id = None
+ self.verifier_id = None
+ self.verifier_repo_dir = None
+ self.deployment_dir = None
+ self.verification_id = None
+ self.res_dir = os.path.join(
+ getattr(config.CONF, 'dir_results'), self.case_name)
+ self.raw_list = os.path.join(self.res_dir, 'test_raw_list.txt')
+ self.list = os.path.join(self.res_dir, 'test_list.txt')
+ self.conf_file = None
+ self.image_alt = None
+ self.flavor_alt = None
+ self.services = []
+ try:
+ self.services = kwargs['run']['args']['services']
+ except Exception: # pylint: disable=broad-except
+ pass
+ self.neutron_extensions = []
+ try:
+ self.neutron_extensions = kwargs['run']['args'][
+ 'neutron_extensions']
+ except Exception: # pylint: disable=broad-except
+ pass
+ self.deny_skipping = kwargs.get("deny_skipping", False)
+ self.tests_count = kwargs.get("tests_count", 0)
+
+ def check_services(self):
+ """Check the mandatory services."""
+ for service in self.services:
+ try:
+ self.cloud.search_services(service)[0]
+ except Exception: # pylint: disable=broad-except
+ self.is_skipped = True
+ break
-from snaps.openstack import create_flavor
-from snaps.openstack.create_flavor import OpenStackFlavor
-from snaps.openstack.tests import openstack_tests
-from snaps.openstack.utils import deploy_utils
+ def check_extensions(self):
+ """Check the mandatory network extensions."""
+ extensions = self.cloud.get_network_extensions()
+ for network_extension in self.neutron_extensions:
+ if network_extension not in extensions:
+ LOGGER.warning(
+ "Cannot find Neutron extension: %s", network_extension)
+ self.is_skipped = True
+ break
+ def check_requirements(self):
+ self.check_services()
+ self.check_extensions()
+ if self.is_skipped:
+ self.project.clean()
-""" logging configuration """
-logger = logging.getLogger(__name__)
+ @staticmethod
+ def read_file(filename):
+ """Read file and return content as a stripped list."""
+ with open(filename, encoding='utf-8') as src:
+ return [line.strip() for line in src.readlines()]
+ @staticmethod
+ def get_verifier_result(verif_id):
+ """Retrieve verification results."""
+ result = {
+ 'num_tests': 0,
+ 'num_success': 0,
+ 'num_failures': 0,
+ 'num_skipped': 0
+ }
+ cmd = ["rally", "verify", "show", "--uuid", verif_id]
+ LOGGER.info("Showing result for a verification: '%s'.", cmd)
+ with subprocess.Popen(
+ cmd, stdout=subprocess.PIPE,
+ stderr=subprocess.STDOUT) as proc:
+ for line in proc.stdout:
+ LOGGER.info(line.decode("utf-8").rstrip())
+ new_line = line.decode("utf-8").replace(' ', '').split('|')
+ if 'Tests' in new_line:
+ break
+ if 'Testscount' in new_line:
+ result['num_tests'] = int(new_line[2])
+ elif 'Success' in new_line:
+ result['num_success'] = int(new_line[2])
+ elif 'Skipped' in new_line:
+ result['num_skipped'] = int(new_line[2])
+ elif 'Failures' in new_line:
+ result['num_failures'] = int(new_line[2])
+ return result
-class TempestCommon(testcase.TestCase):
+ @staticmethod
+ def backup_tempest_config(conf_file, res_dir):
+ """
+ Copy config file to tempest results directory
+ """
+ if not os.path.exists(res_dir):
+ os.makedirs(res_dir)
+ shutil.copyfile(conf_file,
+ os.path.join(res_dir, 'tempest.conf'))
- def __init__(self, **kwargs):
- super(TempestCommon, self).__init__(**kwargs)
- self.resources = TempestResourcesManager(**kwargs)
- self.MODE = ""
- self.OPTION = ""
- self.VERIFIER_ID = conf_utils.get_verifier_id()
- self.VERIFIER_REPO_DIR = conf_utils.get_verifier_repo_dir(
- self.VERIFIER_ID)
- self.DEPLOYMENT_ID = conf_utils.get_verifier_deployment_id()
- self.DEPLOYMENT_DIR = conf_utils.get_verifier_deployment_dir(
- self.VERIFIER_ID, self.DEPLOYMENT_ID)
- self.VERIFICATION_ID = None
+ @staticmethod
+ def create_verifier():
+ """Create new verifier"""
+ LOGGER.info("Create verifier from existing repo...")
+ cmd = ['rally', 'verify', 'delete-verifier',
+ '--id', str(getattr(config.CONF, 'tempest_verifier_name')),
+ '--force']
+ try:
+ output = subprocess.check_output(cmd)
+ LOGGER.info("%s\n%s", " ".join(cmd), output.decode("utf-8"))
+ except subprocess.CalledProcessError:
+ pass
+
+ cmd = ['rally', 'verify', 'create-verifier',
+ '--source', str(getattr(config.CONF, 'dir_repo_tempest')),
+ '--name', str(getattr(config.CONF, 'tempest_verifier_name')),
+ '--type', 'tempest', '--system-wide']
+ output = subprocess.check_output(cmd)
+ LOGGER.info("%s\n%s", " ".join(cmd), output.decode("utf-8"))
+ return TempestCommon.get_verifier_id()
@staticmethod
- def read_file(filename):
- with open(filename) as src:
- return [line.strip() for line in src.readlines()]
+ def get_verifier_id():
+ """
+ Returns verifier id for current Tempest
+ """
+ cmd = ("rally verify list-verifiers | awk '/" +
+ getattr(config.CONF, 'tempest_verifier_name') +
+ "/ {print $2}'")
+ with subprocess.Popen(
+ cmd, shell=True, stdout=subprocess.PIPE,
+ stderr=subprocess.DEVNULL) as proc:
+ verifier_uuid = proc.stdout.readline().rstrip()
+ return verifier_uuid.decode("utf-8")
- def generate_test_list(self, verifier_repo_dir):
- logger.debug("Generating test case list...")
- if self.MODE == 'defcore':
- shutil.copyfile(
- conf_utils.TEMPEST_DEFCORE, conf_utils.TEMPEST_RAW_LIST)
- elif self.MODE == 'custom':
- if os.path.isfile(conf_utils.TEMPEST_CUSTOM):
+ @staticmethod
+ def get_verifier_repo_dir(verifier_id):
+ """
+ Returns installed verifier repo directory for Tempest
+ """
+ return os.path.join(getattr(config.CONF, 'dir_rally_inst'),
+ 'verification',
+ f'verifier-{verifier_id}',
+ 'repo')
+
+ @staticmethod
+ def get_verifier_deployment_dir(verifier_id, deployment_id):
+ """
+ Returns Rally deployment directory for current verifier
+ """
+ return os.path.join(getattr(config.CONF, 'dir_rally_inst'),
+ 'verification',
+ f'verifier-{verifier_id}',
+ f'for-deployment-{deployment_id}')
+
+ @staticmethod
+ def update_tempest_conf_file(conf_file, rconfig):
+ """Update defined paramters into tempest config file"""
+ with open(TempestCommon.tempest_conf_yaml, encoding='utf-8') as yfile:
+ conf_yaml = yaml.safe_load(yfile)
+ if conf_yaml:
+ sections = rconfig.sections()
+ for section in conf_yaml:
+ if section not in sections:
+ rconfig.add_section(section)
+ sub_conf = conf_yaml.get(section)
+ for key, value in sub_conf.items():
+ rconfig.set(section, key, value)
+
+ with open(conf_file, 'w', encoding='utf-8') as config_file:
+ rconfig.write(config_file)
+
+ @staticmethod
+ def configure_tempest_update_params(
+ tempest_conf_file, image_id=None, flavor_id=None,
+ compute_cnt=1, image_alt_id=None, flavor_alt_id=None,
+ admin_role_name='admin', cidr='192.168.120.0/24',
+ domain_id='default'):
+ # pylint: disable=too-many-branches,too-many-arguments
+ # pylint: disable=too-many-statements,too-many-locals
+ """
+ Add/update needed parameters into tempest.conf file
+ """
+ LOGGER.debug("Updating selected tempest.conf parameters...")
+ rconfig = configparser.RawConfigParser()
+ rconfig.read(tempest_conf_file)
+ rconfig.set(
+ 'compute', 'volume_device_name', env.get('VOLUME_DEVICE_NAME'))
+ if image_id is not None:
+ rconfig.set('compute', 'image_ref', image_id)
+ if image_alt_id is not None:
+ rconfig.set('compute', 'image_ref_alt', image_alt_id)
+ if flavor_id is not None:
+ rconfig.set('compute', 'flavor_ref', flavor_id)
+ if flavor_alt_id is not None:
+ rconfig.set('compute', 'flavor_ref_alt', flavor_alt_id)
+ if compute_cnt > 1:
+ # enable multinode tests
+ rconfig.set('compute', 'min_compute_nodes', compute_cnt)
+ rconfig.set('compute-feature-enabled', 'live_migration', True)
+ if os.environ.get('OS_REGION_NAME'):
+ rconfig.set('identity', 'region', os.environ.get('OS_REGION_NAME'))
+ rconfig.set('identity', 'admin_role', admin_role_name)
+ rconfig.set('identity', 'default_domain_id', domain_id)
+ if not rconfig.has_section('network'):
+ rconfig.add_section('network')
+ rconfig.set('network', 'default_network', cidr)
+ rconfig.set('network', 'project_network_cidr', cidr)
+ rconfig.set('network', 'project_networks_reachable', False)
+ rconfig.set(
+ 'identity', 'v3_endpoint_type',
+ os.environ.get('OS_INTERFACE', 'public'))
+
+ sections = rconfig.sections()
+ services_list = [
+ 'compute', 'volume', 'image', 'network', 'data-processing',
+ 'object-storage', 'orchestration']
+ for service in services_list:
+ if service not in sections:
+ rconfig.add_section(service)
+ rconfig.set(service, 'endpoint_type',
+ os.environ.get('OS_INTERFACE', 'public'))
+
+ LOGGER.debug('Add/Update required params defined in tempest_conf.yaml '
+ 'into tempest.conf file')
+ TempestCommon.update_tempest_conf_file(tempest_conf_file, rconfig)
+
+ @staticmethod
+ def configure_verifier(deployment_dir):
+ """
+ Execute rally verify configure-verifier, which generates tempest.conf
+ """
+ cmd = ['rally', 'verify', 'configure-verifier', '--reconfigure',
+ '--id', str(getattr(config.CONF, 'tempest_verifier_name'))]
+ output = subprocess.check_output(cmd)
+ LOGGER.info("%s\n%s", " ".join(cmd), output.decode("utf-8"))
+
+ LOGGER.debug("Looking for tempest.conf file...")
+ tempest_conf_file = os.path.join(deployment_dir, "tempest.conf")
+ if not os.path.isfile(tempest_conf_file):
+ LOGGER.error("Tempest configuration file %s NOT found.",
+ tempest_conf_file)
+ return None
+ return tempest_conf_file
+
+ def generate_test_list(self, **kwargs):
+ """Generate test list based on the test mode."""
+ LOGGER.debug("Generating test case list...")
+ self.backup_tempest_config(self.conf_file, '/etc')
+ if kwargs.get('mode') == 'custom':
+ if os.path.isfile(self.tempest_custom):
shutil.copyfile(
- conf_utils.TEMPEST_CUSTOM, conf_utils.TEMPEST_RAW_LIST)
+ self.tempest_custom, self.list)
else:
- raise Exception("Tempest test list file %s NOT found."
- % conf_utils.TEMPEST_CUSTOM)
+ raise Exception(
+ f"Tempest test list file {self.tempest_custom} NOT found.")
else:
- if self.MODE == 'smoke':
- testr_mode = "smoke"
- elif self.MODE == 'full':
- testr_mode = ""
- else:
- testr_mode = 'tempest.api.' + self.MODE
- cmd = ("cd {0};"
- "testr list-tests {1} > {2};"
- "cd -;".format(verifier_repo_dir,
- testr_mode,
- conf_utils.TEMPEST_RAW_LIST))
- ft_utils.execute_command(cmd)
-
- def apply_tempest_blacklist(self):
- logger.debug("Applying tempest blacklist...")
- cases_file = self.read_file(conf_utils.TEMPEST_RAW_LIST)
- result_file = open(conf_utils.TEMPEST_LIST, 'w')
- black_tests = []
- try:
- installer_type = CONST.__getattribute__('INSTALLER_TYPE')
- deploy_scenario = CONST.__getattribute__('DEPLOY_SCENARIO')
- if (bool(installer_type) * bool(deploy_scenario)):
- # if INSTALLER_TYPE and DEPLOY_SCENARIO are set we read the
- # file
- black_list_file = open(conf_utils.TEMPEST_BLACKLIST)
- black_list_yaml = yaml.safe_load(black_list_file)
- black_list_file.close()
- for item in black_list_yaml:
- scenarios = item['scenarios']
- installers = item['installers']
- if (deploy_scenario in scenarios and
- installer_type in installers):
- tests = item['tests']
- for test in tests:
- black_tests.append(test)
- break
- except Exception:
+ testr_mode = kwargs.get(
+ 'mode', r'^tempest\.(api|scenario).*\[.*\bsmoke\b.*\]$')
+ cmd = (f"(cd {self.verifier_repo_dir}; "
+ f"stestr list '{testr_mode}' > {self.list} 2>/dev/null)")
+ output = subprocess.check_output(cmd, shell=True)
+ LOGGER.info("%s\n%s", cmd, output.decode("utf-8"))
+ os.remove('/etc/tempest.conf')
+
+ def apply_tempest_blacklist(self, black_list):
+ """Exclude blacklisted test cases."""
+ LOGGER.debug("Applying tempest blacklist...")
+ if os.path.exists(self.raw_list):
+ os.remove(self.raw_list)
+ os.rename(self.list, self.raw_list)
+ cases_file = self.read_file(self.raw_list)
+ with open(self.list, 'w', encoding='utf-8') as result_file:
black_tests = []
- logger.debug("Tempest blacklist file does not exist.")
-
- for cases_line in cases_file:
- for black_tests_line in black_tests:
- if black_tests_line in cases_line:
- break
- else:
- result_file.write(str(cases_line) + '\n')
- result_file.close()
-
- def run_verifier_tests(self):
- self.OPTION += (" --load-list {} --detailed"
- .format(conf_utils.TEMPEST_LIST))
-
- cmd_line = "rally verify start " + self.OPTION
- logger.info("Starting Tempest test suite: '%s'." % cmd_line)
-
- header = ("Tempest environment:\n"
- " SUT: %s\n Scenario: %s\n Node: %s\n Date: %s\n" %
- (CONST.__getattribute__('INSTALLER_TYPE'),
- CONST.__getattribute__('DEPLOY_SCENARIO'),
- CONST.__getattribute__('NODE_NAME'),
- time.strftime("%a %b %d %H:%M:%S %Z %Y")))
-
- f_stdout = open(
- os.path.join(conf_utils.TEMPEST_RESULTS_DIR, "tempest.log"), 'w+')
- f_stderr = open(
- os.path.join(conf_utils.TEMPEST_RESULTS_DIR,
- "tempest-error.log"), 'w+')
- f_env = open(os.path.join(conf_utils.TEMPEST_RESULTS_DIR,
- "environment.log"), 'w+')
- f_env.write(header)
-
- p = subprocess.Popen(
- cmd_line, shell=True,
- stdout=subprocess.PIPE,
- stderr=f_stderr,
- bufsize=1)
-
- with p.stdout:
- for line in iter(p.stdout.readline, b''):
- if re.search("\} tempest\.", line):
- logger.info(line.replace('\n', ''))
- elif re.search('Starting verification', line):
- logger.info(line.replace('\n', ''))
- first_pos = line.index("UUID=") + len("UUID=")
- last_pos = line.index(") for deployment")
- self.VERIFICATION_ID = line[first_pos:last_pos]
- logger.debug('Verification UUID: %s', self.VERIFICATION_ID)
- f_stdout.write(line)
- p.wait()
-
- f_stdout.close()
- f_stderr.close()
- f_env.close()
-
- def parse_verifier_result(self):
- if self.VERIFICATION_ID is None:
+ try:
+ deploy_scenario = env.get('DEPLOY_SCENARIO')
+ if bool(deploy_scenario):
+ # if DEPLOY_SCENARIO is set we read the file
+ with open(black_list, encoding='utf-8') as black_list_file:
+ black_list_yaml = yaml.safe_load(black_list_file)
+ black_list_file.close()
+ for item in black_list_yaml:
+ scenarios = item['scenarios']
+ in_it = rally.RallyBase.in_iterable_re
+ if in_it(deploy_scenario, scenarios):
+ tests = item['tests']
+ black_tests.extend(tests)
+ except Exception: # pylint: disable=broad-except
+ black_tests = []
+ LOGGER.debug("Tempest blacklist file does not exist.")
+
+ for cases_line in cases_file:
+ for black_tests_line in black_tests:
+ if re.search(black_tests_line, cases_line):
+ break
+ else:
+ result_file.write(str(cases_line) + '\n')
+
+ def run_verifier_tests(self, **kwargs):
+ """Execute tempest test cases."""
+ cmd = ["rally", "verify", "start", "--load-list",
+ self.list]
+ cmd.extend(kwargs.get('option', []))
+ LOGGER.info("Starting Tempest test suite: '%s'.", cmd)
+
+ with open(
+ os.path.join(self.res_dir, "tempest.log"), 'w+',
+ encoding='utf-8') as f_stdout:
+ with subprocess.Popen(
+ cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT,
+ bufsize=1) as proc:
+ with proc.stdout:
+ for line in iter(proc.stdout.readline, b''):
+ if re.search(r"\} tempest\.", line.decode("utf-8")):
+ LOGGER.info(line.rstrip())
+ elif re.search(r'(?=\(UUID=(.*)\))',
+ line.decode("utf-8")):
+ self.verification_id = re.search(
+ r'(?=\(UUID=(.*)\))',
+ line.decode("utf-8")).group(1)
+ f_stdout.write(line.decode("utf-8"))
+ proc.wait()
+
+ if self.verification_id is None:
raise Exception('Verification UUID not found')
+ LOGGER.info('Verification UUID: %s', self.verification_id)
- cmd_line = "rally verify show --uuid {}".format(self.VERIFICATION_ID)
- logger.info("Showing result for a verification: '%s'." % cmd_line)
- p = subprocess.Popen(cmd_line,
- shell=True,
- stdout=subprocess.PIPE,
- stderr=subprocess.STDOUT)
- for line in p.stdout:
- new_line = line.replace(' ', '').split('|')
- if 'Tests' in new_line:
- break
-
- logger.info(line)
- if 'Testscount' in new_line:
- num_tests = new_line[2]
- elif 'Success' in new_line:
- num_success = new_line[2]
- elif 'Skipped' in new_line:
- num_skipped = new_line[2]
- elif 'Failures' in new_line:
- num_failures = new_line[2]
+ shutil.copy(
+ f"{self.deployment_dir}/tempest.log",
+ f"{self.res_dir}/tempest.debug.log")
+ def parse_verifier_result(self):
+ """Parse and save test results."""
+ stat = self.get_verifier_result(self.verification_id)
try:
- num_executed = int(num_tests) - int(num_skipped)
+ num_executed = stat['num_tests'] - stat['num_skipped']
try:
- self.result = 100 * int(num_success) / int(num_executed)
+ self.result = 100 * stat['num_success'] / num_executed
except ZeroDivisionError:
self.result = 0
- if int(num_tests) > 0:
- logger.info("All tests have been skipped")
+ if stat['num_tests'] > 0:
+ LOGGER.info("All tests have been skipped")
else:
- logger.error("No test has been executed")
+ LOGGER.error("No test has been executed")
return
- with open(os.path.join(conf_utils.TEMPEST_RESULTS_DIR,
- "tempest.log"), 'r') as logfile:
+ with open(os.path.join(self.res_dir, "rally.log"),
+ 'r', encoding='utf-8') as logfile:
output = logfile.read()
success_testcases = []
- for match in re.findall('.*\{0\} (.*?)[. ]*success ', output):
+ for match in re.findall(r'.*\{\d{1,2}\} (.*?) \.{3} success ',
+ output):
success_testcases.append(match)
failed_testcases = []
- for match in re.findall('.*\{0\} (.*?)[. ]*fail ', output):
+ for match in re.findall(r'.*\{\d{1,2}\} (.*?) \.{3} fail',
+ output):
failed_testcases.append(match)
skipped_testcases = []
- for match in re.findall('.*\{0\} (.*?)[. ]*skip:', output):
+ for match in re.findall(r'.*\{\d{1,2}\} (.*?) \.{3} skip(?::| )',
+ output):
skipped_testcases.append(match)
- self.details = {"tests": int(num_tests),
- "failures": int(num_failures),
+ self.details = {"tests_number": stat['num_tests'],
+ "success_number": stat['num_success'],
+ "skipped_number": stat['num_skipped'],
+ "failures_number": stat['num_failures'],
"success": success_testcases,
- "errors": failed_testcases,
- "skipped": skipped_testcases}
- except Exception:
+ "skipped": skipped_testcases,
+ "failures": failed_testcases}
+ except Exception: # pylint: disable=broad-except
self.result = 0
- logger.info("Tempest %s success_rate is %s%%"
- % (self.case_name, self.result))
+ LOGGER.info("Tempest %s success_rate is %s%%",
+ self.case_name, self.result)
+
+ def update_rally_regex(self, rally_conf='/etc/rally/rally.conf'):
+ """Set image name as tempest img_name_regex"""
+ rconfig = configparser.RawConfigParser()
+ rconfig.read(rally_conf)
+ if not rconfig.has_section('openstack'):
+ rconfig.add_section('openstack')
+ rconfig.set('openstack', 'img_name_regex', f'^{self.image.name}$')
+ with open(rally_conf, 'w', encoding='utf-8') as config_file:
+ rconfig.write(config_file)
+
+ def update_default_role(self, rally_conf='/etc/rally/rally.conf'):
+ """Detect and update the default role if required"""
+ role = self.get_default_role(self.cloud)
+ if not role:
+ return
+ rconfig = configparser.RawConfigParser()
+ rconfig.read(rally_conf)
+ if not rconfig.has_section('openstack'):
+ rconfig.add_section('openstack')
+ rconfig.set('openstack', 'swift_operator_role', role.name)
+ with open(rally_conf, 'w', encoding='utf-8') as config_file:
+ rconfig.write(config_file)
- def run(self):
+ @staticmethod
+ def clean_rally_conf(rally_conf='/etc/rally/rally.conf'):
+ """Clean Rally config"""
+ rconfig = configparser.RawConfigParser()
+ rconfig.read(rally_conf)
+ if rconfig.has_option('openstack', 'img_name_regex'):
+ rconfig.remove_option('openstack', 'img_name_regex')
+ if rconfig.has_option('openstack', 'swift_operator_role'):
+ rconfig.remove_option('openstack', 'swift_operator_role')
+ with open(rally_conf, 'w', encoding='utf-8') as config_file:
+ rconfig.write(config_file)
+
+ def update_auth_section(self):
+ """Update auth section in tempest.conf"""
+ rconfig = configparser.RawConfigParser()
+ rconfig.read(self.conf_file)
+ if not rconfig.has_section("auth"):
+ rconfig.add_section("auth")
+ if env.get("NEW_USER_ROLE").lower() != "member":
+ tempest_roles = []
+ if rconfig.has_option("auth", "tempest_roles"):
+ tempest_roles = functest_utils.convert_ini_to_list(
+ rconfig.get("auth", "tempest_roles"))
+ rconfig.set(
+ 'auth', 'tempest_roles',
+ functest_utils.convert_list_to_ini(
+ [env.get("NEW_USER_ROLE")] + tempest_roles))
+ if not json.loads(env.get("USE_DYNAMIC_CREDENTIALS").lower()):
+ rconfig.set('auth', 'use_dynamic_credentials', False)
+ account_file = os.path.join(
+ getattr(config.CONF, 'dir_functest_data'), 'accounts.yaml')
+ assert os.path.exists(
+ account_file), f"{account_file} doesn't exist"
+ rconfig.set('auth', 'test_accounts_file', account_file)
+ if env.get('NO_TENANT_NETWORK').lower() == 'true':
+ rconfig.set('auth', 'create_isolated_networks', False)
+ with open(self.conf_file, 'w', encoding='utf-8') as config_file:
+ rconfig.write(config_file)
+
+ def update_network_section(self):
+ """Update network section in tempest.conf"""
+ rconfig = configparser.RawConfigParser()
+ rconfig.read(self.conf_file)
+ if self.ext_net:
+ if not rconfig.has_section('network'):
+ rconfig.add_section('network')
+ rconfig.set('network', 'public_network_id', self.ext_net.id)
+ rconfig.set('network', 'floating_network_name', self.ext_net.name)
+ rconfig.set('network-feature-enabled', 'floating_ips', True)
+ else:
+ if not rconfig.has_section('network-feature-enabled'):
+ rconfig.add_section('network-feature-enabled')
+ rconfig.set('network-feature-enabled', 'floating_ips', False)
+ with open(self.conf_file, 'w', encoding='utf-8') as config_file:
+ rconfig.write(config_file)
+
+ def update_compute_section(self):
+ """Update compute section in tempest.conf"""
+ rconfig = configparser.RawConfigParser()
+ rconfig.read(self.conf_file)
+ if not rconfig.has_section('compute'):
+ rconfig.add_section('compute')
+ rconfig.set(
+ 'compute', 'fixed_network_name',
+ self.network.name if self.network else env.get("EXTERNAL_NETWORK"))
+ with open(self.conf_file, 'w', encoding='utf-8') as config_file:
+ rconfig.write(config_file)
+
+ def update_validation_section(self):
+ """Update validation section in tempest.conf"""
+ rconfig = configparser.RawConfigParser()
+ rconfig.read(self.conf_file)
+ if not rconfig.has_section('validation'):
+ rconfig.add_section('validation')
+ rconfig.set(
+ 'validation', 'connect_method',
+ 'floating' if self.ext_net else 'fixed')
+ rconfig.set(
+ 'validation', 'network_for_ssh',
+ self.network.name if self.network else env.get("EXTERNAL_NETWORK"))
+ with open(self.conf_file, 'w', encoding='utf-8') as config_file:
+ rconfig.write(config_file)
+
+ def update_scenario_section(self):
+ """Update scenario section in tempest.conf"""
+ rconfig = configparser.RawConfigParser()
+ rconfig.read(self.conf_file)
+ filename = getattr(
+ config.CONF, f'{self.case_name}_image', self.filename)
+ if not rconfig.has_section('scenario'):
+ rconfig.add_section('scenario')
+ rconfig.set('scenario', 'img_file', filename)
+ rconfig.set('scenario', 'img_disk_format', getattr(
+ config.CONF, f'{self.case_name}_image_format',
+ self.image_format))
+ extra_properties = self.extra_properties.copy()
+ if env.get('IMAGE_PROPERTIES'):
+ extra_properties.update(
+ functest_utils.convert_ini_to_dict(
+ env.get('IMAGE_PROPERTIES')))
+ extra_properties.update(
+ getattr(config.CONF, f'{self.case_name}_extra_properties', {}))
+ rconfig.set(
+ 'scenario', 'img_properties',
+ functest_utils.convert_dict_to_ini(extra_properties))
+ with open(self.conf_file, 'w', encoding='utf-8') as config_file:
+ rconfig.write(config_file)
+
+ def update_dashboard_section(self):
+ """Update dashboard section in tempest.conf"""
+ rconfig = configparser.RawConfigParser()
+ rconfig.read(self.conf_file)
+ if env.get('DASHBOARD_URL'):
+ if not rconfig.has_section('dashboard'):
+ rconfig.add_section('dashboard')
+ rconfig.set('dashboard', 'dashboard_url', env.get('DASHBOARD_URL'))
+ else:
+ rconfig.set('service_available', 'horizon', False)
+ with open(self.conf_file, 'w', encoding='utf-8') as config_file:
+ rconfig.write(config_file)
+ def configure(self, **kwargs): # pylint: disable=unused-argument
+ """
+ Create all openstack resources for tempest-based testcases and write
+ tempest.conf.
+ """
+ if not os.path.exists(self.res_dir):
+ os.makedirs(self.res_dir)
+ self.deployment_id = rally.RallyBase.create_rally_deployment(
+ environ=self.project.get_environ())
+ if not self.deployment_id:
+ raise Exception("Deployment create failed")
+ self.verifier_id = self.create_verifier()
+ if not self.verifier_id:
+ raise Exception("Verifier create failed")
+ self.verifier_repo_dir = self.get_verifier_repo_dir(
+ self.verifier_id)
+ self.deployment_dir = self.get_verifier_deployment_dir(
+ self.verifier_id, self.deployment_id)
+
+ compute_cnt = self.count_hypervisors() if self.count_hypervisors(
+ ) <= 10 else 10
+ self.image_alt = self.publish_image_alt()
+ self.flavor_alt = self.create_flavor_alt()
+ LOGGER.debug("flavor: %s", self.flavor_alt)
+
+ self.conf_file = self.configure_verifier(self.deployment_dir)
+ if not self.conf_file:
+ raise Exception("Tempest verifier configuring failed")
+ self.configure_tempest_update_params(
+ self.conf_file,
+ image_id=self.image.id,
+ flavor_id=self.flavor.id,
+ compute_cnt=compute_cnt,
+ image_alt_id=self.image_alt.id,
+ flavor_alt_id=self.flavor_alt.id,
+ admin_role_name=self.role_name, cidr=self.cidr,
+ domain_id=self.project.domain.id)
+ self.update_auth_section()
+ self.update_network_section()
+ self.update_compute_section()
+ self.update_validation_section()
+ self.update_scenario_section()
+ self.update_dashboard_section()
+ self.backup_tempest_config(self.conf_file, self.res_dir)
+
+ def run(self, **kwargs):
self.start_time = time.time()
try:
- if not os.path.exists(conf_utils.TEMPEST_RESULTS_DIR):
- os.makedirs(conf_utils.TEMPEST_RESULTS_DIR)
- resources = self.resources.create()
- compute_cnt = snaps_utils.get_active_compute_cnt(
- self.resources.os_creds)
- conf_utils.configure_tempest(
- self.DEPLOYMENT_DIR,
- image_id=resources.get("image_id"),
- flavor_id=resources.get("flavor_id"),
- compute_cnt=compute_cnt)
- self.generate_test_list(self.VERIFIER_REPO_DIR)
- self.apply_tempest_blacklist()
- self.run_verifier_tests()
+ assert super().run(
+ **kwargs) == testcase.TestCase.EX_OK
+ if not os.path.exists(self.res_dir):
+ os.makedirs(self.res_dir)
+ self.update_rally_regex()
+ self.update_default_role()
+ rally.RallyBase.update_rally_logs(self.res_dir)
+ shutil.copy("/etc/rally/rally.conf", self.res_dir)
+ self.configure(**kwargs)
+ self.generate_test_list(**kwargs)
+ self.apply_tempest_blacklist(TempestCommon.tempest_blacklist)
+ if env.get('PUBLIC_ENDPOINT_ONLY').lower() == 'true':
+ self.apply_tempest_blacklist(
+ TempestCommon.tempest_public_blacklist)
+ self.run_verifier_tests(**kwargs)
self.parse_verifier_result()
+ rally.RallyBase.verify_report(
+ os.path.join(self.res_dir, "tempest-report.html"),
+ self.verification_id)
+ rally.RallyBase.verify_report(
+ os.path.join(self.res_dir, "tempest-report.xml"),
+ self.verification_id, "junit-xml")
res = testcase.TestCase.EX_OK
- except Exception as e:
- logger.error('Error with run: %s' % e)
+ except Exception: # pylint: disable=broad-except
+ LOGGER.exception('Error with run')
+ self.result = 0
res = testcase.TestCase.EX_RUN_ERROR
- finally:
- self.resources.cleanup()
-
self.stop_time = time.time()
return res
-
-class TempestSmokeSerial(TempestCommon):
-
- def __init__(self, **kwargs):
- if "case_name" not in kwargs:
- kwargs["case_name"] = 'tempest_smoke_serial'
- TempestCommon.__init__(self, **kwargs)
- self.MODE = "smoke"
- self.OPTION = "--concurrency 1"
-
-
-class TempestSmokeParallel(TempestCommon):
-
- def __init__(self, **kwargs):
- if "case_name" not in kwargs:
- kwargs["case_name"] = 'tempest_smoke_parallel'
- TempestCommon.__init__(self, **kwargs)
- self.MODE = "smoke"
- self.OPTION = ""
-
-
-class TempestFullParallel(TempestCommon):
-
- def __init__(self, **kwargs):
- if "case_name" not in kwargs:
- kwargs["case_name"] = 'tempest_full_parallel'
- TempestCommon.__init__(self, **kwargs)
- self.MODE = "full"
-
-
-class TempestCustom(TempestCommon):
-
- def __init__(self, **kwargs):
- if "case_name" not in kwargs:
- kwargs["case_name"] = 'tempest_custom'
- TempestCommon.__init__(self, **kwargs)
- self.MODE = "custom"
- self.OPTION = "--concurrency 1"
-
-
-class TempestDefcore(TempestCommon):
-
- def __init__(self, **kwargs):
- if "case_name" not in kwargs:
- kwargs["case_name"] = 'tempest_defcore'
- TempestCommon.__init__(self, **kwargs)
- self.MODE = "defcore"
- self.OPTION = "--concurrency 1"
-
-
-class TempestResourcesManager(object):
+ def clean(self):
+ """
+ Cleanup all OpenStack objects. Should be called on completion.
+ """
+ self.clean_rally_conf()
+ rally.RallyBase.clean_rally_logs()
+ if self.image_alt:
+ self.cloud.delete_image(self.image_alt)
+ if self.flavor_alt:
+ self.orig_cloud.delete_flavor(self.flavor_alt.id)
+ super().clean()
+
+ def is_successful(self):
+ """The overall result of the test."""
+ skips = self.details.get("skipped_number", 0)
+ if skips > 0 and self.deny_skipping:
+ return testcase.TestCase.EX_TESTCASE_FAILED
+ if self.tests_count and (
+ self.details.get("tests_number", 0) != self.tests_count):
+ return testcase.TestCase.EX_TESTCASE_FAILED
+ return super().is_successful()
+
+
+class TempestHeat(TempestCommon):
+ """Tempest Heat testcase implementation class."""
+
+ filename_alt = ('/home/opnfv/functest/images/'
+ 'Fedora-Cloud-Base-30-1.2.x86_64.qcow2')
+ flavor_alt_ram = 512
+ flavor_alt_vcpus = 1
+ flavor_alt_disk = 4
def __init__(self, **kwargs):
- self.os_creds = None
- if 'os_creds' in kwargs:
- self.os_creds = kwargs['os_creds']
+ super().__init__(**kwargs)
+ self.user2 = self.orig_cloud.create_user(
+ name=f'{self.case_name}-user2_{self.project.guid}',
+ password=self.project.password,
+ domain_id=self.project.domain.id)
+ self.orig_cloud.grant_role(
+ self.role_name, user=self.user2.id,
+ project=self.project.project.id, domain=self.project.domain.id)
+ if not self.orig_cloud.get_role("heat_stack_owner"):
+ self.role = self.orig_cloud.create_role("heat_stack_owner")
+ self.orig_cloud.grant_role(
+ "heat_stack_owner", user=self.user2.id,
+ project=self.project.project.id,
+ domain=self.project.domain.id)
+
+ def configure(self, **kwargs):
+ assert self.user2
+ super().configure(**kwargs)
+ rconfig = configparser.RawConfigParser()
+ rconfig.read(self.conf_file)
+ if not rconfig.has_section('heat_plugin'):
+ rconfig.add_section('heat_plugin')
+ # It fails if region and domain ids are unset
+ rconfig.set(
+ 'heat_plugin', 'region',
+ os.environ.get('OS_REGION_NAME', 'RegionOne'))
+ rconfig.set('heat_plugin', 'auth_url', os.environ["OS_AUTH_URL"])
+ rconfig.set('heat_plugin', 'project_domain_id', self.project.domain.id)
+ rconfig.set('heat_plugin', 'user_domain_id', self.project.domain.id)
+ rconfig.set(
+ 'heat_plugin', 'project_domain_name', self.project.domain.name)
+ rconfig.set(
+ 'heat_plugin', 'user_domain_name', self.project.domain.name)
+ rconfig.set('heat_plugin', 'username', self.user2.name)
+ rconfig.set('heat_plugin', 'password', self.project.password)
+ rconfig.set('heat_plugin', 'project_name', self.project.project.name)
+ rconfig.set('heat_plugin', 'admin_username', self.project.user.name)
+ rconfig.set('heat_plugin', 'admin_password', self.project.password)
+ rconfig.set(
+ 'heat_plugin', 'admin_project_name', self.project.project.name)
+ rconfig.set('heat_plugin', 'image_ref', self.image_alt.id)
+ rconfig.set('heat_plugin', 'instance_type', self.flavor_alt.id)
+ rconfig.set('heat_plugin', 'minimal_image_ref', self.image.id)
+ rconfig.set('heat_plugin', 'minimal_instance_type', self.flavor.id)
+ if self.ext_net:
+ rconfig.set(
+ 'heat_plugin', 'floating_network_name', self.ext_net.name)
+ if self.network:
+ rconfig.set('heat_plugin', 'fixed_network_name', self.network.name)
+ rconfig.set('heat_plugin', 'fixed_subnet_name', self.subnet.name)
+ rconfig.set('heat_plugin', 'network_for_ssh', self.network.name)
else:
- self.os_creds = openstack_tests.get_credentials(
- os_env_file=CONST.__getattribute__('openstack_creds'))
-
- self.guid = '-' + str(uuid.uuid4())
-
- self.creators = list()
-
- if hasattr(CONST, 'snaps_images_cirros'):
- self.cirros_image_config = CONST.__getattribute__(
- 'snaps_images_cirros')
- else:
- self.cirros_image_config = None
-
- def create(self, use_custom_images=False, use_custom_flavors=False,
- create_project=False):
- if create_project:
- logger.debug("Creating project (tenant) for Tempest suite")
- project_name = CONST.__getattribute__(
- 'tempest_identity_tenant_name') + self.guid
- project_creator = deploy_utils.create_project(
- self.os_creds, ProjectConfig(
- name=project_name,
- description=CONST.__getattribute__(
- 'tempest_identity_tenant_description')))
- if (project_creator is None or
- project_creator.get_project() is None):
- raise Exception("Failed to create tenant")
- project_id = project_creator.get_project().id
- self.creators.append(project_creator)
-
- logger.debug("Creating user for Tempest suite")
- user_creator = deploy_utils.create_user(
- self.os_creds, UserConfig(
- name=CONST.__getattribute__(
- 'tempest_identity_user_name') + self.guid,
- password=CONST.__getattribute__(
- 'tempest_identity_user_password'),
- project_name=project_name))
- if user_creator is None or user_creator.get_user() is None:
- raise Exception("Failed to create user")
- user_id = user_creator.get_user().id
- self.creators.append(user_creator)
- else:
- project_name = None
- project_id = None
- user_id = None
-
- logger.debug("Creating private network for Tempest suite")
-
- tempest_network_type = None
- tempest_physical_network = None
- tempest_segmentation_id = None
-
- if hasattr(CONST, 'tempest_network_type'):
- tempest_network_type = CONST.__getattribute__(
- 'tempest_network_type')
- if hasattr(CONST, 'tempest_physical_network'):
- tempest_physical_network = CONST.__getattribute__(
- 'tempest_physical_network')
- if hasattr(CONST, 'tempest_segmentation_id'):
- tempest_segmentation_id = CONST.__getattribute__(
- 'tempest_segmentation_id')
-
- network_creator = deploy_utils.create_network(
- self.os_creds, NetworkConfig(
- name=CONST.__getattribute__(
- 'tempest_private_net_name') + self.guid,
- project_name=project_name,
- network_type=tempest_network_type,
- physical_network=tempest_physical_network,
- segmentation_id=tempest_segmentation_id,
- subnet_settings=[SubnetConfig(
- name=CONST.__getattribute__(
- 'tempest_private_subnet_name') + self.guid,
- cidr=CONST.__getattribute__('tempest_private_subnet_cidr'))
- ]))
- if network_creator is None or network_creator.get_network() is None:
- raise Exception("Failed to create private network")
- self.creators.append(network_creator)
-
- image_id = None
- image_id_alt = None
- flavor_id = None
- flavor_id_alt = None
-
- logger.debug("Creating image for Tempest suite")
- image_base_name = CONST.__getattribute__(
- 'openstack_image_name') + self.guid
- os_image_settings = openstack_tests.cirros_image_settings(
- image_base_name, public=True,
- image_metadata=self.cirros_image_config)
- logger.debug("Creating image for Tempest suite")
- image_creator = deploy_utils.create_image(
- self.os_creds, os_image_settings)
- if image_creator is None:
- raise Exception('Failed to create image')
- self.creators.append(image_creator)
- image_id = image_creator.get_image().id
-
- if use_custom_images:
- logger.debug("Creating 2nd image for Tempest suite")
- image_base_name_alt = CONST.__getattribute__(
- 'openstack_image_name_alt') + self.guid
- os_image_settings_alt = openstack_tests.cirros_image_settings(
- image_base_name_alt, public=True,
- image_metadata=self.cirros_image_config)
- logger.debug("Creating 2nd image for Tempest suite")
- image_creator_alt = deploy_utils.create_image(
- self.os_creds, os_image_settings_alt)
- if image_creator_alt is None:
- raise Exception('Failed to create image')
- self.creators.append(image_creator_alt)
- image_id_alt = image_creator_alt.get_image().id
-
- if (CONST.__getattribute__('tempest_use_custom_flavors') == 'True' or
- use_custom_flavors):
- logger.info("Creating flavor for Tempest suite")
- scenario = CONST.__getattribute__('DEPLOY_SCENARIO')
- flavor_metadata = None
- if 'ovs' in scenario or 'fdio' in scenario:
- flavor_metadata = create_flavor.MEM_PAGE_SIZE_LARGE
- flavor_creator = OpenStackFlavor(
- self.os_creds, FlavorConfig(
- name=CONST.__getattribute__(
- 'openstack_flavor_name') + self.guid,
- ram=CONST.__getattribute__('openstack_flavor_ram'),
- disk=CONST.__getattribute__('openstack_flavor_disk'),
- vcpus=CONST.__getattribute__('openstack_flavor_vcpus'),
- metadata=flavor_metadata))
- flavor = flavor_creator.create()
- if flavor is None:
- raise Exception('Failed to create flavor')
- self.creators.append(flavor_creator)
- flavor_id = flavor.id
-
- if use_custom_flavors:
- logger.info("Creating 2nd flavor for Tempest suite")
- scenario = CONST.__getattribute__('DEPLOY_SCENARIO')
- flavor_metadata_alt = None
- if 'ovs' in scenario or 'fdio' in scenario:
- flavor_metadata_alt = create_flavor.MEM_PAGE_SIZE_LARGE
- CONST.__setattr__('openstack_flavor_ram', 1024)
- flavor_creator_alt = OpenStackFlavor(
- self.os_creds, FlavorConfig(
- name=CONST.__getattribute__(
- 'openstack_flavor_name_alt') + self.guid,
- ram=CONST.__getattribute__('openstack_flavor_ram'),
- disk=CONST.__getattribute__('openstack_flavor_disk'),
- vcpus=CONST.__getattribute__('openstack_flavor_vcpus'),
- metadata=flavor_metadata_alt))
- flavor_alt = flavor_creator_alt.create()
- if flavor_alt is None:
- raise Exception('Failed to create flavor')
- self.creators.append(flavor_creator_alt)
- flavor_id_alt = flavor_alt.id
-
- print("RESOURCES CREATE: image_id: %s, image_id_alt: %s, "
- "flavor_id: %s, flavor_id_alt: %s" % (
- image_id, image_id_alt, flavor_id, flavor_id_alt,))
-
- result = {
- 'image_id': image_id,
- 'image_id_alt': image_id_alt,
- 'flavor_id': flavor_id,
- 'flavor_id_alt': flavor_id_alt
- }
-
- if create_project:
- result['project_id'] = project_id
- result['tenant_id'] = project_id # for compatibility
- result['user_id'] = user_id
-
- return result
-
- def cleanup(self):
+ LOGGER.warning(
+ 'No tenant network created. '
+ 'Trying EXTERNAL_NETWORK as a fallback')
+ rconfig.set(
+ 'heat_plugin', 'fixed_network_name',
+ env.get("EXTERNAL_NETWORK"))
+ rconfig.set(
+ 'heat_plugin', 'network_for_ssh', env.get("EXTERNAL_NETWORK"))
+ with open(self.conf_file, 'w', encoding='utf-8') as config_file:
+ rconfig.write(config_file)
+ self.backup_tempest_config(self.conf_file, self.res_dir)
+
+ def clean(self):
"""
Cleanup all OpenStack objects. Should be called on completion.
"""
- for creator in reversed(self.creators):
- try:
- creator.clean()
- except Exception as e:
- logger.error('Unexpected error cleaning - %s', e)
+ super().clean()
+ if self.user2:
+ self.orig_cloud.delete_user(self.user2.id)
diff --git a/functest/ci/__init__.py b/functest/opnfv_tests/openstack/vmtp/__init__.py
index e69de29bb..e69de29bb 100644
--- a/functest/ci/__init__.py
+++ b/functest/opnfv_tests/openstack/vmtp/__init__.py
diff --git a/functest/opnfv_tests/openstack/vmtp/vmtp.py b/functest/opnfv_tests/openstack/vmtp/vmtp.py
new file mode 100644
index 000000000..9833cc72a
--- /dev/null
+++ b/functest/opnfv_tests/openstack/vmtp/vmtp.py
@@ -0,0 +1,213 @@
+#!/usr/bin/env python
+
+# Copyright (c) 2018 Orange and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+
+"""
+VMTP_ is a small python application that will automatically perform ping
+connectivity, round trip time measurement (latency) and TCP/UDP throughput
+measurement for the following East/West flows on any OpenStack deployment:
+
+- VM to VM same network (private fixed IP, flow #1)
+- VM to VM different network using fixed IP (same as intra-tenant L3 fixed IP,
+ flow #2)
+- VM to VM different network using floating IP and NAT (same as floating IP
+ inter-tenant L3, flow #3)
+
+.. _VMTP: http://vmtp.readthedocs.io/en/latest/
+"""
+
+import json
+import logging
+import os
+import subprocess
+import tempfile
+import time
+import yaml
+
+from xtesting.core import testcase
+
+from functest.core import singlevm
+from functest.utils import env
+from functest.utils import functest_utils
+
+
+class Vmtp(singlevm.VmReady2):
+ """Class to run Vmtp_ as an OPNFV Functest testcase
+
+ .. _Vmtp: http://vmtp.readthedocs.io/en/latest/
+ """
+ # pylint: disable=too-many-instance-attributes
+
+ __logger = logging.getLogger(__name__)
+
+ filename = ('/home/opnfv/functest/images/'
+ 'ubuntu-14.04-server-cloudimg-amd64-disk1.img')
+ flavor_ram = 2048
+ flavor_vcpus = 1
+ flavor_disk = 0
+ create_server_timeout = 300
+ ssh_retry_timeout = 240
+
+ def __init__(self, **kwargs):
+ if "case_name" not in kwargs:
+ kwargs["case_name"] = 'vmtp'
+ super().__init__(**kwargs)
+ self.config = f"{self.res_dir}/vmtp.conf"
+ (_, self.privkey_filename) = tempfile.mkstemp()
+ (_, self.pubkey_filename) = tempfile.mkstemp()
+
+ def check_requirements(self):
+ if self.count_hypervisors() < 2:
+ self.__logger.warning("Vmtp requires at least 2 hypervisors")
+ self.is_skipped = True
+ self.project.clean()
+
+ def create_network_resources(self):
+ """Create router
+
+ It creates a router which gateway is the external network detected.
+
+ Raises: expection on error
+ """
+ assert self.cloud
+ assert self.ext_net
+ self.router = self.cloud.create_router(
+ name=f'{self.case_name}-router_{self.guid}',
+ ext_gateway_net_id=self.ext_net.id)
+ self.__logger.debug("router: %s", self.router)
+
+ def generate_keys(self):
+ """Generate Keys
+
+ Raises: Exception on error
+ """
+ assert self.cloud
+ name = f"vmtp_{self.guid}"
+ self.__logger.info("Creating keypair with name: '%s'", name)
+ keypair = self.cloud.create_keypair(name)
+ self.__logger.debug("keypair: %s", keypair)
+ with open(self.privkey_filename, 'w', encoding='utf-8') as key_file:
+ key_file.write(keypair.private_key)
+ with open(self.pubkey_filename, 'w', encoding='utf-8') as key_file:
+ key_file.write(keypair.public_key)
+ self.cloud.delete_keypair(keypair.id)
+
+ def write_config(self):
+ """Write vmtp.conf
+
+ Raises: Exception on error
+ """
+ assert self.cloud
+ if not os.path.exists(self.res_dir):
+ os.makedirs(self.res_dir)
+ cmd = ['vmtp', '-sc']
+ output = subprocess.check_output(cmd).decode("utf-8")
+ self.__logger.info("%s\n%s", " ".join(cmd), output)
+ with open(self.config, "w+", encoding='utf-8') as conf:
+ vmtp_conf = yaml.full_load(output)
+ vmtp_conf["private_key_file"] = self.privkey_filename
+ vmtp_conf["public_key_file"] = self.pubkey_filename
+ vmtp_conf["image_name"] = str(self.image.name)
+ vmtp_conf["router_name"] = str(self.router.name)
+ vmtp_conf["flavor_type"] = str(self.flavor.name)
+ vmtp_conf["internal_network_name"] = [
+ f"pns-internal-net_{self.guid}",
+ f"pns-internal-net2_{self.guid}"]
+ vmtp_conf["vm_name_client"] = f"TestClient_{self.guid}"
+ vmtp_conf["vm_name_server"] = f"TestServer_{self.guid}"
+ vmtp_conf["security_group_name"] = f"pns-security{self.guid}"
+ vmtp_conf["dns_nameservers"] = [env.get('NAMESERVER')]
+ vmtp_conf["generic_retry_count"] = self.create_server_timeout // 2
+ vmtp_conf["ssh_retry_count"] = self.ssh_retry_timeout // 2
+ conf.write(yaml.dump(vmtp_conf))
+
+ def run_vmtp(self):
+ # pylint: disable=unexpected-keyword-arg
+ """Run Vmtp and generate charts
+
+ Raises: Exception on error
+ """
+ assert self.cloud
+ new_env = dict(
+ os.environ,
+ OS_USERNAME=self.project.user.name,
+ OS_PROJECT_NAME=self.project.project.name,
+ OS_PROJECT_ID=self.project.project.id,
+ OS_PROJECT_DOMAIN_NAME=self.project.domain.name,
+ OS_USER_DOMAIN_NAME=self.project.domain.name,
+ OS_PASSWORD=self.project.password)
+ if not new_env["OS_AUTH_URL"].endswith(('v3', 'v3/')):
+ new_env["OS_AUTH_URL"] = f'{new_env["OS_AUTH_URL"]}/v3'
+ try:
+ del new_env['OS_TENANT_NAME']
+ del new_env['OS_TENANT_ID']
+ except Exception: # pylint: disable=broad-except
+ pass
+ cmd = ['vmtp', '-d', '--json', f'{self.res_dir}/vmtp.json',
+ '-c', self.config]
+ if env.get("VMTP_HYPERVISORS"):
+ hypervisors = functest_utils.convert_ini_to_list(
+ env.get("VMTP_HYPERVISORS"))
+ for hypervisor in hypervisors:
+ cmd.extend(["--hypervisor", hypervisor])
+ self.__logger.debug("cmd: %s", cmd)
+ output = subprocess.check_output(
+ cmd, stderr=subprocess.STDOUT, env=new_env).decode("utf-8")
+ self.__logger.info("%s\n%s", " ".join(cmd), output)
+ cmd = ['vmtp_genchart', '-c', f'{self.res_dir}/vmtp.html',
+ f'{self.res_dir}/vmtp.json']
+ output = subprocess.check_output(
+ cmd, stderr=subprocess.STDOUT).decode("utf-8")
+ self.__logger.info("%s\n%s", " ".join(cmd), output)
+ with open(f'{self.res_dir}/vmtp.json', 'r',
+ encoding='utf-8') as res_file:
+ self.details = json.load(res_file)
+
+ def run(self, **kwargs):
+ self.start_time = time.time()
+ status = testcase.TestCase.EX_RUN_ERROR
+ try:
+ assert self.cloud
+ assert super().run(**kwargs) == self.EX_OK
+ status = testcase.TestCase.EX_RUN_ERROR
+ if self.orig_cloud.get_role("admin"):
+ role_name = "admin"
+ elif self.orig_cloud.get_role("Admin"):
+ role_name = "Admin"
+ else:
+ raise Exception("Cannot detect neither admin nor Admin")
+ self.orig_cloud.grant_role(
+ role_name, user=self.project.user.id,
+ project=self.project.project.id,
+ domain=self.project.domain.id)
+ self.generate_keys()
+ self.write_config()
+ self.run_vmtp()
+ self.result = 100
+ status = testcase.TestCase.EX_OK
+ except subprocess.CalledProcessError as cpe:
+ self.__logger.error(
+ "Exception when calling %s\n%s", cpe.cmd,
+ cpe.output.decode("utf-8"))
+ self.result = 0
+ except Exception: # pylint: disable=broad-except
+ self.__logger.exception("Cannot run vmtp")
+ self.result = 0
+ self.stop_time = time.time()
+ return status
+
+ def clean(self):
+ try:
+ assert self.cloud
+ super().clean()
+ os.remove(self.privkey_filename)
+ os.remove(self.pubkey_filename)
+ self.cloud.delete_network(f"pns-internal-net_{self.guid}")
+ self.cloud.delete_network(f"pns-internal-net2_{self.guid}")
+ except Exception: # pylint: disable=broad-except
+ pass
diff --git a/functest/opnfv_tests/openstack/vping/ping.sh b/functest/opnfv_tests/openstack/vping/ping.sh
deleted file mode 100644
index 15f5e84e1..000000000
--- a/functest/opnfv_tests/openstack/vping/ping.sh
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/bin/sh
-
-
-ping -c 1 $1 2>&1 >/dev/null
-RES=$?
-if [ "Z$RES" = "Z0" ] ; then
- echo 'vPing OK'
-else
- echo 'vPing KO'
-fi
diff --git a/functest/opnfv_tests/openstack/vping/vping_base.py b/functest/opnfv_tests/openstack/vping/vping_base.py
deleted file mode 100644
index df9774ece..000000000
--- a/functest/opnfv_tests/openstack/vping/vping_base.py
+++ /dev/null
@@ -1,215 +0,0 @@
-# Copyright (c) 2017 Cable Television Laboratories, Inc. and others.
-#
-# This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-
-"""Define the parent class of vping_ssh and vping_userdata testcases."""
-
-from datetime import datetime
-import logging
-import time
-import uuid
-
-from functest.core import testcase
-from functest.opnfv_tests.openstack.snaps import snaps_utils
-from functest.utils.constants import CONST
-
-from snaps.config.flavor import FlavorConfig
-from snaps.config.network import NetworkConfig, SubnetConfig
-from snaps.config.router import RouterConfig
-from snaps.openstack import create_flavor
-from snaps.openstack.create_flavor import OpenStackFlavor
-from snaps.openstack.tests import openstack_tests
-from snaps.openstack.utils import deploy_utils
-
-
-class VPingBase(testcase.TestCase):
-
- """
- Base class for vPing tests that check connectivity between two VMs shared
- internal network.
- This class is responsible for creating the image, internal network.
- """
- # pylint: disable=too-many-instance-attributes
-
- def __init__(self, **kwargs):
- super(VPingBase, self).__init__(**kwargs)
-
- self.logger = logging.getLogger(__name__)
-
- if 'os_creds' in kwargs:
- self.os_creds = kwargs['os_creds']
- else:
- creds_override = None
- if hasattr(CONST, 'snaps_os_creds_override'):
- creds_override = CONST.__getattribute__(
- 'snaps_os_creds_override')
-
- self.os_creds = openstack_tests.get_credentials(
- os_env_file=CONST.__getattribute__('openstack_creds'),
- overrides=creds_override)
-
- self.creators = list()
- self.image_creator = None
- self.network_creator = None
- self.vm1_creator = None
- self.vm2_creator = None
- self.router_creator = None
-
- # Shared metadata
- self.guid = '-' + str(uuid.uuid4())
-
- self.router_name = CONST.__getattribute__(
- 'vping_router_name') + self.guid
- self.vm1_name = CONST.__getattribute__('vping_vm_name_1') + self.guid
- self.vm2_name = CONST.__getattribute__('vping_vm_name_2') + self.guid
-
- self.vm_boot_timeout = CONST.__getattribute__('vping_vm_boot_timeout')
- self.vm_delete_timeout = CONST.__getattribute__(
- 'vping_vm_delete_timeout')
- self.vm_ssh_connect_timeout = CONST.__getattribute__(
- 'vping_vm_ssh_connect_timeout')
- self.ping_timeout = CONST.__getattribute__('vping_ping_timeout')
- self.flavor_name = 'vping-flavor' + self.guid
-
- # Move this configuration option up for all tests to leverage
- if hasattr(CONST, 'snaps_images_cirros'):
- self.cirros_image_config = CONST.__getattribute__(
- 'snaps_images_cirros')
- else:
- self.cirros_image_config = None
-
- def run(self):
- """
- Begins the test execution which should originate from the subclass
- """
- self.logger.info('Begin virtual environment setup')
-
- self.start_time = time.time()
- self.logger.info(
- "vPing Start Time:'%s'",
- datetime.fromtimestamp(self.start_time).strftime(
- '%Y-%m-%d %H:%M:%S'))
-
- image_base_name = '{}-{}'.format(
- CONST.__getattribute__('vping_image_name'),
- str(self.guid))
- os_image_settings = openstack_tests.cirros_image_settings(
- image_base_name, image_metadata=self.cirros_image_config)
- self.logger.info("Creating image with name: '%s'", image_base_name)
-
- self.image_creator = deploy_utils.create_image(
- self.os_creds, os_image_settings)
- self.creators.append(self.image_creator)
-
- private_net_name = CONST.__getattribute__(
- 'vping_private_net_name') + self.guid
- private_subnet_name = CONST.__getattribute__(
- 'vping_private_subnet_name') + self.guid
- private_subnet_cidr = CONST.__getattribute__(
- 'vping_private_subnet_cidr')
-
- vping_network_type = None
- vping_physical_network = None
- vping_segmentation_id = None
-
- if hasattr(CONST, 'vping_network_type'):
- vping_network_type = CONST.__getattribute__(
- 'vping_network_type')
- if hasattr(CONST, 'vping_physical_network'):
- vping_physical_network = CONST.__getattribute__(
- 'vping_physical_network')
- if hasattr(CONST, 'vping_segmentation_id'):
- vping_segmentation_id = CONST.__getattribute__(
- 'vping_segmentation_id')
-
- self.logger.info(
- "Creating network with name: '%s'", private_net_name)
- self.network_creator = deploy_utils.create_network(
- self.os_creds,
- NetworkConfig(
- name=private_net_name,
- network_type=vping_network_type,
- physical_network=vping_physical_network,
- segmentation_id=vping_segmentation_id,
- subnet_settings=[SubnetConfig(
- name=private_subnet_name,
- cidr=private_subnet_cidr)]))
- self.creators.append(self.network_creator)
-
- # Creating router to external network
- log = "Creating router with name: '%s'" % self.router_name
- self.logger.info(log)
- ext_net_name = snaps_utils.get_ext_net_name(self.os_creds)
- self.router_creator = deploy_utils.create_router(
- self.os_creds,
- RouterConfig(
- name=self.router_name,
- external_gateway=ext_net_name,
- internal_subnets=[private_subnet_name]))
- self.creators.append(self.router_creator)
-
- self.logger.info(
- "Creating flavor with name: '%s'", self.flavor_name)
- scenario = CONST.__getattribute__('DEPLOY_SCENARIO')
- flavor_metadata = None
- flavor_ram = 512
- if 'ovs' in scenario or 'fdio' in scenario:
- flavor_metadata = create_flavor.MEM_PAGE_SIZE_LARGE
- flavor_ram = 1024
- flavor_creator = OpenStackFlavor(
- self.os_creds,
- FlavorConfig(name=self.flavor_name, ram=flavor_ram, disk=1,
- vcpus=1, metadata=flavor_metadata))
- flavor_creator.create()
- self.creators.append(flavor_creator)
-
- def _execute(self):
- """
- Method called by subclasses after environment has been setup
- :return: the exit code
- """
- self.logger.info('Begin test execution')
-
- test_ip = self.vm1_creator.get_port_ip(
- self.vm1_creator.instance_settings.port_settings[0].name)
-
- if self.vm1_creator.vm_active(
- block=True) and self.vm2_creator.vm_active(block=True):
- result = self._do_vping(self.vm2_creator, test_ip)
- else:
- raise Exception('VMs never became active')
-
- self.stop_time = time.time()
-
- if result != testcase.TestCase.EX_OK:
- self.result = 0
- return testcase.TestCase.EX_RUN_ERROR
-
- self.result = 100
- return testcase.TestCase.EX_OK
-
- def _cleanup(self):
- """
- Cleanup all OpenStack objects. Should be called on completion
- :return:
- """
- if CONST.__getattribute__('vping_cleanup_objects') == 'True':
- for creator in reversed(self.creators):
- try:
- creator.clean()
- except Exception as error: # pylint: disable=broad-except
- self.logger.error('Unexpected error cleaning - %s', error)
-
- def _do_vping(self, vm_creator, test_ip):
- """
- Method to be implemented by subclasses
- Begins the real test after the OpenStack environment has been setup
- :param vm_creator: the SNAPS VM instance creator object
- :param test_ip: the IP to which the VM needs to issue the ping
- :return: T/F
- """
- raise NotImplementedError('vping execution is not implemented')
diff --git a/functest/opnfv_tests/openstack/vping/vping_ssh.py b/functest/opnfv_tests/openstack/vping/vping_ssh.py
index 7df767edc..ad64348c4 100644
--- a/functest/opnfv_tests/openstack/vping/vping_ssh.py
+++ b/functest/opnfv_tests/openstack/vping/vping_ssh.py
@@ -1,5 +1,5 @@
#!/usr/bin/env python
-#
+
# Copyright (c) 2015 All rights reserved
# This program and the accompanying materials
# are made available under the terms of the Apache License, Version 2.0
@@ -7,32 +7,15 @@
#
# http://www.apache.org/licenses/LICENSE-2.0
-
"""vPingSSH testcase."""
-# This 1st import is here simply for pep8 as the 'os' package import appears
-# to be required for mock and the unit tests will fail without it
-import os # noqa # pylint: disable=unused-import
-import time
-
-from scp import SCPClient
-import pkg_resources
-
-from functest.core.testcase import TestCase
-from functest.energy import energy
-from functest.opnfv_tests.openstack.vping import vping_base
-from functest.utils.constants import CONST
-
-from snaps.config.keypair import KeypairConfig
-from snaps.config.network import PortConfig
-from snaps.config.security_group import (
- Direction, Protocol, SecurityGroupConfig, SecurityGroupRuleConfig)
-from snaps.config.vm_inst import FloatingIpConfig, VmInstanceConfig
+import logging
-from snaps.openstack.utils import deploy_utils
+from functest.core import singlevm
+from functest.utils import config
-class VPingSSH(vping_base.VPingBase):
+class VPingSSH(singlevm.SingleVm2):
"""
VPingSSH testcase implementation.
@@ -40,200 +23,40 @@ class VPingSSH(vping_base.VPingBase):
to issue the ping command to the second
"""
+ __logger = logging.getLogger(__name__)
+
def __init__(self, **kwargs):
"""Initialize testcase."""
if "case_name" not in kwargs:
kwargs["case_name"] = "vping_ssh"
- super(VPingSSH, self).__init__(**kwargs)
-
- self.kp_name = CONST.__getattribute__('vping_keypair_name') + self.guid
- self.kp_priv_file = CONST.__getattribute__('vping_keypair_priv_file')
- self.kp_pub_file = CONST.__getattribute__('vping_keypair_pub_file')
- self.sg_name = CONST.__getattribute__('vping_sg_name') + self.guid
- self.sg_desc = CONST.__getattribute__('vping_sg_desc')
-
- @energy.enable_recording
- def run(self):
- """
- Excecute VPingSSH testcase.
-
- Sets up the OpenStack keypair, router, security group, and VM instance
- objects then validates the ping.
- :return: the exit code from the super.execute() method
- """
- try:
- super(VPingSSH, self).run()
-
- log = "Creating keypair with name: '%s'" % self.kp_name
- self.logger.info(log)
- kp_creator = deploy_utils.create_keypair(
- self.os_creds,
- KeypairConfig(
- name=self.kp_name, private_filepath=self.kp_priv_file,
- public_filepath=self.kp_pub_file))
- self.creators.append(kp_creator)
-
- # Creating Instance 1
- port1_settings = PortConfig(
- name=self.vm1_name + '-vPingPort',
- network_name=self.network_creator.network_settings.name)
- instance1_settings = VmInstanceConfig(
- name=self.vm1_name, flavor=self.flavor_name,
- vm_boot_timeout=self.vm_boot_timeout,
- vm_delete_timeout=self.vm_delete_timeout,
- ssh_connect_timeout=self.vm_ssh_connect_timeout,
- port_settings=[port1_settings])
-
- log = ("Creating VM 1 instance with name: '%s'"
- % instance1_settings.name)
- self.logger.info(log)
- self.vm1_creator = deploy_utils.create_vm_instance(
- self.os_creds,
- instance1_settings,
- self.image_creator.image_settings,
- keypair_creator=kp_creator)
- self.creators.append(self.vm1_creator)
-
- # Creating Instance 2
- sg_creator = self.__create_security_group()
- self.creators.append(sg_creator)
-
- port2_settings = PortConfig(
- name=self.vm2_name + '-vPingPort',
- network_name=self.network_creator.network_settings.name)
- instance2_settings = VmInstanceConfig(
- name=self.vm2_name, flavor=self.flavor_name,
- vm_boot_timeout=self.vm_boot_timeout,
- vm_delete_timeout=self.vm_delete_timeout,
- ssh_connect_timeout=self.vm_ssh_connect_timeout,
- port_settings=[port2_settings],
- security_group_names=[sg_creator.sec_grp_settings.name],
- floating_ip_settings=[FloatingIpConfig(
- name=self.vm2_name + '-FIPName',
- port_name=port2_settings.name,
- router_name=self.router_creator.router_settings.name)])
-
- log = ("Creating VM 2 instance with name: '%s'"
- % instance2_settings.name)
- self.logger.info(log)
- self.vm2_creator = deploy_utils.create_vm_instance(
- self.os_creds,
- instance2_settings,
- self.image_creator.image_settings,
- keypair_creator=kp_creator)
- self.creators.append(self.vm2_creator)
-
- return self._execute()
- except Exception as exc: # pylint: disable=broad-except
- self.logger.error('Unexpected error running test - ' + exc.message)
- return TestCase.EX_RUN_ERROR
- finally:
- self._cleanup()
-
- def _do_vping(self, vm_creator, test_ip):
- """
- Execute ping command.
-
- Override from super
- """
- if vm_creator.vm_ssh_active(block=True):
- ssh = vm_creator.ssh_client()
- if not self._transfer_ping_script(ssh):
- return TestCase.EX_RUN_ERROR
- return self._do_vping_ssh(ssh, test_ip)
- else:
- return TestCase.EX_RUN_ERROR
-
- def _transfer_ping_script(self, ssh):
- """
- Transfert vping script to VM.
-
- Uses SCP to copy the ping script via the SSH client
- :param ssh: the SSH client
- :return:
- """
- self.logger.info("Trying to transfer ping.sh")
- scp = SCPClient(ssh.get_transport())
- ping_script = pkg_resources.resource_filename(
- 'functest.opnfv_tests.openstack.vping', 'ping.sh')
- try:
- scp.put(ping_script, "~/")
- except Exception: # pylint: disable=broad-except
- self.logger.error("Cannot SCP the file '%s'", ping_script)
- return False
-
- cmd = 'chmod 755 ~/ping.sh'
- # pylint: disable=unused-variable
- (stdin, stdout, stderr) = ssh.exec_command(cmd)
- for line in stdout.readlines():
- print line
-
- return True
-
- def _do_vping_ssh(self, ssh, test_ip):
- """
- Execute ping command via SSH.
-
- Pings the test_ip via the SSH client
- :param ssh: the SSH client used to issue the ping command
- :param test_ip: the IP for the ping command to use
- :return: exit_code (int)
- """
- exit_code = TestCase.EX_TESTCASE_FAILED
- self.logger.info("Waiting for ping...")
-
- sec = 0
- cmd = '~/ping.sh ' + test_ip
- flag = False
-
- while True:
- time.sleep(1)
- (_, stdout, _) = ssh.exec_command(cmd)
- output = stdout.readlines()
-
- for line in output:
- if "vPing OK" in line:
- self.logger.info("vPing detected!")
- exit_code = TestCase.EX_OK
- flag = True
- break
-
- elif sec == self.ping_timeout:
- self.logger.info("Timeout reached.")
- flag = True
- break
- if flag:
- break
- log = "Pinging %s. Waiting for response..." % test_ip
- self.logger.debug(log)
- sec += 1
- return exit_code
-
- def __create_security_group(self):
- """
- Configure OpenStack security groups.
-
- Configures and deploys an OpenStack security group object
- :return: the creator object
- """
- sg_rules = list()
- sg_rules.append(
- SecurityGroupRuleConfig(
- sec_grp_name=self.sg_name, direction=Direction.ingress,
- protocol=Protocol.icmp))
- sg_rules.append(
- SecurityGroupRuleConfig(
- sec_grp_name=self.sg_name, direction=Direction.ingress,
- protocol=Protocol.tcp, port_range_min=22, port_range_max=22))
- sg_rules.append(
- SecurityGroupRuleConfig(
- sec_grp_name=self.sg_name, direction=Direction.egress,
- protocol=Protocol.tcp, port_range_min=22, port_range_max=22))
-
- log = "Security group with name: '%s'" % self.sg_name
- self.logger.info(log)
- return deploy_utils.create_security_group(self.os_creds,
- SecurityGroupConfig(
- name=self.sg_name,
- description=self.sg_desc,
- rule_settings=sg_rules))
+ super().__init__(**kwargs)
+ self.vm2 = None
+
+ def prepare(self):
+ super().prepare()
+ self.vm2 = self.boot_vm(
+ f'{self.case_name}-vm2_{self.guid}',
+ security_groups=[self.sec.id])
+
+ def execute(self):
+ """Ping the second VM
+
+ Returns: ping exit codes
+ """
+ assert self.ssh
+ if not self.check_regex_in_console(self.vm2.name):
+ return 1
+ ip4 = self.vm2.private_v4 or self.vm2.addresses[
+ self.network.name][0].addr
+ (_, stdout, stderr) = self.ssh.exec_command(f'ping -c 1 {ip4}')
+ self.__logger.info("output:\n%s", stdout.read().decode("utf-8"))
+ self.__logger.info("error:\n%s", stderr.read().decode("utf-8"))
+ return stdout.channel.recv_exit_status()
+
+ def clean(self):
+ assert self.cloud
+ if self.vm2:
+ self.cloud.delete_server(
+ self.vm2, wait=True,
+ timeout=getattr(config.CONF, 'vping_vm_delete_timeout'))
+ super().clean()
diff --git a/functest/opnfv_tests/openstack/vping/vping_userdata.py b/functest/opnfv_tests/openstack/vping/vping_userdata.py
index ceba0917a..8a8f26f37 100644
--- a/functest/opnfv_tests/openstack/vping/vping_userdata.py
+++ b/functest/opnfv_tests/openstack/vping/vping_userdata.py
@@ -1,5 +1,5 @@
#!/usr/bin/env python
-#
+
# Copyright (c) 2015 All rights reserved
# This program and the accompanying materials
# are made available under the terms of the Apache License, Version 2.0
@@ -9,17 +9,16 @@
"""vping_userdata testcase."""
+import logging
import time
-from snaps.config.network import PortConfig
-from snaps.config.vm_inst import VmInstanceConfig
-from snaps.openstack.utils import deploy_utils
+from xtesting.core import testcase
-from functest.core.testcase import TestCase
-from functest.opnfv_tests.openstack.vping import vping_base
+from functest.core import singlevm
+from functest.utils import config
-class VPingUserdata(vping_base.VPingBase):
+class VPingUserdata(singlevm.VmReady2):
"""
Class to execute the vPing test using userdata and the VM's console
"""
@@ -27,117 +26,112 @@ class VPingUserdata(vping_base.VPingBase):
def __init__(self, **kwargs):
if "case_name" not in kwargs:
kwargs["case_name"] = "vping_userdata"
- super(VPingUserdata, self).__init__(**kwargs)
+ super().__init__(**kwargs)
+ self.logger = logging.getLogger(__name__)
+ self.vm1 = None
+ self.vm2 = None
- def run(self):
+ def run(self, **kwargs):
"""
Sets up the OpenStack VM instance objects then executes the ping and
validates.
:return: the exit code from the super.execute() method
"""
try:
- super(VPingUserdata, self).run()
-
- # Creating Instance 1
- port1_settings = PortConfig(
- name=self.vm1_name + '-vPingPort',
- network_name=self.network_creator.network_settings.name)
- instance1_settings = VmInstanceConfig(
- name=self.vm1_name,
- flavor=self.flavor_name,
- vm_boot_timeout=self.vm_boot_timeout,
- port_settings=[port1_settings])
-
- self.logger.info(
- "Creating VM 1 instance with name: '%s'",
- instance1_settings.name)
- self.vm1_creator = deploy_utils.create_vm_instance(
- self.os_creds, instance1_settings,
- self.image_creator.image_settings)
- self.creators.append(self.vm1_creator)
-
- userdata = _get_userdata(
- self.vm1_creator.get_port_ip(port1_settings.name))
- if userdata:
- # Creating Instance 2
- port2_settings = PortConfig(
- name=self.vm2_name + '-vPingPort',
- network_name=self.network_creator.network_settings.name)
- instance2_settings = VmInstanceConfig(
- name=self.vm2_name,
- flavor=self.flavor_name,
- vm_boot_timeout=self.vm_boot_timeout,
- port_settings=[port2_settings],
- userdata=userdata)
-
- self.logger.info(
- "Creating VM 2 instance with name: '%s'",
- instance2_settings.name)
- self.vm2_creator = deploy_utils.create_vm_instance(
- self.os_creds, instance2_settings,
- self.image_creator.image_settings)
- self.creators.append(self.vm2_creator)
- else:
- raise Exception('Userdata is None')
-
- return self._execute()
-
- finally:
- self._cleanup()
-
- def _do_vping(self, vm_creator, test_ip):
+ assert self.cloud
+ assert super().run(
+ **kwargs) == testcase.TestCase.EX_OK
+ self.result = 0
+ self.vm1 = self.boot_vm()
+ self.vm2 = self.boot_vm(
+ f'{self.case_name}-vm2_{self.guid}',
+ userdata=self._get_userdata())
+
+ result = self._do_vping()
+ self.stop_time = time.time()
+ if result != testcase.TestCase.EX_OK:
+ return testcase.TestCase.EX_RUN_ERROR
+ self.result = 100
+ return testcase.TestCase.EX_OK
+ except Exception: # pylint: disable=broad-except
+ self.logger.exception('Unexpected error running vping_userdata')
+ return testcase.TestCase.EX_RUN_ERROR
+
+ def _do_vping(self):
"""
Override from super
"""
+ if not (self.vm1.private_v4 or self.vm1.addresses[
+ self.network.name][0].addr):
+ self.logger.error("vm1: IP addr missing")
+ return testcase.TestCase.EX_TESTCASE_FAILED
+
self.logger.info("Waiting for ping...")
- exit_code = TestCase.EX_TESTCASE_FAILED
+ exit_code = testcase.TestCase.EX_TESTCASE_FAILED
sec = 0
tries = 0
while True:
time.sleep(1)
- p_console = vm_creator.get_console_output()
+ p_console = self.cloud.get_server_console(self.vm2.id)
+ self.logger.debug("console: \n%s", p_console)
if "vPing OK" in p_console:
self.logger.info("vPing detected!")
- exit_code = TestCase.EX_OK
+ exit_code = testcase.TestCase.EX_OK
break
- elif "failed to read iid from metadata" in p_console or tries > 5:
+ if "failed to read iid from metadata" in p_console or tries > 5:
self.logger.info("Failed to read iid from metadata")
break
- elif sec == self.ping_timeout:
+ if sec == getattr(config.CONF, 'vping_ping_timeout'):
self.logger.info("Timeout reached.")
break
- elif sec % 10 == 0:
+ if sec % 10 == 0:
if "request failed" in p_console:
self.logger.debug(
- "It seems userdata is not supported in nova boot. " +
+ "It seems userdata is not supported in nova boot. "
"Waiting a bit...")
tries += 1
else:
self.logger.debug(
- "Pinging %s. Waiting for response...", test_ip)
+ "Pinging %s. Waiting for response...",
+ self.vm1.private_v4 or self.vm1.addresses[
+ self.network.name][0].addr)
sec += 1
return exit_code
-
-def _get_userdata(test_ip):
- """
- Returns the post VM creation script to be added into the VM's userdata
- :param test_ip: the IP value to substitute into the script
- :return: the bash script contents
- """
- if test_ip:
- return ("#!/bin/sh\n\n"
- "while true; do\n"
- " ping -c 1 %s 2>&1 >/dev/null\n"
- " RES=$?\n"
- " if [ \"Z$RES\" = \"Z0\" ] ; then\n"
- " echo 'vPing OK'\n"
- " break\n"
- " else\n"
- " echo 'vPing KO'\n"
- " fi\n"
- " sleep 1\n"
- "done\n" % str(test_ip))
- return None
+ def _get_userdata(self):
+ """
+ Returns the post VM creation script to be added into the VM's userdata
+ :param test_ip: the IP value to substitute into the script
+ :return: the shell script contents
+ """
+ ip4 = self.vm1.private_v4 or self.vm1.addresses[
+ self.network.name][0].addr
+ if self.vm1.private_v4 or self.vm1.addresses[
+ self.network.name][0].addr:
+ return ("#!/bin/sh\n\n"
+ "while true; do\n"
+ f" ping -c 1 {ip4} 2>&1 >/dev/null\n"
+ " RES=$?\n"
+ " if [ \"Z$RES\" = \"Z0\" ] ; then\n"
+ " echo 'vPing OK'\n"
+ " break\n"
+ " else\n"
+ " echo 'vPing KO'\n"
+ " fi\n"
+ " sleep 1\n"
+ "done\n")
+ return None
+
+ def clean(self):
+ assert self.cloud
+ if self.vm1:
+ self.cloud.delete_server(
+ self.vm1, wait=True,
+ timeout=getattr(config.CONF, 'vping_vm_delete_timeout'))
+ if self.vm2:
+ self.cloud.delete_server(
+ self.vm2, wait=True,
+ timeout=getattr(config.CONF, 'vping_vm_delete_timeout'))
+ super().clean()
diff --git a/functest/opnfv_tests/sdn/odl/odl.py b/functest/opnfv_tests/sdn/odl/odl.py
index 6c05c0181..72c38ce2c 100644
--- a/functest/opnfv_tests/sdn/odl/odl.py
+++ b/functest/opnfv_tests/sdn/odl/odl.py
@@ -25,11 +25,12 @@ import os
import re
import sys
+import os_client_config
from six.moves import urllib
+from xtesting.core import robotframework
-from functest.core import robotframework
-from functest.utils import constants
-import functest.utils.openstack_utils as op_utils
+from functest.utils import config
+from functest.utils import env
__author__ = "Cedric Ollivier <cedric.ollivier@orange.com>"
@@ -37,7 +38,7 @@ __author__ = "Cedric Ollivier <cedric.ollivier@orange.com>"
class ODLTests(robotframework.RobotFramework):
"""ODL test runner."""
- odl_test_repo = constants.CONST.__getattribute__('dir_repo_odl_test')
+ odl_test_repo = getattr(config.CONF, 'dir_repo_odl_test')
neutron_suite_dir = os.path.join(
odl_test_repo, "csit/suites/openstack/neutron")
basic_suite_dir = os.path.join(
@@ -48,9 +49,9 @@ class ODLTests(robotframework.RobotFramework):
__logger = logging.getLogger(__name__)
def __init__(self, **kwargs):
- super(ODLTests, self).__init__(**kwargs)
+ super().__init__(**kwargs)
self.res_dir = os.path.join(
- constants.CONST.__getattribute__('dir_results'), 'odl')
+ getattr(config.CONF, 'dir_results'), 'odl')
self.xml_file = os.path.join(self.res_dir, 'output.xml')
@classmethod
@@ -65,10 +66,10 @@ class ODLTests(robotframework.RobotFramework):
try:
for line in fileinput.input(cls.odl_variables_file,
inplace=True):
- print(re.sub("@{AUTH}.*",
- "@{{AUTH}} {} {}".format(
- odlusername, odlpassword),
- line.rstrip()))
+ print(re.sub(
+ "@{AUTH}.*",
+ f"@{{AUTH}} {odlusername} {odlpassword}",
+ line.rstrip()))
return True
except Exception: # pylint: disable=broad-except
cls.__logger.exception("Cannot set ODL creds:")
@@ -110,9 +111,8 @@ class ODLTests(robotframework.RobotFramework):
odlusername = kwargs['odlusername']
odlpassword = kwargs['odlpassword']
osauthurl = kwargs['osauthurl']
- keystoneurl = "{}://{}".format(
- urllib.parse.urlparse(osauthurl).scheme,
- urllib.parse.urlparse(osauthurl).netloc)
+ keystoneurl = (f"{urllib.parse.urlparse(osauthurl).scheme}://"
+ f"{urllib.parse.urlparse(osauthurl).netloc}")
variable = ['KEYSTONEURL:' + keystoneurl,
'NEUTRONURL:' + kwargs['neutronurl'],
'OS_AUTH_URL:"' + osauthurl + '"',
@@ -134,12 +134,12 @@ class ODLTests(robotframework.RobotFramework):
else:
if not self.set_robotframework_vars(odlusername, odlpassword):
return self.EX_RUN_ERROR
- return super(ODLTests, self).run(variable=variable, suites=suites)
+ return super().run(variable=variable, suites=suites)
def run(self, **kwargs):
"""Run suites in OPNFV environment
- It basically check env vars to call main() with the keywords
+ It basically checks env vars to call main() with the keywords
required.
Args:
@@ -155,17 +155,19 @@ class ODLTests(robotframework.RobotFramework):
suites = kwargs["suites"]
except KeyError:
pass
- kwargs = {'neutronurl': op_utils.get_endpoint(
- service_type='network')}
- kwargs['odlip'] = urllib.parse.urlparse(
- kwargs['neutronurl']).hostname
- kwargs['odlwebport'] = '8080'
- kwargs['odlrestconfport'] = '8181'
- kwargs['odlusername'] = 'admin'
- kwargs['odlpassword'] = 'admin'
- installer_type = None
- if 'INSTALLER_TYPE' in os.environ:
- installer_type = os.environ['INSTALLER_TYPE']
+ cloud = os_client_config.make_shade()
+ neutron_id = cloud.search_services('neutron')[0].id
+ endpoint = cloud.search_endpoints(
+ filters={
+ 'interface': os.environ.get(
+ 'OS_INTERFACE', 'public').replace('URL', ''),
+ 'service_id': neutron_id})[0].url
+ kwargs = {'neutronurl': endpoint}
+ kwargs['odlip'] = env.get('SDN_CONTROLLER_IP')
+ kwargs['odlwebport'] = env.get('SDN_CONTROLLER_WEBPORT')
+ kwargs['odlrestconfport'] = env.get('SDN_CONTROLLER_RESTCONFPORT')
+ kwargs['odlusername'] = env.get('SDN_CONTROLLER_USER')
+ kwargs['odlpassword'] = env.get('SDN_CONTROLLER_PASSWORD')
kwargs['osusername'] = os.environ['OS_USERNAME']
kwargs['osuserdomainname'] = os.environ.get(
'OS_USER_DOMAIN_NAME', 'Default')
@@ -174,27 +176,10 @@ class ODLTests(robotframework.RobotFramework):
'OS_PROJECT_DOMAIN_NAME', 'Default')
kwargs['osauthurl'] = os.environ['OS_AUTH_URL']
kwargs['ospassword'] = os.environ['OS_PASSWORD']
- if installer_type == 'fuel':
- kwargs['odlwebport'] = '8181'
- kwargs['odlrestconfport'] = '8282'
- elif installer_type == 'apex' or installer_type == 'netvirt':
- kwargs['odlip'] = os.environ['SDN_CONTROLLER_IP']
- kwargs['odlwebport'] = '8081'
- kwargs['odlrestconfport'] = '8081'
- elif installer_type == 'joid':
- kwargs['odlip'] = os.environ['SDN_CONTROLLER']
- elif installer_type == 'compass':
- kwargs['odlrestconfport'] = '8080'
- elif installer_type == 'daisy':
- kwargs['odlip'] = os.environ['SDN_CONTROLLER_IP']
- kwargs['odlwebport'] = '8181'
- kwargs['odlrestconfport'] = '8087'
- else:
- kwargs['odlip'] = os.environ['SDN_CONTROLLER_IP']
+ assert kwargs['odlip']
except KeyError as ex:
- self.__logger.error("Cannot run ODL testcases. "
- "Please check env var: "
- "%s", str(ex))
+ self.__logger.error(
+ "Cannot run ODL testcases. Please check env var: %s", str(ex))
return self.EX_RUN_ERROR
except Exception: # pylint: disable=broad-except
self.__logger.exception("Cannot run ODL testcases.")
@@ -203,7 +188,7 @@ class ODLTests(robotframework.RobotFramework):
return self.run_suites(suites, **kwargs)
-class ODLParser(object): # pylint: disable=too-few-public-methods
+class ODLParser(): # pylint: disable=too-few-public-methods
"""Parser to run ODL test suites."""
def __init__(self):
@@ -274,7 +259,6 @@ def main():
return result
if args['pushtodb']:
return odl.push_to_db()
- else:
- return result
+ return result
except Exception: # pylint: disable=broad-except
return robotframework.RobotFramework.EX_RUN_ERROR
diff --git a/functest/opnfv_tests/vnf/epc/juju_epc.py b/functest/opnfv_tests/vnf/epc/juju_epc.py
index 3146b935c..1cf240b80 100644
--- a/functest/opnfv_tests/vnf/epc/juju_epc.py
+++ b/functest/opnfv_tests/vnf/epc/juju_epc.py
@@ -8,159 +8,220 @@
# http://www.apache.org/licenses/LICENSE-2.0
"""Juju testcase implementation."""
+import errno
import logging
-import shutil
import os
import time
import json
+import re
import sys
-from copy import deepcopy
-from urlparse import urljoin
-
-import functest.core.vnf as vnf
-from functest.opnfv_tests.openstack.snaps import snaps_utils
-from functest.utils.constants import CONST
-import functest.utils.openstack_utils as os_utils
+from copy import deepcopy
import pkg_resources
-from snaps.openstack.os_credentials import OSCreds
-from snaps.openstack.create_network import (NetworkSettings,
- SubnetSettings, OpenStackNetwork)
-from snaps.openstack.create_router import (RouterSettings, OpenStackRouter)
-from snaps.openstack.create_flavor import (FlavorSettings, OpenStackFlavor)
-from snaps.openstack.create_image import (ImageSettings, OpenStackImage)
-from snaps.openstack.tests import openstack_tests
-from snaps.openstack.utils import keystone_utils
-import yaml
+import scp
+
+from functest.core import singlevm
+from functest.utils import config
+from functest.utils import env
+from functest.utils import functest_utils
__author__ = "Amarendra Meher <amarendra@rebaca.com>"
__author__ = "Soumaya K Nayek <soumaya.nayek@rebaca.com>"
+CLOUD_TEMPLATE = """clouds:
+ abot-epc:
+ type: openstack
+ auth-types: [userpass]
+ endpoint: {url}
+ regions:
+ {region}:
+ endpoint: {url}"""
+
+CREDS_TEMPLATE2 = """credentials:
+ abot-epc:
+ default-credential: abot-epc
+ abot-epc:
+ auth-type: userpass
+ password: '{pass}'
+ project-domain-name: {project_domain_n}
+ tenant-name: {tenant_n}"""
+
+CREDS_TEMPLATE = """credentials:
+ abot-epc:
+ default-credential: abot-epc
+ abot-epc:
+ auth-type: userpass
+ password: '{pass}'
+ project-domain-name: {project_domain_n}
+ tenant-name: {tenant_n}
+ user-domain-name: {user_domain_n}
+ username: {user_n}"""
-class JujuEpc(vnf.VnfOnBoarding):
+
+class JujuEpc(singlevm.SingleVm2):
# pylint:disable=too-many-instance-attributes
"""Abot EPC deployed with JUJU Orchestrator Case"""
__logger = logging.getLogger(__name__)
- default_region_name = "RegionOne"
+ cidr = '192.168.120.0/24'
+
+ filename = ('/home/opnfv/functest/images/'
+ 'ubuntu-16.04-server-cloudimg-amd64-disk1.img')
+ filename_alt = ('/home/opnfv/functest/images/'
+ 'ubuntu-14.04-server-cloudimg-amd64-disk1.img')
+
+ flavor_ram = 2048
+ flavor_vcpus = 1
+ flavor_disk = 10
+ flavor_alt_ram = 4096
+ flavor_alt_vcpus = 1
+ flavor_alt_disk = 10
+ username = 'ubuntu'
+ juju_timeout = '4800'
def __init__(self, **kwargs):
if "case_name" not in kwargs:
kwargs["case_name"] = "juju_epc"
- super(JujuEpc, self).__init__(**kwargs)
+ super().__init__(**kwargs)
# Retrieve the configuration
self.case_dir = pkg_resources.resource_filename(
'functest', 'opnfv_tests/vnf/epc')
try:
- self.config = CONST.__getattribute__(
- 'vnf_{}_config'.format(self.case_name))
- except Exception:
- raise Exception("VNF config file not found")
- config_file = os.path.join(self.case_dir, self.config)
+ self.config = getattr(
+ config.CONF, f'vnf_{self.case_name}_config')
+ except Exception as exc:
+ raise Exception("VNF config file not found") from exc
+ self.config_file = os.path.join(self.case_dir, self.config)
self.orchestrator = dict(
- requirements=get_config("orchestrator.requirements", config_file),
- )
+ requirements=functest_utils.get_parameter_from_yaml(
+ "orchestrator.requirements", self.config_file))
self.created_object = []
- self.snaps_creds = ''
-
- self.os_creds = openstack_tests.get_credentials(
- os_env_file=CONST.__getattribute__('openstack_creds'))
-
self.details['orchestrator'] = dict(
- name=get_config("orchestrator.name", config_file),
- version=get_config("orchestrator.version", config_file),
+ name=functest_utils.get_parameter_from_yaml(
+ "orchestrator.name", self.config_file),
+ version=functest_utils.get_parameter_from_yaml(
+ "orchestrator.version", self.config_file),
status='ERROR',
result=''
)
self.vnf = dict(
- descriptor=get_config("vnf.descriptor", config_file),
- requirements=get_config("vnf.requirements", config_file)
+ descriptor=functest_utils.get_parameter_from_yaml(
+ "vnf.descriptor", self.config_file),
+ requirements=functest_utils.get_parameter_from_yaml(
+ "vnf.requirements", self.config_file)
)
self.details['vnf'] = dict(
descriptor_version=self.vnf['descriptor']['version'],
- name=get_config("vnf.name", config_file),
- version=get_config("vnf.version", config_file),
+ name=functest_utils.get_parameter_from_yaml(
+ "vnf.name", self.config_file),
+ version=functest_utils.get_parameter_from_yaml(
+ "vnf.version", self.config_file),
)
self.__logger.debug("VNF configuration: %s", self.vnf)
self.details['test_vnf'] = dict(
- name=get_config("vnf_test_suite.name", config_file),
- version=get_config("vnf_test_suite.version", config_file),
- tag_name=get_config("vnf_test_suite.tag_name", config_file)
+ name=functest_utils.get_parameter_from_yaml(
+ "vnf_test_suite.name", self.config_file),
+ version=functest_utils.get_parameter_from_yaml(
+ "vnf_test_suite.version", self.config_file),
+ tag_name=functest_utils.get_parameter_from_yaml(
+ "vnf_test_suite.tag_name", self.config_file)
)
- self.images = get_config("tenant_images", config_file)
- self.__logger.info("Images needed for vEPC: %s", self.images)
- self.keystone_client = os_utils.get_keystone_client()
- self.glance_client = os_utils.get_glance_client()
- self.neutron_client = os_utils.get_neutron_client()
- self.nova_client = os_utils.get_nova_client()
- self.sec_group_id = None
- self.public_auth_url = None
- self.creds = None
- self.filename = None
-
- def prepare(self):
- """Prepare testcase (Additional pre-configuration steps)."""
- self.__logger.debug("OS Credentials: %s", os_utils.get_credentials())
- super(JujuEpc, self).prepare()
-
- self.__logger.info("Additional pre-configuration steps")
- self.public_auth_url = keystone_utils.get_endpoint(
- self.snaps_creds, 'identity')
- # it enforces a versioned public identity endpoint as juju simply
- # adds /auth/tokens wich fails vs an unversioned endpoint.
- if not self.public_auth_url.endswith(('v3', 'v3/', 'v2.0', 'v2.0/')):
- self.public_auth_url = urljoin(self.public_auth_url, 'v3')
-
- self.creds = {
- "tenant": self.tenant_name,
- "username": self.tenant_name,
- "password": self.tenant_name,
- "auth_url": os_utils.get_credentials()['auth_url']
- }
-
- self.snaps_creds = OSCreds(
- username=self.creds['username'],
- password=self.creds['password'],
- auth_url=self.creds['auth_url'],
- project_name=self.creds['tenant'],
- identity_api_version=int(os_utils.get_keystone_client_version()))
+ self.res_dir = os.path.join(
+ getattr(config.CONF, 'dir_results'), self.case_name)
+ try:
+ self.public_auth_url = self.get_public_auth_url(self.orig_cloud)
+ if not self.public_auth_url.endswith(('v3', 'v3/')):
+ self.public_auth_url = f"{self.public_auth_url}/v3"
+ except Exception: # pylint: disable=broad-except
+ self.public_auth_url = None
+ self.sec = None
+ self.image_alt = None
+ self.flavor_alt = None
+
+ def _install_juju(self):
+ (_, stdout, stderr) = self.ssh.exec_command(
+ 'sudo snap install juju --channel=2.3/stable --classic')
+ self.__logger.debug("stdout:\n%s", stdout.read().decode("utf-8"))
+ self.__logger.debug("stderr:\n%s", stderr.read().decode("utf-8"))
+ return not stdout.channel.recv_exit_status()
+
+ def _install_juju_wait(self):
+ (_, stdout, stderr) = self.ssh.exec_command(
+ 'sudo apt-get update && sudo apt-get install python3-pip -y && '
+ 'sudo pip3 install juju_wait===2.6.4')
+ self.__logger.debug("stdout:\n%s", stdout.read().decode("utf-8"))
+ self.__logger.debug("stderr:\n%s", stderr.read().decode("utf-8"))
+ return not stdout.channel.recv_exit_status()
+
+ def _register_cloud(self):
+ assert self.public_auth_url
+ self.__logger.info("Creating Cloud for Abot-epc .....")
+ clouds_yaml = os.path.join(self.res_dir, "clouds.yaml")
cloud_data = {
'url': self.public_auth_url,
- 'pass': self.tenant_name,
- 'tenant_n': self.tenant_name,
- 'user_n': self.tenant_name,
- 'region': os.environ.get(
- "OS_REGION_NAME", self.default_region_name)
- }
- self.__logger.info("Cloud DATA: %s", cloud_data)
- self.filename = os.path.join(self.case_dir, 'abot-epc.yaml')
- self.__logger.info("Create %s to add cloud info", self.filename)
- write_config(self.filename, CLOUD_TEMPLATE, **cloud_data)
-
- if self.snaps_creds.identity_api_version == 3:
- append_config(self.filename, '{}'.format(
- os_utils.get_credentials()['project_domain_name']),
- '{}'.format(os_utils.get_credentials()['user_domain_name']))
-
- self.__logger.info("Upload some OS images if it doesn't exist")
- for image_name, image_file in self.images.iteritems():
- self.__logger.info("image: %s, file: %s", image_name, image_file)
- if image_file and image_name:
- image_creator = OpenStackImage(
- self.snaps_creds,
- ImageSettings(name=image_name,
- image_user='cloud',
- img_format='qcow2',
- image_file=image_file))
- image_creator.create()
- self.created_object.append(image_creator)
+ 'region': self.cloud.region_name if self.cloud.region_name else (
+ 'RegionOne')}
+ with open(clouds_yaml, 'w', encoding='utf-8') as yfile:
+ yfile.write(CLOUD_TEMPLATE.format(**cloud_data))
+ scpc = scp.SCPClient(self.ssh.get_transport())
+ scpc.put(clouds_yaml, remote_path='~/')
+ (_, stdout, stderr) = self.ssh.exec_command(
+ '/snap/bin/juju add-cloud abot-epc -f clouds.yaml --replace')
+ self.__logger.debug("stdout:\n%s", stdout.read().decode("utf-8"))
+ self.__logger.debug("stderr:\n%s", stderr.read().decode("utf-8"))
+ return not stdout.channel.recv_exit_status()
+
+ def _register_credentials(self):
+ self.__logger.info("Creating Credentials for Abot-epc .....")
+ credentials_yaml = os.path.join(self.res_dir, "credentials.yaml")
+ creds_data = {
+ 'pass': self.project.password,
+ 'tenant_n': self.project.project.name,
+ 'user_n': self.project.user.name,
+ 'project_domain_n': self.cloud.auth.get(
+ "project_domain_name", "Default"),
+ 'user_domain_n': self.cloud.auth.get(
+ "user_domain_name", "Default")}
+ with open(credentials_yaml, 'w', encoding='utf-8') as yfile:
+ yfile.write(CREDS_TEMPLATE.format(**creds_data))
+ scpc = scp.SCPClient(self.ssh.get_transport())
+ scpc.put(credentials_yaml, remote_path='~/')
+ (_, stdout, stderr) = self.ssh.exec_command(
+ '/snap/bin/juju add-credential abot-epc -f credentials.yaml '
+ ' --replace --debug')
+ self.__logger.debug("stdout:\n%s", stdout.read().decode("utf-8"))
+ self.__logger.debug("stderr:\n%s", stderr.read().decode("utf-8"))
+ return not stdout.channel.recv_exit_status()
+
+ def _publish_image(self):
+ region_name = self.cloud.region_name if self.cloud.region_name else (
+ 'RegionOne')
+ (_, stdout, stderr) = self.ssh.exec_command(
+ '/snap/bin/juju metadata generate-image -d /home/ubuntu '
+ f'-i {self.image.id} -s xenial -r {region_name} '
+ f'-u {self.public_auth_url}')
+ self.__logger.debug("stdout:\n%s", stdout.read().decode("utf-8"))
+ self.__logger.debug("stderr:\n%s", stderr.read().decode("utf-8"))
+ return not stdout.channel.recv_exit_status()
+
+ def publish_image_alt(self, name=None):
+ image_alt = super().publish_image_alt(name)
+ region_name = self.cloud.region_name if self.cloud.region_name else (
+ 'RegionOne')
+ (_, stdout, stderr) = self.ssh.exec_command(
+ '/snap/bin/juju metadata generate-image -d /home/ubuntu '
+ f'-i {image_alt.id} -s trusty -r {region_name} '
+ f'-u {self.public_auth_url}')
+ self.__logger.debug("stdout:\n%s", stdout.read().decode("utf-8"))
+ self.__logger.debug("stderr:\n%s", stderr.read().decode("utf-8"))
+ return image_alt
def deploy_orchestrator(self): # pylint: disable=too-many-locals
"""
@@ -168,235 +229,181 @@ class JujuEpc(vnf.VnfOnBoarding):
Bootstrap juju
"""
- self.__logger.info("Deployed Orchestrator")
- private_net_name = CONST.__getattribute__(
- 'vnf_{}_private_net_name'.format(self.case_name))
- private_subnet_name = CONST.__getattribute__(
- 'vnf_{}_private_subnet_name'.format(self.case_name))
- private_subnet_cidr = CONST.__getattribute__(
- 'vnf_{}_private_subnet_cidr'.format(self.case_name))
- abot_router = CONST.__getattribute__(
- 'vnf_{}_external_router'.format(self.case_name))
- dns_nameserver = CONST.__getattribute__(
- 'vnf_{}_dns_nameserver'.format(self.case_name))
- ext_net_name = CONST.__getattribute__(
- 'vnf_{}_external_network_name'.format(self.case_name))
-
- self.__logger.info("Creating full network ...")
- subnet_settings = SubnetSettings(name=private_subnet_name,
- cidr=private_subnet_cidr,
- dns_nameservers=dns_nameserver)
- network_settings = NetworkSettings(name=private_net_name,
- subnet_settings=[subnet_settings])
- network_creator = OpenStackNetwork(self.snaps_creds, network_settings)
- network_creator.create()
- self.created_object.append(network_creator)
-
- ext_net_name = snaps_utils.get_ext_net_name(self.snaps_creds)
- self.__logger.info("Creating network Router ....")
- router_creator = OpenStackRouter(
- self.snaps_creds,
- RouterSettings(
- name=abot_router,
- external_gateway=ext_net_name,
- internal_subnets=[subnet_settings.name]))
- router_creator.create()
- self.created_object.append(router_creator)
- self.__logger.info("Creating Flavor ....")
- flavor_settings = FlavorSettings(
- name=self.orchestrator['requirements']['flavor']['name'],
- ram=self.orchestrator['requirements']['flavor']['ram_min'],
- disk=10,
- vcpus=1)
- flavor_creator = OpenStackFlavor(self.snaps_creds, flavor_settings)
- self.__logger.info("Juju Bootstrap: Skip creation of flavors")
- flavor_creator.create()
- self.created_object.append(flavor_creator)
- self.__logger.info("Installing Dependency Packages .......")
- source_dir = "/src/epc-requirements/juju_bin_build"
- if os.path.exists(source_dir):
- shutil.rmtree(source_dir)
- os.makedirs(source_dir)
- os.environ['GOPATH'] = str(source_dir)
- os.environ['GOBIN'] = str(source_dir) + "/bin"
- os.environ['PATH'] = ((os.path.expandvars('$GOPATH')) + ":" +
- (os.path.expandvars('$GOBIN')) + ":" +
- (os.path.expandvars('$PATH')))
- os.system('go get -d -v github.com/juju/juju/...')
- os.chdir(source_dir + "/src" + "/github.com" + "/juju" + "/juju")
- os.system('git checkout tags/juju-2.2.5')
- os.system('go get github.com/rogpeppe/godeps')
- os.system('godeps -u dependencies.tsv')
- os.system('go install -v github.com/juju/juju/...')
- self.__logger.info("Creating Cloud for Abot-epc .....")
- os.system('juju add-cloud abot-epc -f {}'.format(self.filename))
- os.system('juju add-credential abot-epc -f {}'.format(self.filename))
- for image_name in self.images.keys():
- self.__logger.info("Generating Metadata for %s", image_name)
- image_id = os_utils.get_image_id(self.glance_client, image_name)
- os.system(
- 'juju metadata generate-image -d ~ -i {} -s {} -r '
- '{} -u {}'.format(
- image_id, image_name,
- os.environ.get("OS_REGION_NAME", self.default_region_name),
- self.public_auth_url))
- net_id = os_utils.get_network_id(self.neutron_client, private_net_name)
- self.__logger.info("Credential information : %s", net_id)
- juju_bootstrap_command = ('juju bootstrap abot-epc abot-controller '
- '--config network={} --metadata-source ~ '
- '--config ssl-hostname-verification=false '
- '--constraints mem=2G --bootstrap-series '
- 'xenial '
- '--config use-floating-ip=true --debug'.
- format(net_id))
- os.system(juju_bootstrap_command)
+ self._publish_image()
+ self.image_alt = self.publish_image_alt()
+ self.flavor_alt = self.create_flavor_alt()
+ self.__logger.info("Starting Juju Bootstrap process...")
+ region_name = self.cloud.region_name if self.cloud.region_name else (
+ 'RegionOne')
+ (_, stdout, stderr) = self.ssh.exec_command(
+ f'timeout {JujuEpc.juju_timeout} '
+ f'/snap/bin/juju bootstrap abot-epc/{region_name} abot-controller '
+ '--agent-version 2.3.9 --metadata-source /home/ubuntu '
+ '--constraints mem=2G --bootstrap-series xenial '
+ f'--config network={self.network.id} '
+ '--config ssl-hostname-verification=false '
+ f'--config external-network={self.ext_net.id} '
+ '--config use-floating-ip=true '
+ '--config use-default-secgroup=true '
+ '--debug')
+ self.__logger.debug("stdout:\n%s", stdout.read().decode("utf-8"))
+ self.__logger.debug("stderr:\n%s", stderr.read().decode("utf-8"))
+ return not stdout.channel.recv_exit_status()
+
+ def check_app(self, name='abot-epc-basic', status='active'):
+ """Check application status."""
+ for i in range(10):
+ (_, stdout, stderr) = self.ssh.exec_command(
+ f'/snap/bin/juju status --format short {name}')
+ output = stdout.read().decode("utf-8")
+ self.__logger.debug("stdout:\n%s", output)
+ self.__logger.debug("stderr:\n%s", stderr.read().decode("utf-8"))
+ if stdout.channel.recv_exit_status():
+ continue
+ ret = re.search(
+ rf'(?=workload:({status})\))', output)
+ if ret:
+ self.__logger.info("%s workload is %s", name, status)
+ break
+ self.__logger.info(
+ "loop %d: %s workload differs from %s", i + 1, name, status)
+ time.sleep(60)
+ else:
+ self.__logger.error("%s workload differs from %s", name, status)
+ return False
return True
def deploy_vnf(self):
"""Deploy ABOT-OAI-EPC."""
self.__logger.info("Upload VNFD")
- descriptor = self.vnf['descriptor']
- self.__logger.info("Get or create flavor for all Abot-EPC")
- flavor_settings = FlavorSettings(
- name=self.vnf['requirements']['flavor']['name'],
- ram=self.vnf['requirements']['flavor']['ram_min'],
- disk=10,
- vcpus=1)
- flavor_creator = OpenStackFlavor(self.snaps_creds, flavor_settings)
- flavor_creator.create()
- self.created_object.append(flavor_creator)
+ scpc = scp.SCPClient(self.ssh.get_transport())
+ scpc.put(
+ '/src/epc-requirements/abot_charm', remote_path='~/',
+ recursive=True)
self.__logger.info("Deploying Abot-epc bundle file ...")
- os.system('juju deploy {}'.format('/' + descriptor.get('file_name')))
- self.__logger.info("Waiting for instances .....")
- status = os.system('juju-wait')
- self.__logger.info("juju wait completed: %s", status)
- self.__logger.info("Deployed Abot-epc on Openstack")
- if status == 0:
- instances = os_utils.get_instances(self.nova_client)
- for items in instances:
- metadata = get_instance_metadata(self.nova_client, items)
- if 'juju-units-deployed' in metadata:
- sec_group = ('juju-' + metadata['juju-controller-uuid'] +
- '-' + metadata['juju-model-uuid'])
- self.sec_group_id = os_utils.get_security_group_id(
- self.neutron_client, sec_group)
- break
- self.__logger.info("Adding Security group rule....")
- os_utils.create_secgroup_rule(self.neutron_client,
- self.sec_group_id, 'ingress', 132)
- self.__logger.info("Copying the feature files to Abot_node ")
- os.system('juju scp -- -r {}/featureFiles abot-'
- 'epc-basic/0:~/'.format(self.case_dir))
- self.__logger.info("Copying the feature files in Abot_node ")
- os.system("juju ssh abot-epc-basic/0 'sudo rsync -azvv "
- "~/featureFiles /etc/rebaca-test-suite"
- "/featureFiles'")
- count = 0
- while count < 10:
- epcstatus = os.system('juju status oai-epc | '
- 'grep {} | grep {} | grep {}'
- .format('EPC', 'is', 'running'))
- if epcstatus == 0:
- break
- else:
- time.sleep(60)
- count = count + 1
- os.system('juju-wait')
- return True
- return False
+ (_, stdout, stderr) = self.ssh.exec_command(
+ 'sudo mkdir -p /src/epc-requirements && '
+ 'sudo mv abot_charm /src/epc-requirements/abot_charm && '
+ '/snap/bin/juju deploy '
+ '/src/epc-requirements/abot_charm/functest-abot-epc-bundle/'
+ 'bundle.yaml')
+ self.__logger.debug("stdout:\n%s", stdout.read().decode("utf-8"))
+ self.__logger.debug("stderr:\n%s", stderr.read().decode("utf-8"))
+ if stdout.channel.recv_exit_status():
+ return not stdout.channel.recv_exit_status()
+ (_, stdout, stderr) = self.ssh.exec_command(
+ 'PATH=/snap/bin/:$PATH '
+ f'timeout {JujuEpc.juju_timeout} juju-wait')
+ self.__logger.debug("stdout:\n%s", stdout.read().decode("utf-8"))
+ self.__logger.debug("stderr:\n%s", stderr.read().decode("utf-8"))
+ if stdout.channel.recv_exit_status():
+ return not stdout.channel.recv_exit_status()
+ self.__logger.info("Checking status of ABot and EPC units ...")
+ (_, stdout, stderr) = self.ssh.exec_command('/snap/bin/juju status')
+ output = stdout.read().decode("utf-8")
+ self.__logger.debug("stdout:\n%s", output)
+ self.__logger.debug("stderr:\n%s", stderr.read().decode("utf-8"))
+ if stdout.channel.recv_exit_status():
+ return not stdout.channel.recv_exit_status()
+ for app in ['abot-epc-basic', 'oai-epc', 'oai-hss']:
+ if not self.check_app(app):
+ return False
+ scpc = scp.SCPClient(self.ssh.get_transport())
+ scpc.put(
+ f'{self.case_dir}/featureFiles', remote_path='~/',
+ recursive=True)
+ (_, stdout, stderr) = self.ssh.exec_command(
+ f'timeout {JujuEpc.juju_timeout} /snap/bin/juju scp -- -r -v '
+ '~/featureFiles abot-epc-basic/0:/etc/rebaca-test-suite/')
+ output = stdout.read().decode("utf-8")
+ self.__logger.debug("stdout:\n%s", output)
+ self.__logger.debug("stderr:\n%s", stderr.read().decode("utf-8"))
+ return not stdout.channel.recv_exit_status()
def test_vnf(self):
"""Run test on ABoT."""
start_time = time.time()
- self.__logger.info("Running VNF Test cases....")
- os.system('juju run-action abot-epc-basic/0 run '
- 'tagnames={}'.format(self.details['test_vnf']['tag_name']))
- os.system('juju-wait')
+ (_, stdout, stderr) = self.ssh.exec_command(
+ "/snap/bin/juju run-action abot-epc-basic/0 "
+ f"run tagnames={self.details['test_vnf']['tag_name']}")
+ self.__logger.debug("stdout:\n%s", stdout.read().decode("utf-8"))
+ self.__logger.debug("stderr:\n%s", stderr.read().decode("utf-8"))
+ if stdout.channel.recv_exit_status():
+ return not stdout.channel.recv_exit_status()
+ (_, stdout, stderr) = self.ssh.exec_command(
+ 'PATH=/snap/bin/:$PATH '
+ f'timeout {JujuEpc.juju_timeout} juju-wait')
+ self.__logger.debug("stdout:\n%s", stdout.read().decode("utf-8"))
+ self.__logger.debug("stderr:\n%s", stderr.read().decode("utf-8"))
+ if stdout.channel.recv_exit_status():
+ return not stdout.channel.recv_exit_status()
duration = time.time() - start_time
self.__logger.info("Getting results from Abot node....")
- os.system('juju scp abot-epc-basic/0:/var/lib/abot-'
- 'epc-basic/artifacts/TestResults.json {}/.'
- .format(self.case_dir))
+ (_, stdout, stderr) = self.ssh.exec_command(
+ f'timeout {JujuEpc.juju_timeout} /snap/bin/juju scp '
+ '-- -v abot-epc-basic/0:'
+ '/var/lib/abot-epc-basic/artifacts/TestResults.json .')
+ self.__logger.debug("stdout:\n%s", stdout.read().decode("utf-8"))
+ self.__logger.debug("stderr:\n%s", stderr.read().decode("utf-8"))
+ if stdout.channel.recv_exit_status():
+ return not stdout.channel.recv_exit_status()
+ scpc = scp.SCPClient(self.ssh.get_transport())
+ scpc.get('TestResults.json', self.res_dir)
self.__logger.info("Parsing the Test results...")
- res = (process_abot_test_result('{}/TestResults.'
- 'json'.format(self.case_dir)))
+ res = process_abot_test_result(f'{self.res_dir}/TestResults.json')
short_result = sig_test_format(res)
self.__logger.info(short_result)
- self.details['test_vnf'].update(status='PASS',
- result=short_result,
- full_result=res,
- duration=duration)
-
- self.__logger.info("Test VNF result: Passed: %d, Failed:"
- "%d, Skipped: %d", short_result['passed'],
- short_result['failures'], short_result['skipped'])
+ self.details['test_vnf'].update(
+ status='PASS', result=short_result, full_result=res,
+ duration=duration)
+ self.__logger.info(
+ "Test VNF result: Passed: %d, Failed:%d, Skipped: %d",
+ short_result['passed'],
+ short_result['failures'], short_result['skipped'])
return True
- def clean(self):
- """Clean created objects/functions."""
+ def execute(self):
+ """Prepare testcase (Additional pre-configuration steps)."""
+ assert self.public_auth_url
+ self.__logger.info("Additional pre-configuration steps")
+ try:
+ os.makedirs(self.res_dir)
+ except OSError as ex:
+ if ex.errno != errno.EEXIST:
+ self.__logger.exception("Cannot create %s", self.res_dir)
+ raise Exception from ex
+ self.__logger.info("ENV:\n%s", env.string())
try:
- if not self.orchestrator['requirements']['preserve_setup']:
- self.__logger.info("Removing deployment files...")
- testresult = os.path.join(self.case_dir, 'TestResults.json')
- if os.path.exists(testresult):
- os.remove(testresult)
- self.__logger.info("Removing %s file ", self.filename)
- if os.path.exists(self.filename):
- os.remove(self.filename)
- self.__logger.info("Destroying Orchestrator...")
- os.system('juju destroy-controller -y abot-controller '
- '--destroy-all-models')
+ assert self._install_juju()
+ assert self._install_juju_wait()
+ assert self._register_cloud()
+ assert self._register_credentials()
+ assert self.deploy_orchestrator()
+ assert self.deploy_vnf()
+ assert self.test_vnf()
except Exception: # pylint: disable=broad-except
- self.__logger.warn("Some issue during the undeployment ..")
- self.__logger.warn("Tenant clean continue ..")
-
- if not self.orchestrator['requirements']['preserve_setup']:
- self.__logger.info('Remove the Abot_epc OS object ..')
- for creator in reversed(self.created_object):
- try:
- creator.clean()
- except Exception as exc: # pylint: disable=broad-except
- self.__logger.error('Unexpected error cleaning - %s', exc)
-
- self.__logger.info("Releasing all the floating IPs")
- floating_ips = os_utils.get_floating_ips(self.neutron_client)
- tenant_id = os_utils.get_tenant_id(self.keystone_client,
- self.tenant_name)
- self.__logger.info("TENANT ID : %s", tenant_id)
- for item in floating_ips:
- if item['tenant_id'] == tenant_id:
- os_utils.delete_floating_ip(self.neutron_client,
- item['id'])
- self.__logger.info("Cleaning Projects and Users")
- for creator in reversed(self.created_object):
- try:
- creator.clean()
- except Exception as exc: # pylint: disable=broad-except
- self.__logger.error('Unexpected error cleaning - %s', exc)
- return True
-
+ self.__logger.exception("juju_epc failed")
+ return 1
+ return 0
-# ----------------------------------------------------------
-#
-# YAML UTILS
-#
-# -----------------------------------------------------------
-def get_config(parameter, file_path):
- """
- Returns the value of a given parameter in file.yaml
- parameter must be given in string format with dots
- Example: general.openstack.image_name
- """
- with open(file_path) as config_file:
- file_yaml = yaml.safe_load(config_file)
- config_file.close()
- value = file_yaml
- for element in parameter.split("."):
- value = value.get(element)
- if value is None:
- raise ValueError("The parameter %s is not defined in"
- " reporting.yaml" % parameter)
- return value
+ def clean(self):
+ """Clean created objects/functions."""
+ (_, stdout, stderr) = self.ssh.exec_command(
+ '/snap/bin/juju debug-log --replay --no-tail')
+ self.__logger.debug("stdout:\n%s", stdout.read().decode("utf-8"))
+ self.__logger.debug("stderr:\n%s", stderr.read().decode("utf-8"))
+ (_, stdout, stderr) = self.ssh.exec_command(
+ '/snap/bin/juju destroy-controller -y abot-controller '
+ '--destroy-all-models')
+ self.__logger.debug("stdout:\n%s", stdout.read().decode("utf-8"))
+ self.__logger.debug("stderr:\n%s", stderr.read().decode("utf-8"))
+ for fip in self.cloud.list_floating_ips():
+ self.cloud.delete_floating_ip(fip.id)
+ if self.image_alt:
+ self.cloud.delete_image(self.image_alt)
+ if self.flavor_alt:
+ self.orig_cloud.delete_flavor(self.flavor_alt.id)
+ super().clean()
def sig_test_format(sig_test):
@@ -422,7 +429,7 @@ def sig_test_format(sig_test):
def process_abot_test_result(file_path):
""" Process ABoT Result """
- with open(file_path) as test_result:
+ with open(file_path, encoding='utf-8') as test_result:
data = json.load(test_result)
res = []
for tests in data:
@@ -432,7 +439,7 @@ def process_abot_test_result(file_path):
for steps in flatten_steps:
steps['result'] = steps['step_status']
res.append(steps)
- except:
+ except Exception: # pylint: disable=broad-except
logging.error("Could not post data to ElasticSearch host")
raise
return res
@@ -474,49 +481,3 @@ def update_data(obj):
raise
return obj
-
-
-def get_instance_metadata(nova_client, instance):
- """ Get instance Metadata - Instance ID """
- try:
- instance = nova_client.servers.get(instance.id)
- return instance.metadata
- except Exception as exc: # pylint: disable=broad-except
- logging.error("Error [get_instance_status(nova_client)]: %s", exc)
- return None
-
-
-CLOUD_TEMPLATE = """clouds:
- abot-epc:
- type: openstack
- auth-types: [userpass]
- endpoint: {url}
- regions:
- {region}:
- endpoint: {url}
-credentials:
- abot-epc:
- abot-epc:
- auth-type: userpass
- password: {pass}
- tenant-name: {tenant_n}
- username: {user_n}"""
-
-
-def write_config(fname, template, **kwargs):
- """ Generate yaml from template for addinh cloud in juju """
- with open(fname, 'w') as yfile:
- yfile.write(template.format(**kwargs))
-
-
-def append_config(file_name, p_domain, u_domain):
- """ Append values into a yaml file """
- with open(file_name) as yfile:
- doc = yaml.load(yfile)
- doc['credentials']['abot-epc']['abot-epc']['project-domain-name'] = (
- p_domain)
- doc['credentials']['abot-epc']['abot-epc']['user-domain-name'] = (
- u_domain)
-
- with open(file_name, 'w') as yfile:
- yaml.safe_dump(doc, yfile, default_flow_style=False)
diff --git a/functest/opnfv_tests/vnf/ims/clearwater.py b/functest/opnfv_tests/vnf/ims/clearwater.py
new file mode 100644
index 000000000..4c143fd70
--- /dev/null
+++ b/functest/opnfv_tests/vnf/ims/clearwater.py
@@ -0,0 +1,190 @@
+#!/usr/bin/env python
+#
+# Copyright (c) 2017 All rights reserved
+# This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+
+"""Ease testing any Clearwater deployment"""
+
+import logging
+import os
+import re
+import time
+
+import pkg_resources
+import requests
+
+from functest.utils import config
+import functest.utils.functest_utils as ft_utils
+
+__author__ = ("Valentin Boucher <valentin.boucher@orange.com>, "
+ "Helen Yao <helanyao@gmail.com>")
+
+
+class ClearwaterTesting():
+ """vIMS clearwater base usable by several orchestrators"""
+
+ def __init__(self, case_name, bono_ip, ellis_ip):
+ self.logger = logging.getLogger(__name__)
+ self.case_dir = pkg_resources.resource_filename(
+ 'functest', 'opnfv_tests/vnf/ims')
+ self.data_dir = getattr(config.CONF, 'dir_ims_data')
+ self.result_dir = os.path.join(
+ getattr(config.CONF, 'dir_results'), case_name)
+ self.test_dir = getattr(config.CONF, 'dir_repo_vims_test')
+
+ if not os.path.exists(self.data_dir):
+ os.makedirs(self.data_dir)
+ if not os.path.exists(self.result_dir):
+ os.makedirs(self.result_dir)
+
+ self.ellis_ip = ellis_ip
+ self.bono_ip = bono_ip
+
+ def availability_check(self, signup_code='secret', two_numbers=False):
+ """Create one or two numbers"""
+ assert self.ellis_ip
+ output_dict = {}
+ self.logger.debug('Ellis IP: %s', self.ellis_ip)
+ output_dict['ellis_ip'] = self.ellis_ip
+ account_url = f'http://{self.ellis_ip}/accounts'
+ params = {"password": "functest",
+ "full_name": "opnfv functest user",
+ "email": "functest@opnfv.org",
+ "signup_code": signup_code}
+ output_dict['login'] = params
+
+ number_res = self._create_ellis_account(account_url, params)
+ output_dict['number'] = number_res
+
+ session_url = f'http://{self.ellis_ip}/session'
+ session_data = {
+ 'username': params['email'],
+ 'password': params['password'],
+ 'email': params['email']
+ }
+ cookies = self._get_ellis_session_cookies(session_url, session_data)
+
+ number_url = (
+ f"http://{self.ellis_ip}/accounts/{params['email']}/numbers")
+ self.logger.debug('Create 1st calling number on Ellis')
+ number_res = self._create_ellis_number(number_url, cookies)
+
+ if two_numbers:
+ self.logger.debug('Create 2nd calling number on Ellis')
+ number_res = self._create_ellis_number(number_url, cookies)
+ output_dict['number2'] = number_res
+
+ return output_dict
+
+ def _create_ellis_account(self, account_url, params):
+ i = 80
+ for iloop in range(i):
+ try:
+ req = requests.post(account_url, data=params)
+ if req.status_code == 201:
+ account_res = req.json()
+ self.logger.info(
+ 'Account %s is created on Ellis\n%s',
+ params.get('full_name'), account_res)
+ return account_res
+ raise Exception("Cannot create ellis account")
+ except Exception: # pylint: disable=broad-except
+ self.logger.info(
+ "try %s: cannot create ellis account", iloop + 1)
+ time.sleep(30)
+ raise Exception(
+ f"Unable to create an account {params.get('full_name')}")
+
+ def _get_ellis_session_cookies(self, session_url, params):
+ i = 15
+ for iloop in range(i):
+ try:
+ req = requests.post(session_url, data=params)
+ if req.status_code == 201:
+ cookies = req.cookies
+ self.logger.debug('cookies: %s', cookies)
+ return cookies
+ raise Exception('Failed to get cookies for Ellis')
+ except Exception: # pylint: disable=broad-except
+ self.logger.info(
+ "try %s: cannot get cookies for Ellis", iloop + 1)
+ time.sleep(10)
+ raise Exception('Failed to get cookies for Ellis')
+
+ def _create_ellis_number(self, number_url, cookies):
+ i = 30
+ for iloop in range(i):
+ try:
+ req = requests.post(number_url, cookies=cookies)
+ if req.status_code == 200:
+ number_res = req.json()
+ self.logger.info(
+ 'Calling number is created: %s', number_res)
+ return number_res
+ if req and req.json():
+ reason = req.json()['reason']
+ else:
+ reason = req
+ self.logger.info("cannot create a number: %s", reason)
+ raise Exception('Failed to create a number')
+ except Exception: # pylint: disable=broad-except
+ self.logger.info(
+ "try %s: cannot create a number", iloop + 1)
+ time.sleep(25)
+ raise Exception('Failed to create a number')
+
+ def run_clearwater_live_test(self, public_domain, signup_code='secret'):
+ """Run the Clearwater live tests
+
+ It first runs dnsmasq to reach clearwater services by FQDN and then the
+ Clearwater live tests. All results are saved in ims_test_output.txt.
+
+ Returns:
+ - a dict containing the overall results
+ - None on error
+ """
+ # pylint: disable=too-many-locals,too-many-arguments
+ self.logger.info('Run Clearwater live test')
+ script = (f'cd {self.test_dir};'
+ f'rake test[{public_domain}] SIGNUP_CODE={signup_code}')
+ if self.bono_ip and self.ellis_ip:
+ subscript = f' PROXY={self.bono_ip} ELLIS={self.ellis_ip}'
+ script = f'{script}{subscript}'
+ script = f'{script} --trace'
+ cmd = f"/bin/sh -c '{script}'"
+ self.logger.debug('Live test cmd: %s', cmd)
+ output_file = os.path.join(self.result_dir, "ims_test_output.txt")
+ ft_utils.execute_command(cmd,
+ error_msg='Clearwater live test failed',
+ output_file=output_file)
+
+ with open(output_file, 'r', encoding='utf-8') as ofile:
+ result = ofile.read()
+
+ if result != "":
+ self.logger.debug(result)
+
+ vims_test_result = {}
+ try:
+ grp = re.search(
+ r'^(\d+) failures out of (\d+) tests run.*\n'
+ r'(\d+) tests skipped$', result, re.MULTILINE | re.DOTALL)
+ assert grp
+ vims_test_result["failures"] = int(grp.group(1))
+ vims_test_result["total"] = int(grp.group(2))
+ vims_test_result["skipped"] = int(grp.group(3))
+ vims_test_result['passed'] = (
+ int(grp.group(2)) - int(grp.group(3)) - int(grp.group(1)))
+ if vims_test_result['total'] - vims_test_result['skipped'] > 0:
+ vnf_test_rate = vims_test_result['passed'] / (
+ vims_test_result['total'] - vims_test_result['skipped'])
+ else:
+ vnf_test_rate = 0
+ except Exception: # pylint: disable=broad-except
+ self.logger.exception("Cannot parse live tests results")
+ return None, 0
+ return vims_test_result, vnf_test_rate
diff --git a/functest/opnfv_tests/vnf/ims/clearwater_ims_base.py b/functest/opnfv_tests/vnf/ims/clearwater_ims_base.py
deleted file mode 100644
index 8851f7a48..000000000
--- a/functest/opnfv_tests/vnf/ims/clearwater_ims_base.py
+++ /dev/null
@@ -1,165 +0,0 @@
-#!/usr/bin/env python
-#
-# Copyright (c) 2017 All rights reserved
-# This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-import json
-import logging
-import os
-import pkg_resources
-import shlex
-import shutil
-import subprocess
-import time
-
-import requests
-
-import functest.core.vnf as vnf
-from functest.utils.constants import CONST
-import functest.utils.functest_utils as ft_utils
-
-__author__ = ("Valentin Boucher <valentin.boucher@orange.com>, "
- "Helen Yao <helanyao@gmail.com>")
-
-
-class ClearwaterOnBoardingBase(vnf.VnfOnBoarding):
- """ vIMS clearwater base usable by several orchestrators"""
-
- def __init__(self, **kwargs):
- self.logger = logging.getLogger(__name__)
- super(ClearwaterOnBoardingBase, self).__init__(**kwargs)
- self.case_dir = pkg_resources.resource_filename(
- 'functest', 'opnfv_tests/vnf/ims')
- self.data_dir = CONST.__getattribute__('dir_ims_data')
- self.result_dir = os.path.join(CONST.__getattribute__('dir_results'),
- self.case_name)
- self.test_dir = CONST.__getattribute__('dir_repo_vims_test')
-
- if not os.path.exists(self.data_dir):
- os.makedirs(self.data_dir)
- if not os.path.exists(self.result_dir):
- os.makedirs(self.result_dir)
-
- def config_ellis(self, ellis_ip, signup_code='secret', two_numbers=False):
- output_dict = {}
- self.logger.debug('Configure Ellis: %s', ellis_ip)
- output_dict['ellis_ip'] = ellis_ip
- account_url = 'http://{0}/accounts'.format(ellis_ip)
- params = {"password": "functest",
- "full_name": "opnfv functest user",
- "email": "functest@opnfv.org",
- "signup_code": signup_code}
- rq = requests.post(account_url, data=params)
- output_dict['login'] = params
- if rq.status_code != 201 and rq.status_code != 409:
- raise Exception("Unable to create an account for number provision")
- self.logger.debug('Account is created on Ellis: %s', params)
-
- session_url = 'http://{0}/session'.format(ellis_ip)
- session_data = {
- 'username': params['email'],
- 'password': params['password'],
- 'email': params['email']
- }
- rq = requests.post(session_url, data=session_data)
- if rq.status_code != 201:
- raise Exception('Failed to get cookie for Ellis')
- cookies = rq.cookies
- self.logger.debug('Cookies: %s', cookies)
-
- number_url = 'http://{0}/accounts/{1}/numbers'.format(
- ellis_ip,
- params['email'])
- self.logger.debug('Create 1st calling number on Ellis')
- i = 30
- while rq.status_code != 200 and i > 0:
- try:
- number_res = self.create_ellis_number(number_url, cookies)
- break
- except:
- if i == 1:
- raise Exception("Unable to create a number")
- self.logger.warn("Unable to create a number. Retry ..")
- time.sleep(25)
- i = i - 1
- output_dict['number'] = number_res
-
- if two_numbers:
- self.logger.debug('Create 2nd calling number on Ellis')
- number_res = self.create_ellis_number(number_url, cookies)
- output_dict['number2'] = number_res
-
- return output_dict
-
- def create_ellis_number(self, number_url, cookies):
- rq = requests.post(number_url, cookies=cookies)
-
- if rq.status_code != 200:
- if rq and rq.json():
- reason = rq.json()['reason']
- else:
- reason = rq
- raise Exception("Unable to create a number: %s" % reason)
- number_res = rq.json()
- self.logger.info('Calling number is created: %s', number_res)
- return number_res
-
- def run_clearwater_live_test(self, dns_ip, public_domain,
- bono_ip=None, ellis_ip=None,
- signup_code='secret'):
- self.logger.info('Run Clearwater live test')
- dns_file = '/etc/resolv.conf'
- dns_file_bak = '/etc/resolv.conf.bak'
- self.logger.debug('Backup %s -> %s', dns_file, dns_file_bak)
- shutil.copy(dns_file, dns_file_bak)
- cmd = ("dnsmasq -d -u root --server=/clearwater.opnfv/{0} "
- "-r /etc/resolv.conf.bak".format(dns_ip))
- dnsmasq_process = subprocess.Popen(shlex.split(cmd))
- script = ('echo -e "nameserver {0}" > {1};'
- 'cd {2};'
- 'rake test[{3}] SIGNUP_CODE={4}'
- .format('127.0.0.1',
- dns_file,
- self.test_dir,
- public_domain,
- signup_code))
- if bono_ip and ellis_ip:
- subscript = ' PROXY={0} ELLIS={1}'.format(bono_ip, ellis_ip)
- script = '{0}{1}'.format(script, subscript)
- script = ('{0}{1}'.format(script, ' --trace'))
- cmd = "/bin/bash -c '{0}'".format(script)
- self.logger.debug('Live test cmd: %s', cmd)
- output_file = os.path.join(self.result_dir, "ims_test_output.txt")
- ft_utils.execute_command(cmd,
- error_msg='Clearwater live test failed',
- output_file=output_file)
- dnsmasq_process.kill()
- with open(dns_file_bak, 'r') as bak_file:
- result = bak_file.read()
- with open(dns_file, 'w') as f:
- f.write(result)
-
- f = open(output_file, 'r')
- result = f.read()
- if result != "":
- self.logger.debug(result)
-
- vims_test_result = ""
- tempFile = os.path.join(self.test_dir, "temp.json")
- try:
- self.logger.debug("Trying to load test results")
- with open(tempFile) as f:
- vims_test_result = json.load(f)
- f.close()
- except Exception:
- self.logger.error("Unable to retrieve test results")
-
- try:
- os.remove(tempFile)
- except Exception:
- self.logger.error("Deleting file failed")
-
- return vims_test_result
diff --git a/functest/opnfv_tests/vnf/ims/cloudify_ims.py b/functest/opnfv_tests/vnf/ims/cloudify_ims.py
index b8a815c28..b93af7d6d 100644
--- a/functest/opnfv_tests/vnf/ims/cloudify_ims.py
+++ b/functest/opnfv_tests/vnf/ims/cloudify_ims.py
@@ -9,525 +9,254 @@
"""CloudifyIms testcase implementation."""
+from __future__ import division
+
import logging
import os
import time
-from cloudify_rest_client import CloudifyClient
-from cloudify_rest_client.executions import Execution
-from scp import SCPClient
-import yaml
-
-from functest.energy import energy
-from functest.opnfv_tests.openstack.snaps import snaps_utils
-import functest.opnfv_tests.vnf.ims.clearwater_ims_base as clearwater_ims_base
-from functest.utils.constants import CONST
-
-from snaps.config.flavor import FlavorConfig
-from snaps.config.image import ImageConfig
-from snaps.config.keypair import KeypairConfig
-from snaps.config.network import NetworkConfig, PortConfig, SubnetConfig
-from snaps.config.router import RouterConfig
-from snaps.config.security_group import (
- Direction, Protocol, SecurityGroupConfig, SecurityGroupRuleConfig)
-from snaps.config.vm_inst import FloatingIpConfig, VmInstanceConfig
-
-from snaps.openstack.create_flavor import OpenStackFlavor
-from snaps.openstack.create_image import OpenStackImage
-from snaps.openstack.create_instance import OpenStackVmInstance
-from snaps.openstack.create_keypairs import OpenStackKeypair
-from snaps.openstack.create_network import OpenStackNetwork
-from snaps.openstack.create_router import OpenStackRouter
-from snaps.openstack.create_security_group import OpenStackSecurityGroup
-from snaps.openstack.utils import keystone_utils
+import pkg_resources
+import six
+from functest.core import cloudify
+from functest.opnfv_tests.vnf.ims import clearwater
+from functest.utils import config
+from functest.utils import env
+from functest.utils import functest_utils
__author__ = "Valentin Boucher <valentin.boucher@orange.com>"
-class CloudifyIms(clearwater_ims_base.ClearwaterOnBoardingBase):
+class CloudifyIms(cloudify.Cloudify):
"""Clearwater vIMS deployed with Cloudify Orchestrator Case."""
__logger = logging.getLogger(__name__)
+ filename_alt = ('/home/opnfv/functest/images/'
+ 'ubuntu-14.04-server-cloudimg-amd64-disk1.img')
+
+ flavor_alt_ram = 1024
+ flavor_alt_vcpus = 1
+ flavor_alt_disk = 3
+
+ quota_security_group = 20
+ quota_security_group_rule = 100
+ quota_port = 50
+
+ cop_yaml = ("https://github.com/cloudify-cosmo/cloudify-openstack-plugin/"
+ "releases/download/2.14.7/plugin.yaml")
+ cop_wgn = ("https://github.com/cloudify-cosmo/cloudify-openstack-plugin/"
+ "releases/download/2.14.7/cloudify_openstack_plugin-2.14.7-py27"
+ "-none-linux_x86_64-centos-Core.wgn")
+
def __init__(self, **kwargs):
"""Initialize CloudifyIms testcase object."""
if "case_name" not in kwargs:
kwargs["case_name"] = "cloudify_ims"
- super(CloudifyIms, self).__init__(**kwargs)
+ super().__init__(**kwargs)
# Retrieve the configuration
try:
- self.config = CONST.__getattribute__(
- 'vnf_{}_config'.format(self.case_name))
- except Exception:
- raise Exception("VNF config file not found")
-
- self.snaps_creds = ''
+ self.config = getattr(
+ config.CONF, f'vnf_{self.case_name}_config')
+ except Exception as exc:
+ raise Exception("VNF config file not found") from exc
+ self.case_dir = pkg_resources.resource_filename(
+ 'functest', 'opnfv_tests/vnf/ims')
config_file = os.path.join(self.case_dir, self.config)
- self.orchestrator = dict(
- requirements=get_config("orchestrator.requirements", config_file),
- )
+
self.details['orchestrator'] = dict(
- name=get_config("orchestrator.name", config_file),
- version=get_config("orchestrator.version", config_file),
+ name=functest_utils.get_parameter_from_yaml(
+ "orchestrator.name", config_file),
+ version=functest_utils.get_parameter_from_yaml(
+ "orchestrator.version", config_file),
status='ERROR',
result=''
)
- self.__logger.debug("Orchestrator configuration %s", self.orchestrator)
+
self.vnf = dict(
- descriptor=get_config("vnf.descriptor", config_file),
- inputs=get_config("vnf.inputs", config_file),
- requirements=get_config("vnf.requirements", config_file)
+ descriptor=functest_utils.get_parameter_from_yaml(
+ "vnf.descriptor", config_file),
+ inputs=functest_utils.get_parameter_from_yaml(
+ "vnf.inputs", config_file)
)
self.details['vnf'] = dict(
descriptor_version=self.vnf['descriptor']['version'],
- name=get_config("vnf.name", config_file),
- version=get_config("vnf.version", config_file),
+ name=functest_utils.get_parameter_from_yaml(
+ "vnf.name", config_file),
+ version=functest_utils.get_parameter_from_yaml(
+ "vnf.version", config_file),
)
self.__logger.debug("VNF configuration: %s", self.vnf)
self.details['test_vnf'] = dict(
- name=get_config("vnf_test_suite.name", config_file),
- version=get_config("vnf_test_suite.version", config_file)
+ name=functest_utils.get_parameter_from_yaml(
+ "vnf_test_suite.name", config_file),
+ version=functest_utils.get_parameter_from_yaml(
+ "vnf_test_suite.version", config_file)
)
- self.images = get_config("tenant_images", config_file)
- self.__logger.info("Images needed for vIMS: %s", self.images)
-
- def prepare(self):
- """Prepare testscase (Additional pre-configuration steps)."""
- super(CloudifyIms, self).prepare()
-
- self.__logger.info("Additional pre-configuration steps")
-
- compute_quotas = self.os_project.get_compute_quotas()
- network_quotas = self.os_project.get_network_quotas()
-
- for key, value in (
- self.vnf['requirements']['compute_quotas'].items()):
- setattr(compute_quotas, key, value)
-
- for key, value in (
- self.vnf['requirements']['network_quotas'].items()):
- setattr(network_quotas, key, value)
-
- compute_quotas = self.os_project.update_compute_quotas(compute_quotas)
- network_quotas = self.os_project.update_network_quotas(network_quotas)
-
- # needs some images
- self.__logger.info("Upload some OS images if it doesn't exist")
- for image_name, image_file in self.images.iteritems():
- self.__logger.info("image: %s, file: %s", image_name, image_file)
- if image_file and image_name:
- image_creator = OpenStackImage(
- self.snaps_creds,
- ImageConfig(
- name=image_name, image_user='cloud',
- img_format='qcow2', image_file=image_file))
- image_creator.create()
- # self.created_object.append(image_creator)
-
- def deploy_orchestrator(self):
+
+ self.image_alt = None
+ self.flavor_alt = None
+ self.clearwater = None
+
+ def check_requirements(self):
+ if env.get('NEW_USER_ROLE').lower() == "admin":
+ self.__logger.warning(
+ "Defining NEW_USER_ROLE=admin will easily break the testcase "
+ "because Cloudify doesn't manage tenancy (e.g. subnet "
+ "overlapping)")
+
+ def execute(self):
"""
Deploy Cloudify Manager.
network, security group, fip, VM creation
"""
- # network creation
-
+ assert super().execute() == 0
start_time = time.time()
- self.__logger.info("Creating keypair ...")
- kp_file = os.path.join(self.data_dir, "cloudify_ims.pem")
- keypair_settings = KeypairConfig(name='cloudify_ims_kp',
- private_filepath=kp_file)
- keypair_creator = OpenStackKeypair(self.snaps_creds, keypair_settings)
- keypair_creator.create()
- self.created_object.append(keypair_creator)
-
- self.__logger.info("Creating full network ...")
- subnet_settings = SubnetConfig(name='cloudify_ims_subnet',
- cidr='10.67.79.0/24')
- network_settings = NetworkConfig(name='cloudify_ims_network',
- subnet_settings=[subnet_settings])
- network_creator = OpenStackNetwork(self.snaps_creds, network_settings)
- network_creator.create()
- self.created_object.append(network_creator)
- ext_net_name = snaps_utils.get_ext_net_name(self.snaps_creds)
- router_creator = OpenStackRouter(
- self.snaps_creds,
- RouterConfig(
- name='cloudify_ims_router',
- external_gateway=ext_net_name,
- internal_subnets=[subnet_settings.name]))
- router_creator.create()
- self.created_object.append(router_creator)
-
- # security group creation
- self.__logger.info("Creating security group for cloudify manager vm")
- sg_rules = list()
- sg_rules.append(
- SecurityGroupRuleConfig(
- sec_grp_name="sg-cloudify-manager",
- direction=Direction.ingress, protocol=Protocol.tcp,
- port_range_min=1, port_range_max=65535))
- sg_rules.append(
- SecurityGroupRuleConfig(
- sec_grp_name="sg-cloudify-manager",
- direction=Direction.ingress, protocol=Protocol.udp,
- port_range_min=1, port_range_max=65535))
-
- securit_group_creator = OpenStackSecurityGroup(
- self.snaps_creds,
- SecurityGroupConfig(
- name="sg-cloudify-manager",
- rule_settings=sg_rules))
-
- securit_group_creator.create()
- self.created_object.append(securit_group_creator)
-
- # orchestrator VM flavor
- self.__logger.info("Get or create flavor for cloudify manager vm ...")
-
- flavor_settings = FlavorConfig(
- name=self.orchestrator['requirements']['flavor']['name'],
- ram=self.orchestrator['requirements']['flavor']['ram_min'],
- disk=50,
- vcpus=2)
- flavor_creator = OpenStackFlavor(self.snaps_creds, flavor_settings)
- flavor_creator.create()
- self.created_object.append(flavor_creator)
- image_settings = ImageConfig(
- name=self.orchestrator['requirements']['os_image'],
- image_user='centos',
- exists=True)
-
- port_settings = PortConfig(name='cloudify_manager_port',
- network_name=network_settings.name)
-
- manager_settings = VmInstanceConfig(
- name='cloudify_manager',
- flavor=flavor_settings.name,
- port_settings=[port_settings],
- security_group_names=[securit_group_creator.sec_grp_settings.name],
- floating_ip_settings=[FloatingIpConfig(
- name='cloudify_manager_fip',
- port_name=port_settings.name,
- router_name=router_creator.router_settings.name)])
-
- manager_creator = OpenStackVmInstance(self.snaps_creds,
- manager_settings,
- image_settings,
- keypair_settings)
-
- self.__logger.info("Creating cloudify manager VM")
- manager_creator.create()
- self.created_object.append(manager_creator)
-
- public_auth_url = keystone_utils.get_endpoint(
- self.snaps_creds, 'identity')
-
- self.__logger.info("Set creds for cloudify manager")
- cfy_creds = dict(keystone_username=self.tenant_name,
- keystone_password=self.tenant_name,
- keystone_tenant_name=self.tenant_name,
- keystone_url=public_auth_url)
-
- cfy_client = CloudifyClient(host=manager_creator.get_floating_ip().ip,
- username='admin',
- password='admin',
- tenant='default_tenant')
-
- self.orchestrator['object'] = cfy_client
-
- self.__logger.info("Attemps running status of the Manager")
- cfy_status = None
- retry = 10
- while str(cfy_status) != 'running' and retry:
+ self.orig_cloud.set_network_quotas(
+ self.project.project.name,
+ security_group=self.quota_security_group,
+ security_group_rule=self.quota_security_group_rule,
+ port=self.quota_port)
+ self.__logger.info("Put OpenStack creds in manager")
+ cfy_creds = dict(
+ keystone_username=self.project.user.name,
+ keystone_password=self.project.password,
+ keystone_tenant_name=self.project.project.name,
+ keystone_url=self.get_public_auth_url(self.orig_cloud),
+ region=os.environ.get('OS_REGION_NAME', 'RegionOne'),
+ user_domain_name=os.environ.get(
+ 'OS_USER_DOMAIN_NAME', 'Default'),
+ project_domain_name=os.environ.get(
+ 'OS_PROJECT_DOMAIN_NAME', 'Default'))
+ self.__logger.info("Set creds for cloudify manager %s", cfy_creds)
+
+ for loop in range(10):
try:
- cfy_status = cfy_client.manager.get_status()['status']
- self.__logger.debug("The current manager status is %s",
- cfy_status)
+ secrets_list = self.cfy_client.secrets.list()
+ for k, val in six.iteritems(cfy_creds):
+ if not any(d.get('key', None) == k for d in secrets_list):
+ self.cfy_client.secrets.create(k, val)
+ else:
+ self.cfy_client.secrets.update(k, val)
+ break
except Exception: # pylint: disable=broad-except
- self.__logger.warning("Cloudify Manager isn't " +
- "up and running. Retrying ...")
- retry = retry - 1
- time.sleep(30)
-
- if str(cfy_status) == 'running':
- self.__logger.info("Cloudify Manager is up and running")
+ self.__logger.info(
+ "try %s: Cannot create secrets", loop + 1)
+ time.sleep(30)
else:
- raise Exception("Cloudify Manager isn't up and running")
-
- self.__logger.info("Put OpenStack creds in manager")
- secrets_list = cfy_client.secrets.list()
- for k, val in cfy_creds.iteritems():
- if not any(d.get('key', None) == k for d in secrets_list):
- cfy_client.secrets.create(k, val)
- else:
- cfy_client.secrets.update(k, val)
+ self.__logger.error("Cannot create secrets")
+ return 1
duration = time.time() - start_time
- self.__logger.info("Put private keypair in manager")
- if manager_creator.vm_ssh_active(block=True):
- ssh = manager_creator.ssh_client()
- scp = SCPClient(ssh.get_transport(), socket_timeout=15.0)
- scp.put(kp_file, '~/')
- cmd = "sudo cp ~/cloudify_ims.pem /etc/cloudify/"
- run_blocking_ssh_command(ssh, cmd)
- cmd = "sudo chmod 444 /etc/cloudify/cloudify_ims.pem"
- run_blocking_ssh_command(ssh, cmd)
- cmd = "sudo yum install -y gcc python-devel"
- run_blocking_ssh_command(ssh, cmd, "Unable to install packages \
- on manager")
+ self.put_private_key()
+ self.upload_cfy_plugins(self.cop_yaml, self.cop_wgn)
self.details['orchestrator'].update(status='PASS', duration=duration)
self.vnf['inputs'].update(dict(
- external_network_name=ext_net_name,
- network_name=network_settings.name
+ external_network_name=self.ext_net.name,
+ network_name=self.network.name,
+ key_pair_name=self.keypair.name
))
+ if self.deploy_vnf() and self.test_vnf():
+ self.result = 100
+ return 0
self.result = 1/3 * 100
- return True
+ return 1
def deploy_vnf(self):
"""Deploy Clearwater IMS."""
start_time = time.time()
+ secgroups = self.cloud.list_security_groups(
+ filters={'name': 'default',
+ 'project_id': self.project.project.id})
+ if secgroups:
+ secgroup = secgroups[0]
+ else:
+ self.__logger.error("No 'default' security group in project %s",
+ self.project.project.name)
+ return False
+
+ self.cloud.create_security_group_rule(
+ secgroup.id, port_range_min=22, port_range_max=22,
+ protocol='tcp', direction='ingress')
+
self.__logger.info("Upload VNFD")
- cfy_client = self.orchestrator['object']
descriptor = self.vnf['descriptor']
- cfy_client.blueprints.publish_archive(descriptor.get('url'),
- descriptor.get('name'),
- descriptor.get('file_name'))
-
- self.__logger.info("Get or create flavor for all clearwater vm")
- flavor_settings = FlavorConfig(
- name=self.vnf['requirements']['flavor']['name'],
- ram=self.vnf['requirements']['flavor']['ram_min'],
- disk=25,
- vcpus=1)
- flavor_creator = OpenStackFlavor(self.snaps_creds, flavor_settings)
- flavor_creator.create()
- self.created_object.append(flavor_creator)
+ self.cfy_client.blueprints.upload(
+ descriptor.get('file_name'), descriptor.get('name'))
+ self.image_alt = self.publish_image_alt()
+ self.flavor_alt = self.create_flavor_alt()
self.vnf['inputs'].update(dict(
- flavor_id=self.vnf['requirements']['flavor']['name'],
+ image_id=self.image_alt.id,
+ flavor_id=self.flavor_alt.id,
))
self.__logger.info("Create VNF Instance")
- cfy_client.deployments.create(descriptor.get('name'),
- descriptor.get('name'),
- self.vnf.get('inputs'))
+ self.cfy_client.deployments.create(
+ descriptor.get('name'), descriptor.get('name'),
+ self.vnf.get('inputs'))
- wait_for_execution(cfy_client,
- _get_deployment_environment_creation_execution(
- cfy_client, descriptor.get('name')),
- self.__logger,
- timeout=300)
+ cloudify.wait_for_execution(
+ self.cfy_client,
+ cloudify.get_execution_id(self.cfy_client, descriptor.get('name')),
+ self.__logger, timeout=300)
self.__logger.info("Start the VNF Instance deployment")
- execution = cfy_client.executions.start(descriptor.get('name'),
- 'install')
+ execution = self.cfy_client.executions.start(
+ descriptor.get('name'), 'install')
# Show execution log
- execution = wait_for_execution(cfy_client, execution, self.__logger)
-
- duration = time.time() - start_time
+ execution = cloudify.wait_for_execution(
+ self.cfy_client, execution, self.__logger, timeout=3600)
self.__logger.info(execution)
- if execution.status == 'terminated':
- self.details['vnf'].update(status='PASS', duration=duration)
- self.result += 1/3 * 100
- result = True
- else:
- self.details['vnf'].update(status='FAIL', duration=duration)
- result = False
- return result
+ if execution.status != 'terminated':
+ self.details['vnf'].update(status='FAIL',
+ duration=time.time() - start_time)
+ return False
+
+ ellis_ip = self.cfy_client.deployments.outputs.get(
+ self.vnf['descriptor'].get('name'))['outputs']['ellis_ip']
+ bono_ip = self.cfy_client.deployments.outputs.get(
+ self.vnf['descriptor'].get('name'))['outputs']['bono_ip']
+ self.clearwater = clearwater.ClearwaterTesting(
+ self.case_name, bono_ip, ellis_ip)
+ self.clearwater.availability_check()
+
+ self.details['vnf'].update(status='PASS',
+ duration=time.time() - start_time)
+ self.result += 1/3 * 100
+ return True
def test_vnf(self):
"""Run test on clearwater ims instance."""
start_time = time.time()
-
- cfy_client = self.orchestrator['object']
-
- outputs = cfy_client.deployments.outputs.get(
- self.vnf['descriptor'].get('name'))['outputs']
- dns_ip = outputs['dns_ip']
- ellis_ip = outputs['ellis_ip']
- self.config_ellis(ellis_ip)
-
+ dns_ip = self.cfy_client.deployments.outputs.get(
+ self.vnf['descriptor'].get('name'))['outputs']['dns_ip']
if not dns_ip:
return False
-
- vims_test_result = self.run_clearwater_live_test(
- dns_ip=dns_ip,
+ short_result, vnf_test_rate = self.clearwater.run_clearwater_live_test(
public_domain=self.vnf['inputs']["public_domain"])
duration = time.time() - start_time
- short_result, nb_test = sig_test_format(vims_test_result)
self.__logger.info(short_result)
- self.details['test_vnf'].update(result=short_result,
- full_result=vims_test_result,
- duration=duration)
- try:
- vnf_test_rate = short_result['passed'] / nb_test
- # orchestrator + vnf + test_vnf
- self.result += vnf_test_rate / 3 * 100
- except ZeroDivisionError:
- self.__logger.error("No test has been executed")
+ self.details['test_vnf'].update(result=short_result, duration=duration)
+ self.result += vnf_test_rate / 3 * 100
+ if vnf_test_rate == 0:
self.details['test_vnf'].update(status='FAIL')
- return False
-
- return True
+ return bool(vnf_test_rate > 0)
def clean(self):
"""Clean created objects/functions."""
- try:
- cfy_client = self.orchestrator['object']
- dep_name = self.vnf['descriptor'].get('name')
- # kill existing execution
- self.__logger.info('Deleting the current deployment')
- exec_list = cfy_client.executions.list(dep_name)
- for execution in exec_list:
- if execution['status'] == "started":
- try:
- cfy_client.executions.cancel(execution['id'],
- force=True)
- except: # pylint: disable=broad-except
- self.__logger.warn("Can't cancel the current exec")
-
- execution = cfy_client.executions.start(
- dep_name,
- 'uninstall',
- parameters=dict(ignore_failure=True),
- force=True)
-
- wait_for_execution(cfy_client, execution, self.__logger)
- cfy_client.deployments.delete(self.vnf['descriptor'].get('name'))
- cfy_client.blueprints.delete(self.vnf['descriptor'].get('name'))
- except: # pylint: disable=broad-except
- self.__logger.warn("Some issue during the undeployment ..")
- self.__logger.warn("Tenant clean continue ..")
-
- super(CloudifyIms, self).clean()
-
- @energy.enable_recording
- def run(self, **kwargs):
- """Execute CloudifyIms test case."""
- return super(CloudifyIms, self).run(**kwargs)
-
-
-# ----------------------------------------------------------
-#
-# YAML UTILS
-#
-# -----------------------------------------------------------
-def get_config(parameter, file_path):
- """
- Get config parameter.
-
- Returns the value of a given parameter in file.yaml
- parameter must be given in string format with dots
- Example: general.openstack.image_name
- """
- with open(file_path) as config_file:
- file_yaml = yaml.safe_load(config_file)
- config_file.close()
- value = file_yaml
- for element in parameter.split("."):
- value = value.get(element)
- if value is None:
- raise ValueError("The parameter %s is not defined in"
- " reporting.yaml" % parameter)
- return value
-
-
-def wait_for_execution(client, execution, logger, timeout=1500, ):
- """Wait for a workflow execution on Cloudify Manager."""
- # if execution already ended - return without waiting
- if execution.status in Execution.END_STATES:
- return execution
-
- if timeout is not None:
- deadline = time.time() + timeout
-
- # Poll for execution status and execution logs, until execution ends
- # and we receive an event of type in WORKFLOW_END_TYPES
- offset = 0
- batch_size = 50
- event_list = []
- execution_ended = False
- while True:
- event_list = client.events.list(
- execution_id=execution.id,
- _offset=offset,
- _size=batch_size,
- include_logs=False,
- sort='@timestamp').items
-
- offset = offset + len(event_list)
- for event in event_list:
- logger.debug(event.get('message'))
-
- if timeout is not None:
- if time.time() > deadline:
- raise RuntimeError(
- 'execution of operation {0} for deployment {1} '
- 'timed out'.format(execution.workflow_id,
- execution.deployment_id))
- else:
- # update the remaining timeout
- timeout = deadline - time.time()
-
- if not execution_ended:
- execution = client.executions.get(execution.id)
- execution_ended = execution.status in Execution.END_STATES
-
- if execution_ended:
- break
-
- time.sleep(5)
-
- return execution
-
-
-def _get_deployment_environment_creation_execution(client, deployment_id):
- """
- Get the execution id of a env preparation.
-
- network, security group, fip, VM creation
- """
- executions = client.executions.list(deployment_id=deployment_id)
- for execution in executions:
- if execution.workflow_id == 'create_deployment_environment':
- return execution
- raise RuntimeError('Failed to get create_deployment_environment '
- 'workflow execution.'
- 'Available executions: {0}'.format(executions))
-
-
-def sig_test_format(sig_test):
- """Process the signaling result to have a short result."""
- nb_passed = 0
- nb_failures = 0
- nb_skipped = 0
- for data_test in sig_test:
- if data_test['result'] == "Passed":
- nb_passed += 1
- elif data_test['result'] == "Failed":
- nb_failures += 1
- elif data_test['result'] == "Skipped":
- nb_skipped += 1
- short_sig_test_result = {}
- short_sig_test_result['passed'] = nb_passed
- short_sig_test_result['failures'] = nb_failures
- short_sig_test_result['skipped'] = nb_skipped
- nb_test = nb_passed + nb_skipped
- return (short_sig_test_result, nb_test)
-
-
-def run_blocking_ssh_command(ssh, cmd, error_msg="Unable to run this command"):
- """Command to run ssh command with the exit status."""
- stdin, stdout, stderr = ssh.exec_command(cmd)
- if stdout.channel.recv_exit_status() != 0:
- raise Exception(error_msg)
+ self.kill_existing_execution(self.vnf['descriptor'].get('name'))
+ if self.image_alt:
+ self.cloud.delete_image(self.image_alt)
+ if self.flavor_alt:
+ self.orig_cloud.delete_flavor(self.flavor_alt.id)
+ super().clean()
diff --git a/functest/opnfv_tests/vnf/ims/cloudify_ims.yaml b/functest/opnfv_tests/vnf/ims/cloudify_ims.yaml
index e1a7bf316..869281a20 100644
--- a/functest/opnfv_tests/vnf/ims/cloudify_ims.yaml
+++ b/functest/opnfv_tests/vnf/ims/cloudify_ims.yaml
@@ -1,46 +1,23 @@
---
-tenant_images:
- ubuntu_14.04:
- /home/opnfv/functest/images/trusty-server-cloudimg-amd64-disk1.img
- cloudify_manager_4.0:
- /home/opnfv/functest/images/cloudify-manager-premium-4.0.1.qcow2
orchestrator:
name: cloudify
version: '4.0'
- requirements:
- flavor:
- name: m1.medium
- ram_min: 4096
- os_image: 'cloudify_manager_4.0'
vnf:
name: clearwater
- version: '107'
+ version: '129'
descriptor:
- file_name: openstack-blueprint.yaml
+ file_name: /src/cloudify_vims/openstack-blueprint.yaml
name: clearwater-opnfv
- url:
- https://github.com/Orange-OpenSource/opnfv-cloudify-clearwater/archive/master.zip
- version: '122'
- requirements:
- flavor:
- name: m1.small
- ram_min: 2048
- compute_quotas:
- cores: 50
- instances: 15
- network_quotas:
- security_group: 20
- security_group_rule: 100
- port: 50
+ version: '129'
inputs:
image_id: 'ubuntu_14.04'
- flavor_id: 'm1.small'
+ flavor_id: 'cloudify.small'
agent_user: ubuntu
key_pair_name: cloudify_ims_kp
private_key_path: '/etc/cloudify/cloudify_ims.pem'
external_network_name: ''
public_domain: clearwater.opnfv
- release: repo122
+ release: repo129
bono_cluster_size: 1
sprout_cluster_size: 1
vellum_cluster_size: 1
@@ -48,4 +25,4 @@ vnf:
homer_cluster_size: 1
vnf_test_suite:
name: clearwater-live-test
- version: "1.0"
+ version: '1.0'
diff --git a/functest/opnfv_tests/vnf/ims/cloudify_ims_perf.py b/functest/opnfv_tests/vnf/ims/cloudify_ims_perf.py
deleted file mode 100644
index 6d7428043..000000000
--- a/functest/opnfv_tests/vnf/ims/cloudify_ims_perf.py
+++ /dev/null
@@ -1,498 +0,0 @@
-#!/usr/bin/env python
-
-# Copyright (c) 2017 Orange, IXIA and others.
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-
-"""CloudifyImsPerf testcase implementation."""
-
-import logging
-import os
-import time
-
-import json
-import yaml
-import paramiko
-import dns.resolver
-from jinja2 import Environment, FileSystemLoader
-
-from functest.energy import energy
-from functest.opnfv_tests.openstack.snaps import snaps_utils
-from functest.opnfv_tests.vnf.ims import cloudify_ims
-from functest.opnfv_tests.vnf.ims.ixia.utils import IxChassisUtils
-from functest.opnfv_tests.vnf.ims.ixia.utils import IxLoadUtils
-from functest.opnfv_tests.vnf.ims.ixia.utils import IxRestUtils
-from functest.utils.constants import CONST
-
-from snaps.config.flavor import FlavorConfig
-from snaps.config.image import ImageConfig
-from snaps.config.network import NetworkConfig, PortConfig, SubnetConfig
-from snaps.config.router import RouterConfig
-from snaps.config.security_group import (
- Direction, Protocol, SecurityGroupConfig, SecurityGroupRuleConfig)
-from snaps.config.vm_inst import FloatingIpConfig, VmInstanceConfig
-from snaps.openstack.create_flavor import OpenStackFlavor
-from snaps.openstack.create_instance import OpenStackVmInstance
-from snaps.openstack.create_network import OpenStackNetwork
-from snaps.openstack.create_router import OpenStackRouter
-from snaps.openstack.create_security_group import OpenStackSecurityGroup
-
-
-__author__ = "Valentin Boucher <valentin.boucher@orange.com>"
-
-
-class CloudifyImsPerf(cloudify_ims.CloudifyIms):
- """Clearwater vIMS deployed with Cloudify Orchestrator Case."""
-
- __logger = logging.getLogger(__name__)
-
- def __init__(self, **kwargs):
- """Initialize CloudifyIms testcase object."""
- if "case_name" not in kwargs:
- kwargs["case_name"] = "cloudify_ims_perf"
- super(CloudifyImsPerf, self).__init__(**kwargs)
-
- # Retrieve the configuration
- try:
- self.config = CONST.__getattribute__(
- 'vnf_{}_config'.format(self.case_name))
- except Exception:
- raise Exception("VNF config file not found")
-
- self.snaps_creds = ''
- self.created_object = []
-
- config_file = os.path.join(self.case_dir, self.config)
- self.orchestrator = dict(
- requirements=get_config("orchestrator.requirements", config_file),
- )
- self.details['orchestrator'] = dict(
- name=get_config("orchestrator.name", config_file),
- version=get_config("orchestrator.version", config_file),
- status='ERROR',
- result=''
- )
- self.__logger.debug("Orchestrator configuration %s", self.orchestrator)
- self.vnf = dict(
- descriptor=get_config("vnf.descriptor", config_file),
- inputs=get_config("vnf.inputs", config_file),
- requirements=get_config("vnf.requirements", config_file)
- )
- self.details['vnf'] = dict(
- descriptor_version=self.vnf['descriptor']['version'],
- name=get_config("vnf.name", config_file),
- version=get_config("vnf.version", config_file),
- )
- self.__logger.debug("VNF configuration: %s", self.vnf)
-
- self.test = dict(
- version=get_config("vnf_test_suite.version", config_file),
- inputs=get_config("vnf_test_suite.inputs", config_file),
- requirements=get_config("vnf_test_suite.requirements", config_file)
- )
-
- self.details['test_vnf'] = dict(
- name=get_config("vnf_test_suite.name", config_file),
- version=get_config("vnf_test_suite.version", config_file),
- requirements=get_config("vnf_test_suite.requirements", config_file)
- )
- self.images = get_config("tenant_images", config_file)
- self.__logger.info("Images needed for vIMS: %s", self.images)
-
- def test_vnf(self):
- """Run IXIA Stress test on clearwater ims instance."""
- start_time = time.time()
-
- cfy_client = self.orchestrator['object']
-
- outputs = cfy_client.deployments.outputs.get(
- self.vnf['descriptor'].get('name'))['outputs']
- dns_ip = outputs['dns_ip']
- ellis_ip = outputs['ellis_ip']
-
- self.__logger.info("Creating full IXIA network ...")
- subnet_settings = SubnetConfig(name='ixia_management_subnet',
- cidr='10.10.10.0/24')
- network_settings = NetworkConfig(name='ixia_management_network',
- subnet_settings=[subnet_settings])
- network_creator = OpenStackNetwork(self.snaps_creds, network_settings)
- network_creator.create()
- self.created_object.append(network_creator)
- ext_net_name = snaps_utils.get_ext_net_name(self.snaps_creds)
- router_creator = OpenStackRouter(
- self.snaps_creds,
- RouterConfig(
- name='ixia_management_router',
- external_gateway=ext_net_name,
- internal_subnets=[subnet_settings.name]))
- router_creator.create()
- self.created_object.append(router_creator)
-
- # security group creation
- self.__logger.info("Creating security groups for IXIA VMs")
- sg_rules = list()
- sg_rules.append(
- SecurityGroupRuleConfig(sec_grp_name="ixia_management",
- direction=Direction.ingress,
- protocol=Protocol.tcp, port_range_min=1,
- port_range_max=65535))
- sg_rules.append(
- SecurityGroupRuleConfig(sec_grp_name="ixia_management",
- direction=Direction.ingress,
- protocol=Protocol.udp, port_range_min=1,
- port_range_max=65535))
- sg_rules.append(
- SecurityGroupRuleConfig(sec_grp_name="ixia_management",
- direction=Direction.ingress,
- protocol=Protocol.icmp))
-
- ixia_managment_sg_settings = SecurityGroupConfig(
- name="ixia_management", rule_settings=sg_rules)
- securit_group_creator = OpenStackSecurityGroup(
- self.snaps_creds,
- ixia_managment_sg_settings)
-
- securit_group_creator.create()
- self.created_object.append(securit_group_creator)
-
- sg_rules = list()
- sg_rules.append(
- SecurityGroupRuleConfig(sec_grp_name="ixia_ssh_http",
- direction=Direction.ingress,
- protocol=Protocol.tcp, port_range_min=1,
- port_range_max=65535))
-
- ixia_ssh_http_sg_settings = SecurityGroupConfig(
- name="ixia_ssh_http", rule_settings=sg_rules)
- securit_group_creator = OpenStackSecurityGroup(
- self.snaps_creds,
- ixia_ssh_http_sg_settings)
-
- securit_group_creator.create()
- self.created_object.append(securit_group_creator)
-
- chassis_flavor_settings = FlavorConfig(
- name="ixia_vChassis",
- ram=4096,
- disk=40,
- vcpus=2)
- flavor_creator = OpenStackFlavor(self.snaps_creds,
- chassis_flavor_settings)
- flavor_creator.create()
- self.created_object.append(flavor_creator)
-
- card_flavor_settings = FlavorConfig(
- name="ixia_vCard",
- ram=4096,
- disk=4,
- vcpus=2)
- flavor_creator = OpenStackFlavor(self.snaps_creds,
- card_flavor_settings)
- flavor_creator.create()
- self.created_object.append(flavor_creator)
-
- load_flavor_settings = FlavorConfig(
- name="ixia_vLoad",
- ram=8192,
- disk=100,
- vcpus=4)
- flavor_creator = OpenStackFlavor(self.snaps_creds,
- load_flavor_settings)
- flavor_creator.create()
- self.created_object.append(flavor_creator)
-
- chassis_image_settings = ImageConfig(
- name=self.test['requirements']['chassis']['image'],
- image_user='admin',
- exists=True)
-
- card_image_settings = ImageConfig(
- name=self.test['requirements']['card']['image'],
- image_user='admin',
- exists=True)
-
- load_image_settings = ImageConfig(
- name=self.test['requirements']['load']['image'],
- image_user='admin',
- exists=True)
-
- chassis_port_settings = PortConfig(
- name='ixia_chassis_port', network_name=network_settings.name)
-
- card1_port1_settings = PortConfig(
- name='ixia_card1_port1', network_name=network_settings.name)
-
- card2_port1_settings = PortConfig(
- name='ixia_card2_port1', network_name=network_settings.name)
-
- card1_port2_settings = PortConfig(
- name='ixia_card1_port2', network_name="cloudify_ims_network")
-
- card2_port2_settings = PortConfig(
- name='ixia_card2_port2', network_name="cloudify_ims_network")
-
- load_port_settings = PortConfig(
- name='ixia_load_port', network_name=network_settings.name)
-
- chassis_settings = VmInstanceConfig(
- name='ixia_vChassis',
- flavor=chassis_flavor_settings.name,
- port_settings=[chassis_port_settings],
- security_group_names=[ixia_ssh_http_sg_settings.name,
- ixia_managment_sg_settings.name],
- floating_ip_settings=[FloatingIpConfig(
- name='ixia_vChassis_fip',
- port_name=chassis_port_settings.name,
- router_name=router_creator.router_settings.name)])
-
- vm_creator = OpenStackVmInstance(self.snaps_creds,
- chassis_settings,
- chassis_image_settings)
-
- self.__logger.info("Creating Ixia vChassis VM")
- vm_creator.create()
- fip_chassis = vm_creator.get_floating_ip().ip
- self.created_object.append(vm_creator)
-
- card1_settings = VmInstanceConfig(
- name='ixia_vCard1',
- flavor=card_flavor_settings.name,
- port_settings=[card1_port1_settings, card1_port2_settings],
- security_group_names=[ixia_managment_sg_settings.name])
-
- vm_creator = OpenStackVmInstance(self.snaps_creds,
- card1_settings,
- card_image_settings)
-
- self.__logger.info("Creating Ixia vCard1 VM")
- vm_creator.create()
- vcard_ips = list()
- vcard_ips_p2 = list()
- vcard_ips.append(vm_creator.get_port_ip('ixia_card1_port1'))
- vcard_ips_p2.append(vm_creator.get_port_ip('ixia_card1_port2'))
- self.created_object.append(vm_creator)
-
- card2_settings = VmInstanceConfig(
- name='ixia_vCard2',
- flavor=card_flavor_settings.name,
- port_settings=[card2_port1_settings, card2_port2_settings],
- security_group_names=[ixia_managment_sg_settings.name])
-
- vm_creator = OpenStackVmInstance(self.snaps_creds,
- card2_settings,
- card_image_settings)
-
- self.__logger.info("Creating Ixia vCard2 VM")
- vm_creator.create()
- vcard_ips.append(vm_creator.get_port_ip('ixia_card2_port1'))
- vcard_ips_p2.append(vm_creator.get_port_ip('ixia_card2_port2'))
- self.created_object.append(vm_creator)
-
- load_settings = VmInstanceConfig(
- name='ixia_vLoad',
- flavor=load_flavor_settings.name,
- port_settings=[load_port_settings],
- security_group_names=[ixia_ssh_http_sg_settings.name,
- ixia_managment_sg_settings.name],
- floating_ip_settings=[FloatingIpConfig(
- name='ixia_vLoad_fip',
- port_name=load_port_settings.name,
- router_name=router_creator.router_settings.name)])
-
- vm_creator = OpenStackVmInstance(self.snaps_creds,
- load_settings,
- load_image_settings)
-
- self.__logger.info("Creating Ixia vLoad VM")
- vm_creator.create()
- fip_load = vm_creator.get_floating_ip().ip
- self.created_object.append(vm_creator)
-
- self.__logger.info("Chassis IP is: %s", fip_chassis)
- login_url = "https://" + str(fip_chassis) + "/api/v1/auth/session"
- cards_url = "https://" + str(fip_chassis) + "/api/v2/ixos/cards/"
-
- payload = json.dumps({"username": "admin",
- "password": "admin",
- "rememberMe": "false"})
- api_key = json.loads((
- IxChassisUtils.ChassisRestAPI.postWithPayload(
- login_url, payload)))["apiKey"]
-
- self.__logger.info("Adding 2 card back inside the ixia chassis...")
-
- for ip in vcard_ips:
- payload = {"ipAddress": str(ip)}
- response = json.loads(IxChassisUtils.ChassisRestAPI.postOperation(
- cards_url, api_key, payload))
- count = 0
- while (int(
- IxChassisUtils.ChassisRestAPI.getWithHeaders(
- response['url'], api_key)['progress']) != 100):
- self.__logger.debug("Operation did not finish yet. \
- Waiting for 1 more second..")
- time.sleep(1)
- if count > 60:
- raise Exception("Adding card take more than 60 seconds")
- count += 1
-
- ssh = paramiko.SSHClient()
- ssh.set_missing_host_key_policy(paramiko.MissingHostKeyPolicy())
- ssh.connect(fip_chassis, username="admin", password="admin")
- cmd = "set license-check disable"
- run_blocking_ssh_command(ssh, cmd)
- cmd = "restart-service ixServer"
- run_blocking_ssh_command(ssh, cmd)
-
- self.config_ellis(ellis_ip)
-
- # Get IPs of P-CSCF
- resolver = dns.resolver.Resolver()
- resolver.nameservers = [dns_ip]
- result = resolver.query("bono.clearwater.local")
-
- iplistims = ''
- i = 0
- for rdata in result:
- i = i + 1
- print rdata.address
- iplistims += str(rdata.address)
- if i != len(result):
- iplistims += ';'
-
- kResourcesUrl = 'http://%s:%s/api/v0/resources' % (fip_load, 8080)
-
- kRxfPath = r"REG_CALL_OPNFV_v13.rxf"
- test_filname = self.test['inputs']['test_filname']
- kGatewaySharedFolder = '/mnt/ixload-share/'
- kRxfRelativeUploadPath = 'uploads/%s' % os.path.split(kRxfPath)[1]
- kRxfAbsoluteUploadPath = os.path.join(kGatewaySharedFolder,
- kRxfRelativeUploadPath)
- kChassisList = [str(fip_chassis)]
- dataFileNameList = [test_filname,
- 'Registration_only_LPS.tst',
- 'SIPCall.tst']
-
- kPortListPerCommunityCommunity = {"VoIP1@VM1": [(1, 1, 1)],
- "VoIP2@VM2": [(1, 2, 1)]}
-
- kStatsToDisplayDict = self.test['inputs']['stats']
- connection = IxRestUtils.getConnection(fip_load, 8080)
-
- self.__logger.info("Creating a new session...")
- sessionUrl = IxLoadUtils.createSession(connection,
- self.test['version'])
-
- license_server = self.test['inputs']['licenseServer']
- IxLoadUtils.configureLicenseServer(connection,
- sessionUrl,
- license_server)
-
- files_dir = os.path.join(self.case_dir, 'ixia/files')
- target_file = open(os.path.join(files_dir, test_filname), 'w')
- j2_env = Environment(loader=FileSystemLoader(files_dir),
- trim_blocks=True)
- self.test['inputs'].update(dict(
- ipchassis=fip_chassis, ipcard1=vcard_ips_p2[0],
- ipcard2=vcard_ips_p2[1], iplistims=iplistims
- ))
-
- target_file.write(
- j2_env.get_template(test_filname + '.template').render(
- self.test['inputs']
- ))
- target_file.close()
-
- self.__logger.info('Uploading files %s...' % kRxfPath)
- for dataFile in dataFileNameList:
- localFilePath = os.path.join(files_dir, dataFile)
- remoteFilePath = os.path.join(kGatewaySharedFolder,
- 'uploads/%s' % dataFile)
- IxLoadUtils.uploadFile(connection, kResourcesUrl,
- localFilePath, remoteFilePath)
- self.__logger.info('Upload file finished.')
-
- self.__logger.info("Loading repository %s..." % kRxfAbsoluteUploadPath)
- IxLoadUtils.loadRepository(connection, sessionUrl,
- kRxfAbsoluteUploadPath)
-
- self.__logger.info("Clearing chassis list...")
- IxLoadUtils.clearChassisList(connection, sessionUrl)
-
- self.__logger.info("Adding chassis %s..." % (kChassisList))
- IxLoadUtils.addChassisList(connection, sessionUrl, kChassisList)
-
- self.__logger.info("Assigning new ports...")
- IxLoadUtils.assignPorts(connection, sessionUrl,
- kPortListPerCommunityCommunity)
-
- self.__logger.info("Starting the test...")
- IxLoadUtils.runTest(connection, sessionUrl)
-
- self.__logger.info(
- "Polling values for stats %s..." % (kStatsToDisplayDict))
- result = IxLoadUtils.pollStats(connection, sessionUrl,
- kStatsToDisplayDict)
- self.__logger.info("Test finished.")
- self.__logger.info("Checking test status...")
- testRunError = IxLoadUtils.getTestRunError(connection, sessionUrl)
-
- self.__logger.info(result)
- duration = time.time() - start_time
- self.details['test_vnf'].update(status='PASS',
- result=result,
- duration=duration)
- if testRunError:
- self.__logger.info(
- "The test exited with following error: %s" % (testRunError))
- self.details['test_vnf'].update(status='FAIL', duration=duration)
- return False
- else:
- self.__logger.info("The test completed successfully.")
- self.details['test_vnf'].update(status='PASS', duration=duration)
- self.result += 1/3 * 100
- return True
-
- def clean(self):
- """Clean created objects/functions."""
- super(CloudifyImsPerf, self).clean()
-
- @energy.enable_recording
- def run(self, **kwargs):
- """Execute CloudifyIms test case."""
- return super(CloudifyImsPerf, self).run(**kwargs)
-
-
-# ----------------------------------------------------------
-#
-# YAML UTILS
-#
-# -----------------------------------------------------------
-def get_config(parameter, file_path):
- """
- Get config parameter.
-
- Returns the value of a given parameter in file.yaml
- parameter must be given in string format with dots
- Example: general.openstack.image_name
- """
- with open(file_path) as config_file:
- file_yaml = yaml.safe_load(config_file)
- config_file.close()
- value = file_yaml
- for element in parameter.split("."):
- value = value.get(element)
- if value is None:
- raise ValueError("The parameter %s is not defined in"
- " reporting.yaml" % parameter)
- return value
-
-
-def run_blocking_ssh_command(ssh, cmd, error_msg="Unable to run this command"):
- """Command to run ssh command with the exit status."""
- stdin, stdout, stderr = ssh.exec_command(cmd)
- if stdout.channel.recv_exit_status() != 0:
- raise Exception(error_msg)
diff --git a/functest/opnfv_tests/vnf/ims/cloudify_ims_perf.yaml b/functest/opnfv_tests/vnf/ims/cloudify_ims_perf.yaml
deleted file mode 100644
index 77b295d0a..000000000
--- a/functest/opnfv_tests/vnf/ims/cloudify_ims_perf.yaml
+++ /dev/null
@@ -1,91 +0,0 @@
----
-tenant_images:
- ubuntu_14.04:
- http://cloud-images.ubuntu.com/trusty/current/trusty-server-cloudimg-amd64-disk1.img
- cloudify_manager_4.0:
- http://repository.cloudifysource.org/cloudify/4.0.1/sp-release/cloudify-manager-premium-4.0.1.qcow2
- # PATH of the virtual chassis image.
- IXIA_CHASSIS: # Ixia_Virtual_Chassis_8.30_EA_KVM.qcow2
- # PATH of the virtual card image.
- IXIA_CARD: # Ixia_Virtual_Load_Module_8.30_EA_KVM.qcow2
- # PATH of the virtual loader image.
- IXIA_LOAD: # Ixia_Virtual_Loader_8.30_EA_KVM.qcow2
-orchestrator:
- name: cloudify
- version: '4.0'
- requirements:
- flavor:
- name: m1.medium
- ram_min: 4096
- os_image: 'cloudify_manager_4.0'
-vnf:
- name: clearwater
- version: '107'
- descriptor:
- file_name: openstack-blueprint-with-numbers.yaml
- name: clearwater-opnfv
- url:
- https://github.com/Orange-OpenSource/opnfv-cloudify-clearwater/archive/master.zip
- version: '122'
- requirements:
- flavor:
- name: m1.small
- ram_min: 2048
- compute_quotas:
- cores: 150
- instances: 100
- ram: 256000
- network_quotas:
- security_group: 25
- security_group_rule: 100
- port: 150
- inputs:
- image_id: 'ubuntu_14.04'
- flavor_id: 'm1.small'
- agent_user: ubuntu
- key_pair_name: cloudify_ims_kp
- private_key_path: '/etc/cloudify/cloudify_ims.pem'
- external_network_name: ''
- public_domain: clearwater.opnfv
- release: repo122
- bono_cluster_size: 2
- sprout_cluster_size: 2
- vellum_cluster_size: 2
- dime_cluster_size: 2
- homer_cluster_size: 2
- number_of_subscribers: 50000
-vnf_test_suite:
- name: ixia
- version: "8.30.0.161"
- requirements:
- chassis:
- image: IXIA_CHASSIS
- card:
- image: IXIA_CARD
- load:
- image: IXIA_LOAD
- inputs:
- ipgw: '10.67.79.1'
- pnregistering: '201001[0000-]'
- pncalling: '201000[0000-]'
- pncalled: '201000[5000-]'
- sipportregistering: '[5060-]'
- sipportcalling: '[5061-]'
- sipportcalled: '[5062-]'
- domainname: 'clearwater.opnfv'
- authpassword: 'toto'
- registeringtotalcalls: '1000'
- registeringduration: '180'
- activecalls: '1000'
- testduration: '360'
- test_filname: 'REG_CALL_OPNFV_v13.rxf'
- licenseServer: '' # IP of YOUR IXIA LICENSE SERVER
- stats:
- 'Signaling(VoIPSip)':
- - 'Successful Registrations'
- - 'Failed Registrations'
- - 'Active Calls'
- - 'Attempted Calls'
- - 'Received Calls'
- - 'Failed Attempted Calls'
- - 'Failed Received Calls'
diff --git a/functest/opnfv_tests/vnf/ims/heat_ims.py b/functest/opnfv_tests/vnf/ims/heat_ims.py
new file mode 100644
index 000000000..0d4e345a0
--- /dev/null
+++ b/functest/opnfv_tests/vnf/ims/heat_ims.py
@@ -0,0 +1,253 @@
+#!/usr/bin/env python
+
+# Copyright (c) 2018 Kontron, Orange and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+
+"""HeatIms testcase implementation."""
+
+from __future__ import division
+
+import logging
+import os
+import re
+import time
+import tempfile
+
+import paramiko
+import pkg_resources
+from xtesting.core import testcase
+
+from functest.core import singlevm
+from functest.opnfv_tests.vnf.ims import clearwater
+from functest.utils import config
+from functest.utils import env
+from functest.utils import functest_utils
+
+__author__ = "Valentin Boucher <valentin.boucher@kontron.com>"
+
+
+class HeatIms(singlevm.VmReady2):
+ # pylint: disable=too-many-instance-attributes
+ """Clearwater vIMS deployed with Heat Orchestrator Case."""
+
+ __logger = logging.getLogger(__name__)
+
+ filename = ('/home/opnfv/functest/images/'
+ 'ubuntu-14.04-server-cloudimg-amd64-disk1.img')
+
+ flavor_ram = 1024
+ flavor_vcpus = 1
+ flavor_disk = 3
+
+ quota_security_group = 20
+ quota_security_group_rule = 100
+ quota_port = 50
+
+ parameters = {
+ 'private_mgmt_net_cidr': '192.168.100.0/24',
+ 'private_mgmt_net_gateway': '192.168.100.254',
+ 'private_mgmt_net_pool_start': '192.168.100.1',
+ 'private_mgmt_net_pool_end': '192.168.100.253'}
+
+ def __init__(self, **kwargs):
+ """Initialize HeatIms testcase object."""
+ if "case_name" not in kwargs:
+ kwargs["case_name"] = "heat_ims"
+ super().__init__(**kwargs)
+
+ # Retrieve the configuration
+ try:
+ self.config = getattr(
+ config.CONF, f'vnf_{self.case_name}_config')
+ except Exception as exc:
+ raise Exception("VNF config file not found") from exc
+
+ self.case_dir = pkg_resources.resource_filename(
+ 'functest', 'opnfv_tests/vnf/ims')
+ config_file = os.path.join(self.case_dir, self.config)
+
+ self.vnf = dict(
+ descriptor=functest_utils.get_parameter_from_yaml(
+ "vnf.descriptor", config_file),
+ parameters=functest_utils.get_parameter_from_yaml(
+ "vnf.inputs", config_file)
+ )
+ self.details['vnf'] = dict(
+ descriptor_version=self.vnf['descriptor']['version'],
+ name=functest_utils.get_parameter_from_yaml(
+ "vnf.name", config_file),
+ version=functest_utils.get_parameter_from_yaml(
+ "vnf.version", config_file),
+ )
+ self.__logger.debug("VNF configuration: %s", self.vnf)
+ self.keypair = None
+ self.stack = None
+ self.clearwater = None
+ self.role = None
+ (_, self.key_filename) = tempfile.mkstemp()
+
+ def create_network_resources(self):
+ pass
+
+ def execute(self):
+ # pylint: disable=too-many-locals,too-many-statements
+ """
+ Prepare Tenant/User
+
+ network, security group, fip, VM creation
+ """
+ self.orig_cloud.set_network_quotas(
+ self.project.project.name,
+ security_group=self.quota_security_group,
+ security_group_rule=self.quota_security_group_rule,
+ port=self.quota_port)
+ if not self.orig_cloud.get_role("heat_stack_owner"):
+ self.role = self.orig_cloud.create_role("heat_stack_owner")
+ self.orig_cloud.grant_role(
+ "heat_stack_owner", user=self.project.user.id,
+ project=self.project.project.id,
+ domain=self.project.domain.id)
+ self.keypair = self.cloud.create_keypair(
+ f'{self.case_name}-kp_{self.guid}')
+ self.__logger.info("keypair:\n%s", self.keypair.private_key)
+ with open(
+ self.key_filename, 'w', encoding='utf-8') as private_key_file:
+ private_key_file.write(self.keypair.private_key)
+
+ if self.deploy_vnf() and self.test_vnf():
+ self.result = 100
+ return 0
+ self.result = 1/3 * 100
+ return 1
+
+ def run(self, **kwargs):
+ """Deploy and test clearwater
+
+ Here are the main actions:
+ - deploy clearwater stack via heat
+ - test the vnf instance
+
+ Returns:
+ - TestCase.EX_OK
+ - TestCase.EX_RUN_ERROR on error
+ """
+ status = testcase.TestCase.EX_RUN_ERROR
+ try:
+ assert self.cloud
+ assert super().run(
+ **kwargs) == testcase.TestCase.EX_OK
+ self.result = 0
+ if not self.execute():
+ self.result = 100
+ status = testcase.TestCase.EX_OK
+ except Exception: # pylint: disable=broad-except
+ self.__logger.exception('Cannot run %s', self.case_name)
+ finally:
+ self.stop_time = time.time()
+ return status
+
+ def _monit(self, username="ubuntu", timeout=60):
+ servers = self.cloud.list_servers(detailed=True)
+ self.__logger.debug("servers: %s", servers)
+ for server in servers:
+ if 'ns' in server.name:
+ break
+ self.__logger.info("server:\n%s", server.name)
+ ssh = paramiko.SSHClient()
+ ssh.set_missing_host_key_policy(paramiko.client.AutoAddPolicy())
+ ssh.connect(
+ server.public_v4, username=username,
+ key_filename=self.key_filename, timeout=timeout)
+ (_, stdout, _) = ssh.exec_command('sudo monit summary')
+ self.__logger.info("output:\n%s", stdout.read().decode("utf-8"))
+ ssh.close()
+
+ def deploy_vnf(self):
+ """Deploy Clearwater IMS."""
+ start_time = time.time()
+ descriptor = self.vnf['descriptor']
+ parameters = self.vnf['parameters']
+
+ parameters['public_mgmt_net_id'] = self.ext_net.id
+ parameters['flavor'] = self.flavor.name
+ parameters['image'] = self.image.name
+ parameters['key_name'] = self.keypair.name
+ parameters['external_mgmt_dns_ip'] = env.get('NAMESERVER')
+ parameters.update(self.parameters)
+
+ self.__logger.info("Create Heat Stack")
+ self.stack = self.cloud.create_stack(
+ name=descriptor.get('name'),
+ template_file=descriptor.get('file_name'),
+ wait=True, **parameters)
+ self.__logger.debug("stack: %s", self.stack)
+
+ self._monit()
+
+ servers = self.cloud.list_servers(detailed=True)
+ self.__logger.debug("servers: %s", servers)
+ for server in servers:
+ if not self.check_regex_in_console(
+ server.name, regex='Cloud-init .* finished at ', loop=1):
+ return False
+ if 'ellis' in server.name:
+ self.__logger.debug("ellis: %s", server)
+ ellis_ip = server.public_v4
+ elif 'bono' in server.name:
+ self.__logger.debug("bono: %s", server)
+ bono_ip = server.public_v4
+
+ assert ellis_ip
+ assert bono_ip
+ self.clearwater = clearwater.ClearwaterTesting(
+ self.case_name, bono_ip, ellis_ip)
+ # This call can take time and many retry because Heat is
+ # an infrastructure orchestrator so when Heat say "stack created"
+ # it means that all OpenStack ressources are created but not that
+ # Clearwater are up and ready (Cloud-Init script still running)
+ self.clearwater.availability_check()
+
+ duration = time.time() - start_time
+
+ self.details['vnf'].update(status='PASS', duration=duration)
+ self.result += 1/3 * 100
+
+ return True
+
+ def test_vnf(self):
+ """Run test on clearwater ims instance."""
+ start_time = time.time()
+ outputs = self.cloud.get_stack(self.stack.id).outputs
+ self.__logger.debug("stack outputs: %s", outputs)
+ dns_ip = re.findall(r'[0-9]+(?:\.[0-9]+){3}', str(outputs))[0]
+ if not dns_ip:
+ return False
+ short_result, vnf_test_rate = self.clearwater.run_clearwater_live_test(
+ public_domain=self.vnf['parameters']["zone"])
+ duration = time.time() - start_time
+ self.__logger.info(short_result)
+ self.details['test_vnf'] = dict(result=short_result, duration=duration)
+ self.result += vnf_test_rate / 3 * 100
+ if vnf_test_rate == 0:
+ self.details['test_vnf'].update(status='FAIL')
+ self._monit()
+ return bool(vnf_test_rate > 0)
+
+ def clean(self):
+ """Clean created objects/functions."""
+ assert self.cloud
+ try:
+ if self.stack:
+ self.cloud.delete_stack(self.stack.id, wait=True)
+ except TypeError:
+ # shade raises TypeError exceptions when checking stack status
+ pass
+ except Exception: # pylint: disable=broad-except
+ self.__logger.exception("Cannot clean stack ressources")
+ super().clean()
+ if self.role:
+ self.orig_cloud.delete_role(self.role.id)
diff --git a/functest/opnfv_tests/vnf/ims/heat_ims.yaml b/functest/opnfv_tests/vnf/ims/heat_ims.yaml
new file mode 100644
index 000000000..2ccdc0bf7
--- /dev/null
+++ b/functest/opnfv_tests/vnf/ims/heat_ims.yaml
@@ -0,0 +1,22 @@
+---
+orchestrator:
+ name: heat
+ version: '4.0'
+vnf:
+ name: clearwater
+ version: '130'
+ descriptor:
+ file_name: /src/heat_vims/clearwater.yaml
+ name: clearwater-opnfv
+ version: '130'
+ inputs:
+ zone: clearwater.opnfv
+ dn_range_start: "6505550000"
+ dn_range_length: "1000"
+ bono_cluster_size: 1
+ sprout_cluster_size: 1
+ vellum_cluster_size: 1
+ dime_cluster_size: 1
+ homer_cluster_size: 1
+ dnssec_key:
+ GkBraPnditvP2Em4oXV5wUTawmZaGGuO+Jt3ZnFkznGV3zFoQ+Ak13nuuOnO0JV5FqAr/KitdW6siqjXSjROXg==
diff --git a/functest/opnfv_tests/vnf/ims/ixia/__init__.py b/functest/opnfv_tests/vnf/ims/ixia/__init__.py
deleted file mode 100644
index e69de29bb..000000000
--- a/functest/opnfv_tests/vnf/ims/ixia/__init__.py
+++ /dev/null
diff --git a/functest/opnfv_tests/vnf/ims/ixia/files/REG_CALL_OPNFV_v13.rxf.template b/functest/opnfv_tests/vnf/ims/ixia/files/REG_CALL_OPNFV_v13.rxf.template
deleted file mode 100644
index 279362810..000000000
--- a/functest/opnfv_tests/vnf/ims/ixia/files/REG_CALL_OPNFV_v13.rxf.template
+++ /dev/null
@@ -1,16731 +0,0 @@
-<?xml version="1.0" ?>
-<root ver="[21, [1, [0, [0]]]]" type="ixRepository">
- <_smSessionXml ver="[0, [1, [0, [0]]]]" type="ixSMSessionXML">
- <xml type="str">&lt;rpf&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.SMSession type=&quot;Ixia.Aptixia.StackManager.SMSession&quot; objectid=&quot;d0db76dc-f224-429f-91ba-e207cd4711db&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;doWaitLinkUp type=&quot;Bool&quot;&gt;0&lt;/doWaitLinkUp&gt;&#13;&#10; &lt;doGratArp type=&quot;Bool&quot;&gt;0&lt;/doGratArp&gt;&#13;&#10; &lt;subscribeToGratArpNotifications type=&quot;Bool&quot;&gt;0&lt;/subscribeToGratArpNotifications&gt;&#13;&#10; &lt;doInterfaceCheck type=&quot;Bool&quot;&gt;0&lt;/doInterfaceCheck&gt;&#13;&#10; &lt;rebootPortsBeforeConfigure type=&quot;Bool&quot;&gt;0&lt;/rebootPortsBeforeConfigure&gt;&#13;&#10; &lt;testDuration type=&quot;Int&quot;&gt;10000&lt;/testDuration&gt;&#13;&#10; &lt;checkLinkState type=&quot;Bool&quot;&gt;0&lt;/checkLinkState&gt;&#13;&#10; &lt;portGroupList type=&quot;ListNode&quot;&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.PortGroup type=&quot;Ixia.Aptixia.StackManager.PortGroup&quot; objectid=&quot;e7fa1f9e-23d9-4742-96b2-6edce6c4424e&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;name type=&quot;String&quot;&gt;VM1&lt;/name&gt;&#13;&#10; &lt;category type=&quot;String&quot; /&gt;&#13;&#10; &lt;stack type=&quot;Ixia.Aptixia.StackManager.L1EthernetPlugin&quot; objectid=&quot;45426251-0720-4316-b8a5-d6bce32e3d2e&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;autoNegotiate type=&quot;Bool&quot;&gt;1&lt;/autoNegotiate&gt;&#13;&#10; &lt;speed type=&quot;String&quot;&gt;k100FD&lt;/speed&gt;&#13;&#10; &lt;advertise10Half type=&quot;Bool&quot;&gt;1&lt;/advertise10Half&gt;&#13;&#10; &lt;advertise10Full type=&quot;Bool&quot;&gt;1&lt;/advertise10Full&gt;&#13;&#10; &lt;advertise100Half type=&quot;Bool&quot;&gt;1&lt;/advertise100Half&gt;&#13;&#10; &lt;advertise100Full type=&quot;Bool&quot;&gt;1&lt;/advertise100Full&gt;&#13;&#10; &lt;advertise1000Full type=&quot;Bool&quot;&gt;1&lt;/advertise1000Full&gt;&#13;&#10; &lt;advertise2500Full type=&quot;Bool&quot;&gt;1&lt;/advertise2500Full&gt;&#13;&#10; &lt;advertise5000Full type=&quot;Bool&quot;&gt;1&lt;/advertise5000Full&gt;&#13;&#10; &lt;advertise10000Full type=&quot;Bool&quot;&gt;0&lt;/advertise10000Full&gt;&#13;&#10; &lt;cardDualPhy type=&quot;Ixia.Aptixia.StackManager.DualPhyPlugin&quot; objectid=&quot;836ee0d6-1957-42eb-a7a4-53bcfbdd36e0&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;medium type=&quot;String&quot;&gt;copper&lt;/medium&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;2&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/cardDualPhy&gt;&#13;&#10; &lt;cardElm type=&quot;Ixia.Aptixia.StackManager.EthernetELMPlugin&quot; objectid=&quot;8387c005-0df9-4fd2-977e-1c234c7be0cc&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;negotiateMasterSlave type=&quot;Bool&quot;&gt;1&lt;/negotiateMasterSlave&gt;&#13;&#10; &lt;negotiationType type=&quot;String&quot;&gt;master&lt;/negotiationType&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;2&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/cardElm&gt;&#13;&#10; &lt;enableFlowControl type=&quot;Bool&quot;&gt;0&lt;/enableFlowControl&gt;&#13;&#10; &lt;directedAddress type=&quot;String&quot;&gt;01:80:C2:00:00:01&lt;/directedAddress&gt;&#13;&#10; &lt;dataCenter type=&quot;Ixia.Aptixia.StackManager.DataCenterSettings&quot; objectid=&quot;df9be2ec-31d8-47f0-babe-79a1710303f3&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;dcSupported type=&quot;Bool&quot;&gt;1&lt;/dcSupported&gt;&#13;&#10; &lt;dcEnabled type=&quot;Bool&quot;&gt;0&lt;/dcEnabled&gt;&#13;&#10; &lt;dcFlowControl type=&quot;Ixia.Aptixia.StackManager.DataCenterSettingsSkeleton+eFlowControlType&quot;&gt;0&lt;/dcFlowControl&gt;&#13;&#10; &lt;dcMode type=&quot;Ixia.Aptixia.StackManager.DataCenterSettingsSkeleton+eDataCenterMode&quot;&gt;2&lt;/dcMode&gt;&#13;&#10; &lt;dcPfcMapping type=&quot;IntList&quot; /&gt;&#13;&#10; &lt;dcPfcPauseEnable type=&quot;Bool&quot;&gt;0&lt;/dcPfcPauseEnable&gt;&#13;&#10; &lt;dcPfcPauseDelay type=&quot;Int&quot;&gt;1&lt;/dcPfcPauseDelay&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;2&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/dataCenter&gt;&#13;&#10; &lt;childrenList type=&quot;ListNode&quot;&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.L2EthernetPlugin type=&quot;Ixia.Aptixia.StackManager.L2EthernetPlugin&quot; objectid=&quot;166a11b6-4d30-40ea-b9e1-ac4fb44f112b&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;macRangeList type=&quot;ListNode&quot;&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.MacRange type=&quot;Ixia.Aptixia.StackManager.MacRange&quot; objectid=&quot;ba896971-1d78-4e03-8f2a-28c65417612e&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;enabled type=&quot;Bool&quot;&gt;1&lt;/enabled&gt;&#13;&#10; &lt;name type=&quot;String&quot;&gt;MAC-R11&lt;/name&gt;&#13;&#10; &lt;mac type=&quot;String&quot;&gt;00:0A:43:4F:1B:00&lt;/mac&gt;&#13;&#10; &lt;incrementBy type=&quot;String&quot;&gt;00:00:00:00:00:01&lt;/incrementBy&gt;&#13;&#10; &lt;mtu type=&quot;Int&quot;&gt;1410&lt;/mtu&gt;&#13;&#10; &lt;count type=&quot;Int&quot;&gt;1&lt;/count&gt;&#13;&#10; &lt;vlanRange type=&quot;Ixia.Aptixia.StackManager.VlanIdRange&quot; objectid=&quot;2b81e36c-9cbb-4d78-a70c-904da8d41b28&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;name type=&quot;String&quot;&gt;VLAN-R11&lt;/name&gt;&#13;&#10; &lt;enabled type=&quot;Bool&quot;&gt;0&lt;/enabled&gt;&#13;&#10; &lt;firstId type=&quot;Int&quot;&gt;1&lt;/firstId&gt;&#13;&#10; &lt;incrementStep type=&quot;Int&quot;&gt;1&lt;/incrementStep&gt;&#13;&#10; &lt;increment type=&quot;Int&quot;&gt;1&lt;/increment&gt;&#13;&#10; &lt;uniqueCount type=&quot;Int&quot;&gt;4094&lt;/uniqueCount&gt;&#13;&#10; &lt;priority type=&quot;Int&quot;&gt;1&lt;/priority&gt;&#13;&#10; &lt;tpid type=&quot;String&quot;&gt;0x8100&lt;/tpid&gt;&#13;&#10; &lt;innerEnable type=&quot;Bool&quot;&gt;0&lt;/innerEnable&gt;&#13;&#10; &lt;innerFirstId type=&quot;Int&quot;&gt;1&lt;/innerFirstId&gt;&#13;&#10; &lt;innerIncrementStep type=&quot;Int&quot;&gt;1&lt;/innerIncrementStep&gt;&#13;&#10; &lt;innerIncrement type=&quot;Int&quot;&gt;1&lt;/innerIncrement&gt;&#13;&#10; &lt;innerUniqueCount type=&quot;Int&quot;&gt;4094&lt;/innerUniqueCount&gt;&#13;&#10; &lt;innerPriority type=&quot;Int&quot;&gt;1&lt;/innerPriority&gt;&#13;&#10; &lt;idIncrMode type=&quot;Int&quot;&gt;2&lt;/idIncrMode&gt;&#13;&#10; &lt;innerTpid type=&quot;String&quot;&gt;0x8100&lt;/innerTpid&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;9&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/vlanRange&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;9&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.MacRange&gt;&#13;&#10; &lt;/macRangeList&gt;&#13;&#10; &lt;vlanRangeList type=&quot;ListNode&quot;&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.VlanIdRange type=&quot;Ixia.Aptixia.StackManager.VlanIdRange&quot; objectid=&quot;2b81e36c-9cbb-4d78-a70c-904da8d41b28&quot; version=&quot;6.70.420&quot; /&gt;&#13;&#10; &lt;/vlanRangeList&gt;&#13;&#10; &lt;childrenList type=&quot;ListNode&quot;&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.IpV4V6Plugin type=&quot;Ixia.Aptixia.StackManager.IpV4V6Plugin&quot; objectid=&quot;9ea551b2-a0af-4a7d-9872-e9b94298d7bd&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;rangeList type=&quot;ListNode&quot;&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.IpV4V6Range type=&quot;Ixia.Aptixia.StackManager.IpV4V6Range&quot; objectid=&quot;5affc0a7-68f6-46f6-b801-0e18e067a572&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;enabled type=&quot;Bool&quot;&gt;1&lt;/enabled&gt;&#13;&#10; &lt;name type=&quot;String&quot;&gt;IP-R13&lt;/name&gt;&#13;&#10; &lt;ipType type=&quot;String&quot;&gt;IPv4&lt;/ipType&gt;&#13;&#10; &lt;ipAddress type=&quot;String&quot;&gt;{{ipcard1}}&lt;/ipAddress&gt;&#13;&#10; &lt;prefix type=&quot;Int&quot;&gt;16&lt;/prefix&gt;&#13;&#10; &lt;incrementBy type=&quot;String&quot;&gt;0.0.0.1&lt;/incrementBy&gt;&#13;&#10; &lt;count type=&quot;Int&quot;&gt;1&lt;/count&gt;&#13;&#10; &lt;autoCountEnabled type=&quot;Bool&quot;&gt;0&lt;/autoCountEnabled&gt;&#13;&#10; &lt;gatewayAddress type=&quot;String&quot;&gt;{{ipgw}}&lt;/gatewayAddress&gt;&#13;&#10; &lt;gatewayIncrement type=&quot;String&quot;&gt;0.0.0.0&lt;/gatewayIncrement&gt;&#13;&#10; &lt;gatewayIncrementMode type=&quot;String&quot;&gt;perSubnet&lt;/gatewayIncrementMode&gt;&#13;&#10; &lt;enableGatewayArp type=&quot;Bool&quot;&gt;0&lt;/enableGatewayArp&gt;&#13;&#10; &lt;generateStatistics type=&quot;Bool&quot;&gt;0&lt;/generateStatistics&gt;&#13;&#10; &lt;mss type=&quot;Int&quot;&gt;1410&lt;/mss&gt;&#13;&#10; &lt;randomizeAddress type=&quot;Bool&quot;&gt;0&lt;/randomizeAddress&gt;&#13;&#10; &lt;randomizeSeed type=&quot;Int&quot;&gt;1007257123&lt;/randomizeSeed&gt;&#13;&#10; &lt;autoMacGeneration type=&quot;Bool&quot;&gt;1&lt;/autoMacGeneration&gt;&#13;&#10; &lt;macRange type=&quot;Ixia.Aptixia.StackManager.MacRange&quot; objectid=&quot;ba896971-1d78-4e03-8f2a-28c65417612e&quot; version=&quot;6.70.420&quot; /&gt;&#13;&#10; &lt;vlanRange type=&quot;Ixia.Aptixia.StackManager.VlanIdRange&quot; objectid=&quot;2b81e36c-9cbb-4d78-a70c-904da8d41b28&quot; version=&quot;6.70.420&quot; /&gt;&#13;&#10; &lt;atmRange type=&quot;Ixia.Aptixia.StackManager.AtmRange&quot; objectid=&quot;00000000-0000-0000-0000-000000000000&quot; /&gt;&#13;&#10; &lt;pvcRange type=&quot;Ixia.Aptixia.StackManager.PvcRange&quot; objectid=&quot;00000000-0000-0000-0000-000000000000&quot; /&gt;&#13;&#10; &lt;autoIpTypeEnabled type=&quot;Bool&quot;&gt;0&lt;/autoIpTypeEnabled&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;9&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.IpV4V6Range&gt;&#13;&#10; &lt;/rangeList&gt;&#13;&#10; &lt;rangeGroups type=&quot;ListNode&quot;&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.RangeGroup type=&quot;Ixia.Aptixia.StackManager.RangeGroup&quot; objectid=&quot;abf2b6e4-a102-4cbe-bf1b-a11f11b2faac&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;name type=&quot;String&quot;&gt;Group1&lt;/name&gt;&#13;&#10; &lt;distribType type=&quot;Ixia.Aptixia.StackManager.RangeGroupSkeleton+eDistributionType&quot;&gt;0&lt;/distribType&gt;&#13;&#10; &lt;rangeList type=&quot;ListNode&quot;&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.IpV4V6Range type=&quot;Ixia.Aptixia.StackManager.IpV4V6Range&quot; objectid=&quot;5affc0a7-68f6-46f6-b801-0e18e067a572&quot; version=&quot;6.70.420&quot; /&gt;&#13;&#10; &lt;/rangeList&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;-1&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.RangeGroup&gt;&#13;&#10; &lt;/rangeGroups&gt;&#13;&#10; &lt;childrenList type=&quot;ListNode&quot; /&gt;&#13;&#10; &lt;extensionList type=&quot;ListNode&quot; /&gt;&#13;&#10; &lt;dscMode type=&quot;Bool&quot;&gt;0&lt;/dscMode&gt;&#13;&#10; &lt;name type=&quot;String&quot;&gt;IP-8&lt;/name&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;26&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.IpV4V6Plugin&gt;&#13;&#10; &lt;/childrenList&gt;&#13;&#10; &lt;extensionList type=&quot;ListNode&quot; /&gt;&#13;&#10; &lt;dscMode type=&quot;Bool&quot;&gt;0&lt;/dscMode&gt;&#13;&#10; &lt;name type=&quot;String&quot;&gt;MAC/VLAN-8&lt;/name&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;25&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.L2EthernetPlugin&gt;&#13;&#10; &lt;/childrenList&gt;&#13;&#10; &lt;extensionList type=&quot;ListNode&quot; /&gt;&#13;&#10; &lt;dscMode type=&quot;Bool&quot;&gt;0&lt;/dscMode&gt;&#13;&#10; &lt;name type=&quot;String&quot;&gt;Ethernet-1&lt;/name&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;1&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/stack&gt;&#13;&#10; &lt;globalPluginList type=&quot;ListNode&quot;&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.FilterPlugin type=&quot;Ixia.Aptixia.StackManager.FilterPlugin&quot; objectid=&quot;976ba0fd-58ea-44d4-ae43-1b36c2556072&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;auto type=&quot;Bool&quot;&gt;1&lt;/auto&gt;&#13;&#10; &lt;all type=&quot;Bool&quot;&gt;0&lt;/all&gt;&#13;&#10; &lt;pppoecontrol type=&quot;Bool&quot;&gt;0&lt;/pppoecontrol&gt;&#13;&#10; &lt;pppoenetwork type=&quot;Bool&quot;&gt;0&lt;/pppoenetwork&gt;&#13;&#10; &lt;isis type=&quot;Bool&quot;&gt;0&lt;/isis&gt;&#13;&#10; &lt;ip type=&quot;String&quot; /&gt;&#13;&#10; &lt;tcp type=&quot;String&quot; /&gt;&#13;&#10; &lt;udp type=&quot;String&quot; /&gt;&#13;&#10; &lt;mac type=&quot;String&quot; /&gt;&#13;&#10; &lt;icmp type=&quot;String&quot; /&gt;&#13;&#10; &lt;name type=&quot;String&quot;&gt;Filter-1&lt;/name&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;1&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.FilterPlugin&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.GratArpPlugin type=&quot;Ixia.Aptixia.StackManager.GratArpPlugin&quot; objectid=&quot;3ebd05e7-88a6-49be-a50d-134908ac124c&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;enabled type=&quot;Bool&quot;&gt;1&lt;/enabled&gt;&#13;&#10; &lt;forwardGratArp type=&quot;Bool&quot;&gt;0&lt;/forwardGratArp&gt;&#13;&#10; &lt;rateControlEnabled type=&quot;Bool&quot;&gt;0&lt;/rateControlEnabled&gt;&#13;&#10; &lt;maxFramesPerSecond type=&quot;Int&quot;&gt;0&lt;/maxFramesPerSecond&gt;&#13;&#10; &lt;name type=&quot;String&quot;&gt;GratARP-1&lt;/name&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;2&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.GratArpPlugin&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.TCPPlugin type=&quot;Ixia.Aptixia.StackManager.TCPPlugin&quot; objectid=&quot;1d9748c5-122e-4153-8ffd-67cd1309b8ce&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;bestPerfSettings type=&quot;Bool&quot;&gt;0&lt;/bestPerfSettings&gt;&#13;&#10; &lt;accept_ra_all type=&quot;Bool&quot;&gt;0&lt;/accept_ra_all&gt;&#13;&#10; &lt;tcp_abort_on_overflow type=&quot;Bool&quot;&gt;0&lt;/tcp_abort_on_overflow&gt;&#13;&#10; &lt;tcp_adv_win_scale type=&quot;Int&quot;&gt;2&lt;/tcp_adv_win_scale&gt;&#13;&#10; &lt;tcp_app_win type=&quot;Int&quot;&gt;31&lt;/tcp_app_win&gt;&#13;&#10; &lt;tcp_bic type=&quot;Int&quot;&gt;0&lt;/tcp_bic&gt;&#13;&#10; &lt;tcp_bic_fast_convergence type=&quot;Int&quot;&gt;1&lt;/tcp_bic_fast_convergence&gt;&#13;&#10; &lt;tcp_bic_low_window type=&quot;Int&quot;&gt;14&lt;/tcp_bic_low_window&gt;&#13;&#10; &lt;tcp_dsack type=&quot;Bool&quot;&gt;1&lt;/tcp_dsack&gt;&#13;&#10; &lt;tcp_ecn type=&quot;Bool&quot;&gt;0&lt;/tcp_ecn&gt;&#13;&#10; &lt;tcp_fack type=&quot;Bool&quot;&gt;1&lt;/tcp_fack&gt;&#13;&#10; &lt;tcp_fin_timeout type=&quot;Int&quot;&gt;60&lt;/tcp_fin_timeout&gt;&#13;&#10; &lt;tcp_frto type=&quot;Int&quot;&gt;0&lt;/tcp_frto&gt;&#13;&#10; &lt;tcp_keepalive_intvl type=&quot;Int&quot;&gt;75&lt;/tcp_keepalive_intvl&gt;&#13;&#10; &lt;tcp_keepalive_probes type=&quot;Int&quot;&gt;9&lt;/tcp_keepalive_probes&gt;&#13;&#10; &lt;tcp_keepalive_time type=&quot;Int&quot;&gt;7200&lt;/tcp_keepalive_time&gt;&#13;&#10; &lt;tcp_low_latency type=&quot;Int&quot;&gt;0&lt;/tcp_low_latency&gt;&#13;&#10; &lt;tcp_max_orphans type=&quot;Int&quot;&gt;8192&lt;/tcp_max_orphans&gt;&#13;&#10; &lt;tcp_max_syn_backlog type=&quot;Int&quot;&gt;1024&lt;/tcp_max_syn_backlog&gt;&#13;&#10; &lt;tcp_max_tw_buckets type=&quot;Int&quot;&gt;180000&lt;/tcp_max_tw_buckets&gt;&#13;&#10; &lt;tcp_mem_low type=&quot;Int&quot;&gt;24576&lt;/tcp_mem_low&gt;&#13;&#10; &lt;tcp_mem_pressure type=&quot;Int&quot;&gt;32768&lt;/tcp_mem_pressure&gt;&#13;&#10; &lt;tcp_mem_high type=&quot;Int&quot;&gt;49152&lt;/tcp_mem_high&gt;&#13;&#10; &lt;tcp_moderate_rcvbuf type=&quot;Int&quot;&gt;0&lt;/tcp_moderate_rcvbuf&gt;&#13;&#10; &lt;tcp_no_metrics_save type=&quot;Bool&quot;&gt;0&lt;/tcp_no_metrics_save&gt;&#13;&#10; &lt;tcp_orphan_retries type=&quot;Int&quot;&gt;0&lt;/tcp_orphan_retries&gt;&#13;&#10; &lt;tcp_reordering type=&quot;Int&quot;&gt;3&lt;/tcp_reordering&gt;&#13;&#10; &lt;tcp_retrans_collapse type=&quot;Bool&quot;&gt;1&lt;/tcp_retrans_collapse&gt;&#13;&#10; &lt;tcp_retries1 type=&quot;Int&quot;&gt;3&lt;/tcp_retries1&gt;&#13;&#10; &lt;tcp_retries2 type=&quot;Int&quot;&gt;5&lt;/tcp_retries2&gt;&#13;&#10; &lt;tcp_rfc1337 type=&quot;Bool&quot;&gt;0&lt;/tcp_rfc1337&gt;&#13;&#10; &lt;tcp_rmem_min type=&quot;Int&quot;&gt;4096&lt;/tcp_rmem_min&gt;&#13;&#10; &lt;tcp_rmem_default type=&quot;Int&quot;&gt;8192&lt;/tcp_rmem_default&gt;&#13;&#10; &lt;tcp_rmem_max type=&quot;Int&quot;&gt;262144&lt;/tcp_rmem_max&gt;&#13;&#10; &lt;tcp_sack type=&quot;Bool&quot;&gt;1&lt;/tcp_sack&gt;&#13;&#10; &lt;tcp_stdurg type=&quot;Bool&quot;&gt;0&lt;/tcp_stdurg&gt;&#13;&#10; &lt;tcp_synack_retries type=&quot;Int&quot;&gt;5&lt;/tcp_synack_retries&gt;&#13;&#10; &lt;tcp_syn_retries type=&quot;Int&quot;&gt;5&lt;/tcp_syn_retries&gt;&#13;&#10; &lt;tcp_timestamps type=&quot;Bool&quot;&gt;1&lt;/tcp_timestamps&gt;&#13;&#10; &lt;tcp_tw_recycle type=&quot;Bool&quot;&gt;1&lt;/tcp_tw_recycle&gt;&#13;&#10; &lt;tcp_tw_reuse type=&quot;Bool&quot;&gt;0&lt;/tcp_tw_reuse&gt;&#13;&#10; &lt;tcp_vegas_alpha type=&quot;Int&quot;&gt;2&lt;/tcp_vegas_alpha&gt;&#13;&#10; &lt;tcp_vegas_beta type=&quot;Int&quot;&gt;6&lt;/tcp_vegas_beta&gt;&#13;&#10; &lt;tcp_vegas_cong_avoid type=&quot;Int&quot;&gt;0&lt;/tcp_vegas_cong_avoid&gt;&#13;&#10; &lt;tcp_vegas_gamma type=&quot;Int&quot;&gt;2&lt;/tcp_vegas_gamma&gt;&#13;&#10; &lt;tcp_westwood type=&quot;Int&quot;&gt;0&lt;/tcp_westwood&gt;&#13;&#10; &lt;tcp_window_scaling type=&quot;Bool&quot;&gt;0&lt;/tcp_window_scaling&gt;&#13;&#10; &lt;ip_no_pmtu_disc type=&quot;Bool&quot;&gt;1&lt;/ip_no_pmtu_disc&gt;&#13;&#10; &lt;tcp_wmem_min type=&quot;Int&quot;&gt;4096&lt;/tcp_wmem_min&gt;&#13;&#10; &lt;tcp_wmem_default type=&quot;Int&quot;&gt;8192&lt;/tcp_wmem_default&gt;&#13;&#10; &lt;tcp_wmem_max type=&quot;Int&quot;&gt;262144&lt;/tcp_wmem_max&gt;&#13;&#10; &lt;tcp_ipfrag_time type=&quot;Int&quot;&gt;30&lt;/tcp_ipfrag_time&gt;&#13;&#10; &lt;tcp_port_min type=&quot;Int&quot;&gt;1024&lt;/tcp_port_min&gt;&#13;&#10; &lt;tcp_port_max type=&quot;Int&quot;&gt;65535&lt;/tcp_port_max&gt;&#13;&#10; &lt;tcp_rto_min type=&quot;Int&quot;&gt;1000&lt;/tcp_rto_min&gt;&#13;&#10; &lt;tcp_rto_max type=&quot;Int&quot;&gt;60000&lt;/tcp_rto_max&gt;&#13;&#10; &lt;tcp_tw_rfc1323_strict type=&quot;Bool&quot;&gt;0&lt;/tcp_tw_rfc1323_strict&gt;&#13;&#10; &lt;udp_port_randomization type=&quot;Bool&quot;&gt;0&lt;/udp_port_randomization&gt;&#13;&#10; &lt;disable_min_max_buffer_size type=&quot;Bool&quot;&gt;1&lt;/disable_min_max_buffer_size&gt;&#13;&#10; &lt;llm_hdr_gap type=&quot;Int&quot;&gt;8&lt;/llm_hdr_gap&gt;&#13;&#10; &lt;llm_hdr_gap_ns type=&quot;Int&quot;&gt;10&lt;/llm_hdr_gap_ns&gt;&#13;&#10; &lt;inter_packet_granular_delay type=&quot;Double&quot;&gt;0&lt;/inter_packet_granular_delay&gt;&#13;&#10; &lt;delayed_acks type=&quot;Bool&quot;&gt;1&lt;/delayed_acks&gt;&#13;&#10; &lt;accept_ra_default type=&quot;Bool&quot;&gt;0&lt;/accept_ra_default&gt;&#13;&#10; &lt;rps_needed type=&quot;Bool&quot;&gt;0&lt;/rps_needed&gt;&#13;&#10; &lt;delayed_acks_segments type=&quot;Int&quot;&gt;0&lt;/delayed_acks_segments&gt;&#13;&#10; &lt;delayed_acks_timeout type=&quot;Int&quot;&gt;0&lt;/delayed_acks_timeout&gt;&#13;&#10; &lt;tcp_large_icwnd type=&quot;Int&quot;&gt;0&lt;/tcp_large_icwnd&gt;&#13;&#10; &lt;tcp_mgmt_rmem type=&quot;Int&quot;&gt;87380&lt;/tcp_mgmt_rmem&gt;&#13;&#10; &lt;tcp_mgmt_wmem type=&quot;Int&quot;&gt;32768&lt;/tcp_mgmt_wmem&gt;&#13;&#10; &lt;adjust_tcp_buffers type=&quot;Bool&quot;&gt;1&lt;/adjust_tcp_buffers&gt;&#13;&#10; &lt;name type=&quot;String&quot;&gt;TCP-1&lt;/name&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;3&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.TCPPlugin&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.DnsPlugin type=&quot;Ixia.Aptixia.StackManager.DnsPlugin&quot; objectid=&quot;9cc60113-3e53-4cf2-b3b7-6fd7d3953bb4&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;domain type=&quot;String&quot; /&gt;&#13;&#10; &lt;timeout type=&quot;Int&quot;&gt;30&lt;/timeout&gt;&#13;&#10; &lt;nameServerList type=&quot;ListNode&quot; /&gt;&#13;&#10; &lt;searchList type=&quot;ListNode&quot; /&gt;&#13;&#10; &lt;hostList type=&quot;ListNode&quot; /&gt;&#13;&#10; &lt;name type=&quot;String&quot;&gt;DNS-1&lt;/name&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;4&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.DnsPlugin&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.IxLoadSettingsPlugin type=&quot;Ixia.Aptixia.StackManager.IxLoadSettingsPlugin&quot; objectid=&quot;399db714-47a8-445d-a24b-90d00d3f2e9e&quot; version=&quot;1.0.0&quot;&gt;&#13;&#10; &lt;teardownInterfaceWithUser type=&quot;Bool&quot;&gt;0&lt;/teardownInterfaceWithUser&gt;&#13;&#10; &lt;interfaceBehavior type=&quot;Int&quot;&gt;0&lt;/interfaceBehavior&gt;&#13;&#10; &lt;name type=&quot;String&quot;&gt;Settings-1&lt;/name&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;5&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.IxLoadSettingsPlugin&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.MeshingPlugin type=&quot;Ixia.Aptixia.StackManager.MeshingPlugin&quot; objectid=&quot;39d2a556-cf85-4102-8461-b1f1413b2db5&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;trafficMaps type=&quot;ListNode&quot;&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.MeshingTrafficMap type=&quot;Ixia.Aptixia.StackManager.MeshingTrafficMap&quot; objectid=&quot;cdca1e00-77a3-49ef-8fe5-afb321a51af2&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;name type=&quot;String&quot;&gt;CALLING!VoIP2_CALLED#{{sipportcalled}}&lt;/name&gt;&#13;&#10; &lt;configMapFilename type=&quot;String&quot;&gt;CALLINGScript.configmap&lt;/configMapFilename&gt;&#13;&#10; &lt;sourceActivityId type=&quot;Int&quot;&gt;1&lt;/sourceActivityId&gt;&#13;&#10; &lt;ipPreference type=&quot;Ixia.Aptixia.StackManager.MeshingTrafficMapSkeleton+eIpPreference&quot;&gt;0&lt;/ipPreference&gt;&#13;&#10; &lt;portRangesString type=&quot;String&quot;&gt;{{sipportcalled}}&lt;/portRangesString&gt;&#13;&#10; &lt;meshingType type=&quot;Ixia.Aptixia.StackManager.MeshingTrafficMapSkeleton+eMeshingType&quot;&gt;2&lt;/meshingType&gt;&#13;&#10; &lt;destinationActivityId type=&quot;Int&quot;&gt;0&lt;/destinationActivityId&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.MeshingTrafficMap&gt;&#13;&#10; &lt;/trafficMaps&gt;&#13;&#10; &lt;activityRangeMapInfoList type=&quot;ListNode&quot; /&gt;&#13;&#10; &lt;name type=&quot;String&quot;&gt;Meshing-1&lt;/name&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;11&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.MeshingPlugin&gt;&#13;&#10; &lt;/globalPluginList&gt;&#13;&#10; &lt;portList type=&quot;Ixia.RpFramework.Server.Core.ShadowedPropertyStringList&quot;&gt;&#13;&#10; &lt;String&gt;{{ipchassis}};1;1&lt;/String&gt;&#13;&#10; &lt;/portList&gt;&#13;&#10; &lt;typeSpecificData type=&quot;ListNode&quot;&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.IPSecPortGroupData type=&quot;Ixia.Aptixia.StackManager.IPSecPortGroupData&quot; objectid=&quot;62e57abd-b4c6-45af-a720-7033259c203c&quot; version=&quot;6.70.0&quot;&gt;&#13;&#10; &lt;role type=&quot;String&quot;&gt;Initiator&lt;/role&gt;&#13;&#10; &lt;associates type=&quot;ListNode&quot; /&gt;&#13;&#10; &lt;overrideGlobalOptions type=&quot;Bool&quot;&gt;0&lt;/overrideGlobalOptions&gt;&#13;&#10; &lt;useMaxInitiationRate type=&quot;Bool&quot;&gt;0&lt;/useMaxInitiationRate&gt;&#13;&#10; &lt;maxInitiationRate type=&quot;Int&quot;&gt;50&lt;/maxInitiationRate&gt;&#13;&#10; &lt;useMaxPendingTunnels type=&quot;Bool&quot;&gt;0&lt;/useMaxPendingTunnels&gt;&#13;&#10; &lt;maxPendingTunnels type=&quot;Int&quot;&gt;50&lt;/maxPendingTunnels&gt;&#13;&#10; &lt;teardownRate type=&quot;Int&quot;&gt;10&lt;/teardownRate&gt;&#13;&#10; &lt;enableESPPerStreamStats type=&quot;Bool&quot;&gt;0&lt;/enableESPPerStreamStats&gt;&#13;&#10; &lt;enableESPReplayStats type=&quot;Bool&quot;&gt;0&lt;/enableESPReplayStats&gt;&#13;&#10; &lt;activities type=&quot;ListNode&quot; /&gt;&#13;&#10; &lt;pcpuLogLevel type=&quot;String&quot;&gt;0&lt;/pcpuLogLevel&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;3&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.IPSecPortGroupData&gt;&#13;&#10; &lt;/typeSpecificData&gt;&#13;&#10; &lt;virtualMode type=&quot;Bool&quot;&gt;0&lt;/virtualMode&gt;&#13;&#10; &lt;allowedVirtualModeTypes type=&quot;Ixia.RpFramework.Server.Core.ShadowedPropertyStringList&quot; /&gt;&#13;&#10; &lt;doOwnership type=&quot;Bool&quot;&gt;0&lt;/doOwnership&gt;&#13;&#10; &lt;branchToNicMap type=&quot;ListNode&quot; /&gt;&#13;&#10; &lt;cpuAggregation type=&quot;Bool&quot;&gt;0&lt;/cpuAggregation&gt;&#13;&#10; &lt;activePort type=&quot;String&quot; /&gt;&#13;&#10; &lt;networkLayersManager type=&quot;Ixia.Aptixia.StackManager.NetworkLayersManager&quot; objectid=&quot;f7999b28-d3d6-4a69-bd61-ab5516b7c540&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;3&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/networkLayersManager&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;1&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.PortGroup&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.PortGroup type=&quot;Ixia.Aptixia.StackManager.PortGroup&quot; objectid=&quot;b1fbd381-b769-4ec1-8715-299508ecb458&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;name type=&quot;String&quot;&gt;VM2&lt;/name&gt;&#13;&#10; &lt;category type=&quot;String&quot; /&gt;&#13;&#10; &lt;stack type=&quot;Ixia.Aptixia.StackManager.L1EthernetPlugin&quot; objectid=&quot;48f486a6-f09b-4770-a091-e9ce609e9bec&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;autoNegotiate type=&quot;Bool&quot;&gt;1&lt;/autoNegotiate&gt;&#13;&#10; &lt;speed type=&quot;String&quot;&gt;k100FD&lt;/speed&gt;&#13;&#10; &lt;advertise10Half type=&quot;Bool&quot;&gt;1&lt;/advertise10Half&gt;&#13;&#10; &lt;advertise10Full type=&quot;Bool&quot;&gt;1&lt;/advertise10Full&gt;&#13;&#10; &lt;advertise100Half type=&quot;Bool&quot;&gt;1&lt;/advertise100Half&gt;&#13;&#10; &lt;advertise100Full type=&quot;Bool&quot;&gt;1&lt;/advertise100Full&gt;&#13;&#10; &lt;advertise1000Full type=&quot;Bool&quot;&gt;1&lt;/advertise1000Full&gt;&#13;&#10; &lt;advertise2500Full type=&quot;Bool&quot;&gt;1&lt;/advertise2500Full&gt;&#13;&#10; &lt;advertise5000Full type=&quot;Bool&quot;&gt;1&lt;/advertise5000Full&gt;&#13;&#10; &lt;advertise10000Full type=&quot;Bool&quot;&gt;1&lt;/advertise10000Full&gt;&#13;&#10; &lt;cardDualPhy type=&quot;Ixia.Aptixia.StackManager.DualPhyPlugin&quot; objectid=&quot;c500685a-4fcb-4335-abe0-70c98cf1ba43&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;medium type=&quot;String&quot;&gt;auto&lt;/medium&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;4&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/cardDualPhy&gt;&#13;&#10; &lt;cardElm type=&quot;Ixia.Aptixia.StackManager.EthernetELMPlugin&quot; objectid=&quot;92644bb5-bda6-4072-98f9-47b47e4597c7&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;negotiateMasterSlave type=&quot;Bool&quot;&gt;1&lt;/negotiateMasterSlave&gt;&#13;&#10; &lt;negotiationType type=&quot;String&quot;&gt;master&lt;/negotiationType&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;4&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/cardElm&gt;&#13;&#10; &lt;enableFlowControl type=&quot;Bool&quot;&gt;0&lt;/enableFlowControl&gt;&#13;&#10; &lt;directedAddress type=&quot;String&quot;&gt;01:80:C2:00:00:01&lt;/directedAddress&gt;&#13;&#10; &lt;dataCenter type=&quot;Ixia.Aptixia.StackManager.DataCenterSettings&quot; objectid=&quot;3726f608-97b7-4bf2-b88e-4c0bf13b45a0&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;dcSupported type=&quot;Bool&quot;&gt;1&lt;/dcSupported&gt;&#13;&#10; &lt;dcEnabled type=&quot;Bool&quot;&gt;0&lt;/dcEnabled&gt;&#13;&#10; &lt;dcFlowControl type=&quot;Ixia.Aptixia.StackManager.DataCenterSettingsSkeleton+eFlowControlType&quot;&gt;0&lt;/dcFlowControl&gt;&#13;&#10; &lt;dcMode type=&quot;Ixia.Aptixia.StackManager.DataCenterSettingsSkeleton+eDataCenterMode&quot;&gt;2&lt;/dcMode&gt;&#13;&#10; &lt;dcPfcMapping type=&quot;IntList&quot; /&gt;&#13;&#10; &lt;dcPfcPauseEnable type=&quot;Bool&quot;&gt;0&lt;/dcPfcPauseEnable&gt;&#13;&#10; &lt;dcPfcPauseDelay type=&quot;Int&quot;&gt;1&lt;/dcPfcPauseDelay&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;4&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/dataCenter&gt;&#13;&#10; &lt;childrenList type=&quot;ListNode&quot;&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.L2EthernetPlugin type=&quot;Ixia.Aptixia.StackManager.L2EthernetPlugin&quot; objectid=&quot;820b0582-6a4c-4109-bd5d-587621a43ce2&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;macRangeList type=&quot;ListNode&quot;&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.MacRange type=&quot;Ixia.Aptixia.StackManager.MacRange&quot; objectid=&quot;aa73bd95-9ffb-411e-8ab3-8a128767aacb&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;enabled type=&quot;Bool&quot;&gt;1&lt;/enabled&gt;&#13;&#10; &lt;name type=&quot;String&quot;&gt;MAC-R2&lt;/name&gt;&#13;&#10; &lt;mac type=&quot;String&quot;&gt;00:0A:43:4F:2A:00&lt;/mac&gt;&#13;&#10; &lt;incrementBy type=&quot;String&quot;&gt;00:00:00:00:00:01&lt;/incrementBy&gt;&#13;&#10; &lt;mtu type=&quot;Int&quot;&gt;1410&lt;/mtu&gt;&#13;&#10; &lt;count type=&quot;Int&quot;&gt;1&lt;/count&gt;&#13;&#10; &lt;vlanRange type=&quot;Ixia.Aptixia.StackManager.VlanIdRange&quot; objectid=&quot;7024f4b3-1a75-491a-8da1-17a45a15d5cc&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;name type=&quot;String&quot;&gt;VLAN-R2&lt;/name&gt;&#13;&#10; &lt;enabled type=&quot;Bool&quot;&gt;0&lt;/enabled&gt;&#13;&#10; &lt;firstId type=&quot;Int&quot;&gt;1&lt;/firstId&gt;&#13;&#10; &lt;incrementStep type=&quot;Int&quot;&gt;1&lt;/incrementStep&gt;&#13;&#10; &lt;increment type=&quot;Int&quot;&gt;1&lt;/increment&gt;&#13;&#10; &lt;uniqueCount type=&quot;Int&quot;&gt;4094&lt;/uniqueCount&gt;&#13;&#10; &lt;priority type=&quot;Int&quot;&gt;1&lt;/priority&gt;&#13;&#10; &lt;tpid type=&quot;String&quot;&gt;0x8100&lt;/tpid&gt;&#13;&#10; &lt;innerEnable type=&quot;Bool&quot;&gt;0&lt;/innerEnable&gt;&#13;&#10; &lt;innerFirstId type=&quot;Int&quot;&gt;1&lt;/innerFirstId&gt;&#13;&#10; &lt;innerIncrementStep type=&quot;Int&quot;&gt;1&lt;/innerIncrementStep&gt;&#13;&#10; &lt;innerIncrement type=&quot;Int&quot;&gt;1&lt;/innerIncrement&gt;&#13;&#10; &lt;innerUniqueCount type=&quot;Int&quot;&gt;4094&lt;/innerUniqueCount&gt;&#13;&#10; &lt;innerPriority type=&quot;Int&quot;&gt;1&lt;/innerPriority&gt;&#13;&#10; &lt;idIncrMode type=&quot;Int&quot;&gt;2&lt;/idIncrMode&gt;&#13;&#10; &lt;innerTpid type=&quot;String&quot;&gt;0x8100&lt;/innerTpid&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;2&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/vlanRange&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;2&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.MacRange&gt;&#13;&#10; &lt;/macRangeList&gt;&#13;&#10; &lt;vlanRangeList type=&quot;ListNode&quot;&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.VlanIdRange type=&quot;Ixia.Aptixia.StackManager.VlanIdRange&quot; objectid=&quot;7024f4b3-1a75-491a-8da1-17a45a15d5cc&quot; version=&quot;6.70.420&quot; /&gt;&#13;&#10; &lt;/vlanRangeList&gt;&#13;&#10; &lt;childrenList type=&quot;ListNode&quot;&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.IpV4V6Plugin type=&quot;Ixia.Aptixia.StackManager.IpV4V6Plugin&quot; objectid=&quot;e53ae54e-ab21-4997-b532-e9bd58210050&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;rangeList type=&quot;ListNode&quot;&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.IpV4V6Range type=&quot;Ixia.Aptixia.StackManager.IpV4V6Range&quot; objectid=&quot;c69dae97-f1c2-4505-aedb-3f9ca3f4d02a&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;enabled type=&quot;Bool&quot;&gt;1&lt;/enabled&gt;&#13;&#10; &lt;name type=&quot;String&quot;&gt;IP-R2&lt;/name&gt;&#13;&#10; &lt;ipType type=&quot;String&quot;&gt;IPv4&lt;/ipType&gt;&#13;&#10; &lt;ipAddress type=&quot;String&quot;&gt;{{ipcard2}}&lt;/ipAddress&gt;&#13;&#10; &lt;prefix type=&quot;Int&quot;&gt;16&lt;/prefix&gt;&#13;&#10; &lt;incrementBy type=&quot;String&quot;&gt;0.0.0.1&lt;/incrementBy&gt;&#13;&#10; &lt;count type=&quot;Int&quot;&gt;1&lt;/count&gt;&#13;&#10; &lt;autoCountEnabled type=&quot;Bool&quot;&gt;0&lt;/autoCountEnabled&gt;&#13;&#10; &lt;gatewayAddress type=&quot;String&quot;&gt;{{ipgw}}&lt;/gatewayAddress&gt;&#13;&#10; &lt;gatewayIncrement type=&quot;String&quot;&gt;0.0.0.0&lt;/gatewayIncrement&gt;&#13;&#10; &lt;gatewayIncrementMode type=&quot;String&quot;&gt;perSubnet&lt;/gatewayIncrementMode&gt;&#13;&#10; &lt;enableGatewayArp type=&quot;Bool&quot;&gt;0&lt;/enableGatewayArp&gt;&#13;&#10; &lt;generateStatistics type=&quot;Bool&quot;&gt;0&lt;/generateStatistics&gt;&#13;&#10; &lt;mss type=&quot;Int&quot;&gt;1410&lt;/mss&gt;&#13;&#10; &lt;randomizeAddress type=&quot;Bool&quot;&gt;0&lt;/randomizeAddress&gt;&#13;&#10; &lt;randomizeSeed type=&quot;Int&quot;&gt;3534372608&lt;/randomizeSeed&gt;&#13;&#10; &lt;autoMacGeneration type=&quot;Bool&quot;&gt;1&lt;/autoMacGeneration&gt;&#13;&#10; &lt;macRange type=&quot;Ixia.Aptixia.StackManager.MacRange&quot; objectid=&quot;aa73bd95-9ffb-411e-8ab3-8a128767aacb&quot; version=&quot;6.70.420&quot; /&gt;&#13;&#10; &lt;vlanRange type=&quot;Ixia.Aptixia.StackManager.VlanIdRange&quot; objectid=&quot;7024f4b3-1a75-491a-8da1-17a45a15d5cc&quot; version=&quot;6.70.420&quot; /&gt;&#13;&#10; &lt;atmRange type=&quot;Ixia.Aptixia.StackManager.AtmRange&quot; objectid=&quot;00000000-0000-0000-0000-000000000000&quot; /&gt;&#13;&#10; &lt;pvcRange type=&quot;Ixia.Aptixia.StackManager.PvcRange&quot; objectid=&quot;00000000-0000-0000-0000-000000000000&quot; /&gt;&#13;&#10; &lt;autoIpTypeEnabled type=&quot;Bool&quot;&gt;0&lt;/autoIpTypeEnabled&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;2&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.IpV4V6Range&gt;&#13;&#10; &lt;/rangeList&gt;&#13;&#10; &lt;rangeGroups type=&quot;ListNode&quot;&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.RangeGroup type=&quot;Ixia.Aptixia.StackManager.RangeGroup&quot; objectid=&quot;de9d629b-e0dc-41f5-99cb-5aa8a808ceee&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;name type=&quot;String&quot;&gt;DistGroup1&lt;/name&gt;&#13;&#10; &lt;distribType type=&quot;Ixia.Aptixia.StackManager.RangeGroupSkeleton+eDistributionType&quot;&gt;0&lt;/distribType&gt;&#13;&#10; &lt;rangeList type=&quot;ListNode&quot;&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.IpV4V6Range type=&quot;Ixia.Aptixia.StackManager.IpV4V6Range&quot; objectid=&quot;c69dae97-f1c2-4505-aedb-3f9ca3f4d02a&quot; version=&quot;6.70.420&quot; /&gt;&#13;&#10; &lt;/rangeList&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;2&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.RangeGroup&gt;&#13;&#10; &lt;/rangeGroups&gt;&#13;&#10; &lt;childrenList type=&quot;ListNode&quot; /&gt;&#13;&#10; &lt;extensionList type=&quot;ListNode&quot; /&gt;&#13;&#10; &lt;dscMode type=&quot;Bool&quot;&gt;0&lt;/dscMode&gt;&#13;&#10; &lt;name type=&quot;String&quot;&gt;IP-2&lt;/name&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;6&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.IpV4V6Plugin&gt;&#13;&#10; &lt;/childrenList&gt;&#13;&#10; &lt;extensionList type=&quot;ListNode&quot; /&gt;&#13;&#10; &lt;dscMode type=&quot;Bool&quot;&gt;0&lt;/dscMode&gt;&#13;&#10; &lt;name type=&quot;String&quot;&gt;MAC/VLAN-2&lt;/name&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;5&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.L2EthernetPlugin&gt;&#13;&#10; &lt;/childrenList&gt;&#13;&#10; &lt;extensionList type=&quot;ListNode&quot; /&gt;&#13;&#10; &lt;dscMode type=&quot;Bool&quot;&gt;0&lt;/dscMode&gt;&#13;&#10; &lt;name type=&quot;String&quot;&gt;Ethernet-2&lt;/name&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;4&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/stack&gt;&#13;&#10; &lt;globalPluginList type=&quot;ListNode&quot;&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.IxLoadSettingsPlugin type=&quot;Ixia.Aptixia.StackManager.IxLoadSettingsPlugin&quot; objectid=&quot;26685c48-95e7-4da5-a893-fc527b814b1c&quot; version=&quot;1.0.0&quot;&gt;&#13;&#10; &lt;teardownInterfaceWithUser type=&quot;Bool&quot;&gt;0&lt;/teardownInterfaceWithUser&gt;&#13;&#10; &lt;interfaceBehavior type=&quot;Int&quot;&gt;0&lt;/interfaceBehavior&gt;&#13;&#10; &lt;name type=&quot;String&quot;&gt;Settings-2&lt;/name&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;7&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.IxLoadSettingsPlugin&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.FilterPlugin type=&quot;Ixia.Aptixia.StackManager.FilterPlugin&quot; objectid=&quot;3f42c205-a9ad-433b-b7af-19ea7ec76940&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;auto type=&quot;Bool&quot;&gt;1&lt;/auto&gt;&#13;&#10; &lt;all type=&quot;Bool&quot;&gt;0&lt;/all&gt;&#13;&#10; &lt;pppoecontrol type=&quot;Bool&quot;&gt;0&lt;/pppoecontrol&gt;&#13;&#10; &lt;pppoenetwork type=&quot;Bool&quot;&gt;0&lt;/pppoenetwork&gt;&#13;&#10; &lt;isis type=&quot;Bool&quot;&gt;0&lt;/isis&gt;&#13;&#10; &lt;ip type=&quot;String&quot; /&gt;&#13;&#10; &lt;tcp type=&quot;String&quot; /&gt;&#13;&#10; &lt;udp type=&quot;String&quot; /&gt;&#13;&#10; &lt;mac type=&quot;String&quot; /&gt;&#13;&#10; &lt;icmp type=&quot;String&quot; /&gt;&#13;&#10; &lt;name type=&quot;String&quot;&gt;Filter-2&lt;/name&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;8&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.FilterPlugin&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.GratArpPlugin type=&quot;Ixia.Aptixia.StackManager.GratArpPlugin&quot; objectid=&quot;fe43b342-829b-4ff4-8671-49ba1c4441e5&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;enabled type=&quot;Bool&quot;&gt;1&lt;/enabled&gt;&#13;&#10; &lt;forwardGratArp type=&quot;Bool&quot;&gt;0&lt;/forwardGratArp&gt;&#13;&#10; &lt;rateControlEnabled type=&quot;Bool&quot;&gt;0&lt;/rateControlEnabled&gt;&#13;&#10; &lt;maxFramesPerSecond type=&quot;Int&quot;&gt;0&lt;/maxFramesPerSecond&gt;&#13;&#10; &lt;name type=&quot;String&quot;&gt;GratARP-2&lt;/name&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;9&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.GratArpPlugin&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.TCPPlugin type=&quot;Ixia.Aptixia.StackManager.TCPPlugin&quot; objectid=&quot;57601116-d86b-4c04-856b-2241507a0378&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;bestPerfSettings type=&quot;Bool&quot;&gt;0&lt;/bestPerfSettings&gt;&#13;&#10; &lt;accept_ra_all type=&quot;Bool&quot;&gt;0&lt;/accept_ra_all&gt;&#13;&#10; &lt;tcp_abort_on_overflow type=&quot;Bool&quot;&gt;0&lt;/tcp_abort_on_overflow&gt;&#13;&#10; &lt;tcp_adv_win_scale type=&quot;Int&quot;&gt;2&lt;/tcp_adv_win_scale&gt;&#13;&#10; &lt;tcp_app_win type=&quot;Int&quot;&gt;31&lt;/tcp_app_win&gt;&#13;&#10; &lt;tcp_bic type=&quot;Int&quot;&gt;0&lt;/tcp_bic&gt;&#13;&#10; &lt;tcp_bic_fast_convergence type=&quot;Int&quot;&gt;1&lt;/tcp_bic_fast_convergence&gt;&#13;&#10; &lt;tcp_bic_low_window type=&quot;Int&quot;&gt;14&lt;/tcp_bic_low_window&gt;&#13;&#10; &lt;tcp_dsack type=&quot;Bool&quot;&gt;1&lt;/tcp_dsack&gt;&#13;&#10; &lt;tcp_ecn type=&quot;Bool&quot;&gt;0&lt;/tcp_ecn&gt;&#13;&#10; &lt;tcp_fack type=&quot;Bool&quot;&gt;1&lt;/tcp_fack&gt;&#13;&#10; &lt;tcp_fin_timeout type=&quot;Int&quot;&gt;60&lt;/tcp_fin_timeout&gt;&#13;&#10; &lt;tcp_frto type=&quot;Int&quot;&gt;0&lt;/tcp_frto&gt;&#13;&#10; &lt;tcp_keepalive_intvl type=&quot;Int&quot;&gt;75&lt;/tcp_keepalive_intvl&gt;&#13;&#10; &lt;tcp_keepalive_probes type=&quot;Int&quot;&gt;9&lt;/tcp_keepalive_probes&gt;&#13;&#10; &lt;tcp_keepalive_time type=&quot;Int&quot;&gt;7200&lt;/tcp_keepalive_time&gt;&#13;&#10; &lt;tcp_low_latency type=&quot;Int&quot;&gt;0&lt;/tcp_low_latency&gt;&#13;&#10; &lt;tcp_max_orphans type=&quot;Int&quot;&gt;8192&lt;/tcp_max_orphans&gt;&#13;&#10; &lt;tcp_max_syn_backlog type=&quot;Int&quot;&gt;1024&lt;/tcp_max_syn_backlog&gt;&#13;&#10; &lt;tcp_max_tw_buckets type=&quot;Int&quot;&gt;180000&lt;/tcp_max_tw_buckets&gt;&#13;&#10; &lt;tcp_mem_low type=&quot;Int&quot;&gt;24576&lt;/tcp_mem_low&gt;&#13;&#10; &lt;tcp_mem_pressure type=&quot;Int&quot;&gt;32768&lt;/tcp_mem_pressure&gt;&#13;&#10; &lt;tcp_mem_high type=&quot;Int&quot;&gt;49152&lt;/tcp_mem_high&gt;&#13;&#10; &lt;tcp_moderate_rcvbuf type=&quot;Int&quot;&gt;0&lt;/tcp_moderate_rcvbuf&gt;&#13;&#10; &lt;tcp_no_metrics_save type=&quot;Bool&quot;&gt;0&lt;/tcp_no_metrics_save&gt;&#13;&#10; &lt;tcp_orphan_retries type=&quot;Int&quot;&gt;0&lt;/tcp_orphan_retries&gt;&#13;&#10; &lt;tcp_reordering type=&quot;Int&quot;&gt;3&lt;/tcp_reordering&gt;&#13;&#10; &lt;tcp_retrans_collapse type=&quot;Bool&quot;&gt;1&lt;/tcp_retrans_collapse&gt;&#13;&#10; &lt;tcp_retries1 type=&quot;Int&quot;&gt;3&lt;/tcp_retries1&gt;&#13;&#10; &lt;tcp_retries2 type=&quot;Int&quot;&gt;5&lt;/tcp_retries2&gt;&#13;&#10; &lt;tcp_rfc1337 type=&quot;Bool&quot;&gt;0&lt;/tcp_rfc1337&gt;&#13;&#10; &lt;tcp_rmem_min type=&quot;Int&quot;&gt;4096&lt;/tcp_rmem_min&gt;&#13;&#10; &lt;tcp_rmem_default type=&quot;Int&quot;&gt;4096&lt;/tcp_rmem_default&gt;&#13;&#10; &lt;tcp_rmem_max type=&quot;Int&quot;&gt;262144&lt;/tcp_rmem_max&gt;&#13;&#10; &lt;tcp_sack type=&quot;Bool&quot;&gt;1&lt;/tcp_sack&gt;&#13;&#10; &lt;tcp_stdurg type=&quot;Bool&quot;&gt;0&lt;/tcp_stdurg&gt;&#13;&#10; &lt;tcp_synack_retries type=&quot;Int&quot;&gt;5&lt;/tcp_synack_retries&gt;&#13;&#10; &lt;tcp_syn_retries type=&quot;Int&quot;&gt;5&lt;/tcp_syn_retries&gt;&#13;&#10; &lt;tcp_timestamps type=&quot;Bool&quot;&gt;1&lt;/tcp_timestamps&gt;&#13;&#10; &lt;tcp_tw_recycle type=&quot;Bool&quot;&gt;1&lt;/tcp_tw_recycle&gt;&#13;&#10; &lt;tcp_tw_reuse type=&quot;Bool&quot;&gt;0&lt;/tcp_tw_reuse&gt;&#13;&#10; &lt;tcp_vegas_alpha type=&quot;Int&quot;&gt;2&lt;/tcp_vegas_alpha&gt;&#13;&#10; &lt;tcp_vegas_beta type=&quot;Int&quot;&gt;6&lt;/tcp_vegas_beta&gt;&#13;&#10; &lt;tcp_vegas_cong_avoid type=&quot;Int&quot;&gt;0&lt;/tcp_vegas_cong_avoid&gt;&#13;&#10; &lt;tcp_vegas_gamma type=&quot;Int&quot;&gt;2&lt;/tcp_vegas_gamma&gt;&#13;&#10; &lt;tcp_westwood type=&quot;Int&quot;&gt;0&lt;/tcp_westwood&gt;&#13;&#10; &lt;tcp_window_scaling type=&quot;Bool&quot;&gt;0&lt;/tcp_window_scaling&gt;&#13;&#10; &lt;ip_no_pmtu_disc type=&quot;Bool&quot;&gt;1&lt;/ip_no_pmtu_disc&gt;&#13;&#10; &lt;tcp_wmem_min type=&quot;Int&quot;&gt;4096&lt;/tcp_wmem_min&gt;&#13;&#10; &lt;tcp_wmem_default type=&quot;Int&quot;&gt;4096&lt;/tcp_wmem_default&gt;&#13;&#10; &lt;tcp_wmem_max type=&quot;Int&quot;&gt;262144&lt;/tcp_wmem_max&gt;&#13;&#10; &lt;tcp_ipfrag_time type=&quot;Int&quot;&gt;30&lt;/tcp_ipfrag_time&gt;&#13;&#10; &lt;tcp_port_min type=&quot;Int&quot;&gt;1024&lt;/tcp_port_min&gt;&#13;&#10; &lt;tcp_port_max type=&quot;Int&quot;&gt;65535&lt;/tcp_port_max&gt;&#13;&#10; &lt;tcp_rto_min type=&quot;Int&quot;&gt;200&lt;/tcp_rto_min&gt;&#13;&#10; &lt;tcp_rto_max type=&quot;Int&quot;&gt;120000&lt;/tcp_rto_max&gt;&#13;&#10; &lt;tcp_tw_rfc1323_strict type=&quot;Bool&quot;&gt;0&lt;/tcp_tw_rfc1323_strict&gt;&#13;&#10; &lt;udp_port_randomization type=&quot;Bool&quot;&gt;0&lt;/udp_port_randomization&gt;&#13;&#10; &lt;disable_min_max_buffer_size type=&quot;Bool&quot;&gt;1&lt;/disable_min_max_buffer_size&gt;&#13;&#10; &lt;llm_hdr_gap type=&quot;Int&quot;&gt;8&lt;/llm_hdr_gap&gt;&#13;&#10; &lt;llm_hdr_gap_ns type=&quot;Int&quot;&gt;10&lt;/llm_hdr_gap_ns&gt;&#13;&#10; &lt;inter_packet_granular_delay type=&quot;Double&quot;&gt;0&lt;/inter_packet_granular_delay&gt;&#13;&#10; &lt;delayed_acks type=&quot;Bool&quot;&gt;1&lt;/delayed_acks&gt;&#13;&#10; &lt;accept_ra_default type=&quot;Bool&quot;&gt;0&lt;/accept_ra_default&gt;&#13;&#10; &lt;rps_needed type=&quot;Bool&quot;&gt;0&lt;/rps_needed&gt;&#13;&#10; &lt;delayed_acks_segments type=&quot;Int&quot;&gt;0&lt;/delayed_acks_segments&gt;&#13;&#10; &lt;delayed_acks_timeout type=&quot;Int&quot;&gt;0&lt;/delayed_acks_timeout&gt;&#13;&#10; &lt;tcp_large_icwnd type=&quot;Int&quot;&gt;0&lt;/tcp_large_icwnd&gt;&#13;&#10; &lt;tcp_mgmt_rmem type=&quot;Int&quot;&gt;87380&lt;/tcp_mgmt_rmem&gt;&#13;&#10; &lt;tcp_mgmt_wmem type=&quot;Int&quot;&gt;32768&lt;/tcp_mgmt_wmem&gt;&#13;&#10; &lt;adjust_tcp_buffers type=&quot;Bool&quot;&gt;1&lt;/adjust_tcp_buffers&gt;&#13;&#10; &lt;name type=&quot;String&quot;&gt;TCP-2&lt;/name&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;10&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.TCPPlugin&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.DnsPlugin type=&quot;Ixia.Aptixia.StackManager.DnsPlugin&quot; objectid=&quot;7682d113-cd50-4cc6-b23a-569c29f03886&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;domain type=&quot;String&quot; /&gt;&#13;&#10; &lt;timeout type=&quot;Int&quot;&gt;30&lt;/timeout&gt;&#13;&#10; &lt;nameServerList type=&quot;ListNode&quot; /&gt;&#13;&#10; &lt;searchList type=&quot;ListNode&quot; /&gt;&#13;&#10; &lt;hostList type=&quot;ListNode&quot; /&gt;&#13;&#10; &lt;name type=&quot;String&quot;&gt;DNS-2&lt;/name&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;12&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.DnsPlugin&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.MeshingPlugin type=&quot;Ixia.Aptixia.StackManager.MeshingPlugin&quot; objectid=&quot;f5f1e4c2-eef8-4a34-ac13-e1e3eeb5328b&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;trafficMaps type=&quot;ListNode&quot; /&gt;&#13;&#10; &lt;activityRangeMapInfoList type=&quot;ListNode&quot; /&gt;&#13;&#10; &lt;name type=&quot;String&quot;&gt;Meshing-2&lt;/name&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;13&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.MeshingPlugin&gt;&#13;&#10; &lt;/globalPluginList&gt;&#13;&#10; &lt;portList type=&quot;Ixia.RpFramework.Server.Core.ShadowedPropertyStringList&quot;&gt;&#13;&#10; &lt;String&gt;{{ipchassis}};2;1&lt;/String&gt;&#13;&#10; &lt;/portList&gt;&#13;&#10; &lt;typeSpecificData type=&quot;ListNode&quot;&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.IPSecPortGroupData type=&quot;Ixia.Aptixia.StackManager.IPSecPortGroupData&quot; objectid=&quot;c279f05c-d2a7-476d-b4af-9c8ff0d878dd&quot; version=&quot;6.70.0&quot;&gt;&#13;&#10; &lt;role type=&quot;String&quot;&gt;Initiator&lt;/role&gt;&#13;&#10; &lt;associates type=&quot;ListNode&quot; /&gt;&#13;&#10; &lt;overrideGlobalOptions type=&quot;Bool&quot;&gt;0&lt;/overrideGlobalOptions&gt;&#13;&#10; &lt;useMaxInitiationRate type=&quot;Bool&quot;&gt;0&lt;/useMaxInitiationRate&gt;&#13;&#10; &lt;maxInitiationRate type=&quot;Int&quot;&gt;50&lt;/maxInitiationRate&gt;&#13;&#10; &lt;useMaxPendingTunnels type=&quot;Bool&quot;&gt;0&lt;/useMaxPendingTunnels&gt;&#13;&#10; &lt;maxPendingTunnels type=&quot;Int&quot;&gt;50&lt;/maxPendingTunnels&gt;&#13;&#10; &lt;teardownRate type=&quot;Int&quot;&gt;10&lt;/teardownRate&gt;&#13;&#10; &lt;enableESPPerStreamStats type=&quot;Bool&quot;&gt;0&lt;/enableESPPerStreamStats&gt;&#13;&#10; &lt;enableESPReplayStats type=&quot;Bool&quot;&gt;0&lt;/enableESPReplayStats&gt;&#13;&#10; &lt;activities type=&quot;ListNode&quot; /&gt;&#13;&#10; &lt;pcpuLogLevel type=&quot;String&quot;&gt;0&lt;/pcpuLogLevel&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;2&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.IPSecPortGroupData&gt;&#13;&#10; &lt;/typeSpecificData&gt;&#13;&#10; &lt;virtualMode type=&quot;Bool&quot;&gt;0&lt;/virtualMode&gt;&#13;&#10; &lt;allowedVirtualModeTypes type=&quot;Ixia.RpFramework.Server.Core.ShadowedPropertyStringList&quot; /&gt;&#13;&#10; &lt;doOwnership type=&quot;Bool&quot;&gt;0&lt;/doOwnership&gt;&#13;&#10; &lt;branchToNicMap type=&quot;ListNode&quot; /&gt;&#13;&#10; &lt;cpuAggregation type=&quot;Bool&quot;&gt;0&lt;/cpuAggregation&gt;&#13;&#10; &lt;activePort type=&quot;String&quot; /&gt;&#13;&#10; &lt;networkLayersManager type=&quot;Ixia.Aptixia.StackManager.NetworkLayersManager&quot; objectid=&quot;d581a4e6-0e4b-4692-a0e2-12fd25d7db35&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;4&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/networkLayersManager&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;2&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.PortGroup&gt;&#13;&#10; &lt;/portGroupList&gt;&#13;&#10; &lt;externalProperties type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyManager&quot; objectid=&quot;0c7c98dd-4e41-4fb8-adb7-918848d0ba3e&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;properties type=&quot;ListNode&quot;&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;c7be9c3b-0335-4cf6-bbcb-d9a90d6b78a0&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;DHCPRange&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;d63defc3-039a-4af6-b0f6-19be5481d6bb&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;MobileSubscribersRange&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;d62b40dc-41c2-48b0-b3a6-4aa74e171a8c&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;DHCPServerRange&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;45eba56d-c42f-4bbf-830b-1f102bf83c92&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;EGTPUERange&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;a9e91079-1215-444b-a0a0-59f8ff4e7746&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;GTPGRange&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;b91778ea-dac5-499a-8c54-b8ba0c78b44b&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;EGTPRange_SGW&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;13f113b2-8ce8-4742-ac72-f8ee04caa5d6&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;GTPSUERange&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;f2723794-57ce-471c-b3ae-10cd5ee235a2&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;IpV4V6Range&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;3e8d5274-5483-41ca-8f4d-b1fce291dad1&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;PppoxRange&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;85b44e1f-0689-4feb-a14d-b43a1b837c1d&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;L2tpRange&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;c0383f23-e15f-4a97-bbf8-6ade8f6f2b0c&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;IxCatLTEUEUeRange&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;5912723b-fb9a-4e0a-bae4-38730c73cc0e&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;SixRdRange&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;9a6cb101-a624-4978-8d0c-85c5b6c26906&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;EGTPSgsnS3RangeUe&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;4f85b4a9-d55e-494e-beb6-5ef5b5d04cf8&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;EmulatedRouterRange&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;489dbc18-55b5-4902-99ab-9a289a8c2e2b&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;GTPNGAPRange&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;2992f902-204b-4050-8798-0b24ee090922&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;IxCatRNCIuPSUeRange&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;8b53f68d-6027-4150-9ca3-5a62606526bd&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;GTPNGUERange&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;e85d740f-87a2-473a-a133-e08d5bb48ed2&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;EGTPUERange_S5S8_SGW&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;5a179c3f-82db-44b3-95fc-6e4dbfe17556&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;EGTPPcrfRange_S5S8_PGW&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;55d890fe-0faa-41bd-9fca-12463fd14b3d&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;DSLiteRange&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;8dc83b0a-45a9-46b7-9b52-731eb114d315&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;EGTPSGSNRangeUe&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;a0883ed3-63b7-47cb-ab77-7ceebb8212e1&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;SlaacRange&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;7bb58c6e-377f-46be-a2b1-7d86997b2fa1&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;AtmRange&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;8a4c92be-449a-4f0e-bcf3-55fdfcc369cc&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;IxCatMMEApnRange&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;588aea0d-748b-4b82-9418-4f3a35185d2e&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;IxCatENodeBUuApnRange&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;9046358f-dde4-4f17-b596-5903079d3bcf&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;MacRange&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;a28df47f-783e-4bc9-aa22-78636ceaf1b7&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;DualStackIPRange&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;19deb9c9-8aef-41e2-8b8b-f01a8b274266&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;EGTPUERange_S2a_TWAN&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;6abb9650-bc55-4e9e-9dfc-81964310e662&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;IxCatSGSNIuPSApnRange&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;35dc8f8d-44fd-4c73-9771-6c62bd227435&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;IxCatENodeBSimUeRange&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;3c48b615-2c03-4c1b-8712-e83f63841d13&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;S6dRange&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;cd5080c1-8de4-4eb3-985a-3e9fe38ebed4&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;UERangeBase&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;24c2c3a6-f9fd-4b8e-bc9f-aeeac63bae01&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;EGTPMmeS10RangeUe&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;529a2786-eb8c-40cb-80b9-83415888012c&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;S6aRange&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;6593d153-2b87-4171-a8bf-8ae2b1907487&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;PptpRange&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;819a5c99-14bf-4efb-912a-5d2c985e97d1&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;BmScRange&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;83ff7bd6-95cf-4d75-91e4-3e2a9f5f6b7d&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;MBmsGwRange&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;022d8e72-36c8-4117-b901-baffb9d0805c&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;EGTPPMIPHostRange&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;/properties&gt;&#13;&#10; &lt;values type=&quot;ListNode&quot;&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalProperty type=&quot;Ixia.Aptixia.StackManager.ExternalProperty&quot; objectid=&quot;57badb9d-afb8-4c05-9182-df7469457e4c&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;target type=&quot;Ixia.Aptixia.StackManager.IpV4V6Range&quot; objectid=&quot;5affc0a7-68f6-46f6-b801-0e18e067a572&quot; version=&quot;6.70.420&quot; /&gt;&#13;&#10; &lt;value type=&quot;Ixia.Aptixia.StackManager.ExternalValueBoolean&quot; objectid=&quot;1efc6993-1480-469a-a6af-38b4093fb102&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;value type=&quot;Bool&quot;&gt;0&lt;/value&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;13&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/value&gt;&#13;&#10; &lt;enabled type=&quot;Bool&quot;&gt;1&lt;/enabled&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;13&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalProperty&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalProperty type=&quot;Ixia.Aptixia.StackManager.ExternalProperty&quot; objectid=&quot;22a742ae-d9bd-4548-83f1-84da6cc07c5f&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;target type=&quot;Ixia.Aptixia.StackManager.IpV4V6Range&quot; objectid=&quot;c69dae97-f1c2-4505-aedb-3f9ca3f4d02a&quot; version=&quot;6.70.420&quot; /&gt;&#13;&#10; &lt;value type=&quot;Ixia.Aptixia.StackManager.ExternalValueBoolean&quot; objectid=&quot;b664f3f9-4f42-48c1-a481-75ba76740055&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;value type=&quot;Bool&quot;&gt;0&lt;/value&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;2&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/value&gt;&#13;&#10; &lt;enabled type=&quot;Bool&quot;&gt;1&lt;/enabled&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;2&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalProperty&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalProperty type=&quot;Ixia.Aptixia.StackManager.ExternalProperty&quot; objectid=&quot;77dd061e-b592-4d9e-9c38-24a46fec1121&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;target type=&quot;Ixia.Aptixia.StackManager.MacRange&quot; objectid=&quot;aa73bd95-9ffb-411e-8ab3-8a128767aacb&quot; version=&quot;6.70.420&quot; /&gt;&#13;&#10; &lt;value type=&quot;Ixia.Aptixia.StackManager.ExternalValueBoolean&quot; objectid=&quot;b5f138be-a18b-46a3-b3f8-c90fa5711597&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;value type=&quot;Bool&quot;&gt;0&lt;/value&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;3&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/value&gt;&#13;&#10; &lt;enabled type=&quot;Bool&quot;&gt;0&lt;/enabled&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;3&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalProperty&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalProperty type=&quot;Ixia.Aptixia.StackManager.ExternalProperty&quot; objectid=&quot;6dc25ae2-da26-4df6-8a25-cf296dd9430b&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;target type=&quot;Ixia.Aptixia.StackManager.MacRange&quot; objectid=&quot;ba896971-1d78-4e03-8f2a-28c65417612e&quot; version=&quot;6.70.420&quot; /&gt;&#13;&#10; &lt;value type=&quot;Ixia.Aptixia.StackManager.ExternalValueBoolean&quot; objectid=&quot;0858fb9d-2304-44d4-b413-569815c8b6a7&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;value type=&quot;Bool&quot;&gt;0&lt;/value&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;4&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/value&gt;&#13;&#10; &lt;enabled type=&quot;Bool&quot;&gt;0&lt;/enabled&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;4&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalProperty&gt;&#13;&#10; &lt;/values&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;1&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/externalProperties&gt;&#13;&#10; &lt;availableNetworkTimelines type=&quot;ListNode&quot; /&gt;&#13;&#10; &lt;typeSpecificData type=&quot;ListNode&quot;&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.IxLoadSessionData type=&quot;Ixia.Aptixia.StackManager.IxLoadSessionData&quot; objectid=&quot;149d16d7-c594-4866-917f-fe1b44fac83f&quot; version=&quot;1.0.0&quot;&gt;&#13;&#10; &lt;portGroupList type=&quot;ListNode&quot;&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.PortGroup type=&quot;Ixia.Aptixia.StackManager.PortGroup&quot; objectid=&quot;b1fbd381-b769-4ec1-8715-299508ecb458&quot; version=&quot;6.70.420&quot; /&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.PortGroup type=&quot;Ixia.Aptixia.StackManager.PortGroup&quot; objectid=&quot;e7fa1f9e-23d9-4742-96b2-6edce6c4424e&quot; version=&quot;6.70.420&quot; /&gt;&#13;&#10; &lt;/portGroupList&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;1&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.IxLoadSessionData&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.MacSessionData type=&quot;Ixia.Aptixia.StackManager.MacSessionData&quot; objectid=&quot;7869d347-cce4-4cd3-9eed-88a3914ae956&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;duplicateCheckingScope type=&quot;Ixia.Aptixia.StackManager.MacSessionDataSkeleton+eMacValidationOptions&quot;&gt;2&lt;/duplicateCheckingScope&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;3&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.MacSessionData&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.IpSessionData type=&quot;Ixia.Aptixia.StackManager.IpSessionData&quot; objectid=&quot;93416b84-eb4a-4637-ab56-4a4de6250c3b&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;duplicateCheckingScope type=&quot;Ixia.Aptixia.StackManager.IpSessionDataSkeleton+eIpValidationOptions&quot;&gt;2&lt;/duplicateCheckingScope&gt;&#13;&#10; &lt;enableGatewayArp type=&quot;Bool&quot;&gt;0&lt;/enableGatewayArp&gt;&#13;&#10; &lt;gatewayArpRequestRate type=&quot;Int&quot;&gt;300&lt;/gatewayArpRequestRate&gt;&#13;&#10; &lt;maxOutstandingGatewayArpRequests type=&quot;Int&quot;&gt;300&lt;/maxOutstandingGatewayArpRequests&gt;&#13;&#10; &lt;ignoreUnresolvedIPs type=&quot;Bool&quot;&gt;0&lt;/ignoreUnresolvedIPs&gt;&#13;&#10; &lt;sendAllRequests type=&quot;Bool&quot;&gt;0&lt;/sendAllRequests&gt;&#13;&#10; &lt;individualARPTimeOut type=&quot;Int&quot;&gt;500&lt;/individualARPTimeOut&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;4&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.IpSessionData&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.IPSecSessionData type=&quot;Ixia.Aptixia.StackManager.IPSecSessionData&quot; objectid=&quot;8611fd36-7f8c-48bc-ac46-f6e2f0816cb5&quot; version=&quot;6.70.0&quot;&gt;&#13;&#10; &lt;ipsecTunnelSetup type=&quot;Ixia.Aptixia.StackManager.IPSecTunnelSetup&quot; objectid=&quot;e08e1671-e189-4cba-8894-5dda9b24701a&quot; version=&quot;6.70.0&quot;&gt;&#13;&#10; &lt;tunnelSetupTimeout type=&quot;Int&quot;&gt;30&lt;/tunnelSetupTimeout&gt;&#13;&#10; &lt;tunnelRetransmissionTimeout type=&quot;Int&quot;&gt;30&lt;/tunnelRetransmissionTimeout&gt;&#13;&#10; &lt;numRetries type=&quot;Int&quot;&gt;0&lt;/numRetries&gt;&#13;&#10; &lt;retryInterval type=&quot;Int&quot;&gt;10&lt;/retryInterval&gt;&#13;&#10; &lt;retryDelay type=&quot;Int&quot;&gt;10&lt;/retryDelay&gt;&#13;&#10; &lt;testType type=&quot;String&quot;&gt;P2D&lt;/testType&gt;&#13;&#10; &lt;logLevel type=&quot;String&quot;&gt;3&lt;/logLevel&gt;&#13;&#10; &lt;sendCiscoVid type=&quot;Bool&quot;&gt;0&lt;/sendCiscoVid&gt;&#13;&#10; &lt;useMaxInitiationRate type=&quot;Bool&quot;&gt;0&lt;/useMaxInitiationRate&gt;&#13;&#10; &lt;useMaxPendingTunnels type=&quot;Bool&quot;&gt;0&lt;/useMaxPendingTunnels&gt;&#13;&#10; &lt;enableRekey type=&quot;Bool&quot;&gt;1&lt;/enableRekey&gt;&#13;&#10; &lt;rekeyRetries type=&quot;Int&quot;&gt;3&lt;/rekeyRetries&gt;&#13;&#10; &lt;rekeyFuzzPercentage type=&quot;Int&quot;&gt;0&lt;/rekeyFuzzPercentage&gt;&#13;&#10; &lt;rekeyMargin type=&quot;Int&quot;&gt;10&lt;/rekeyMargin&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;7&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/ipsecTunnelSetup&gt;&#13;&#10; &lt;ipsecCertificates type=&quot;Ixia.Aptixia.StackManager.IPSecCertificates&quot; objectid=&quot;b53c8c74-6c81-4e4a-84cb-5beb05b38343&quot; version=&quot;6.70.0&quot;&gt;&#13;&#10; &lt;uniqueCert type=&quot;Bool&quot;&gt;0&lt;/uniqueCert&gt;&#13;&#10; &lt;certSource type=&quot;String&quot;&gt;kNewCert&lt;/certSource&gt;&#13;&#10; &lt;caURL type=&quot;String&quot; /&gt;&#13;&#10; &lt;caDN type=&quot;String&quot; /&gt;&#13;&#10; &lt;certSubjectDN type=&quot;String&quot; /&gt;&#13;&#10; &lt;certSubjectAltDN type=&quot;String&quot; /&gt;&#13;&#10; &lt;remoteIkeId type=&quot;String&quot; /&gt;&#13;&#10; &lt;bitSize type=&quot;String&quot;&gt;k512&lt;/bitSize&gt;&#13;&#10; &lt;saveCert type=&quot;Bool&quot;&gt;1&lt;/saveCert&gt;&#13;&#10; &lt;cacheCertFolder type=&quot;String&quot;&gt;C:\Program Files (x86)\Ixia\CachedCerts&lt;/cacheCertFolder&gt;&#13;&#10; &lt;certParentFolder type=&quot;String&quot;&gt;C:\Program Files (x86)\Ixia\CachedCerts&lt;/certParentFolder&gt;&#13;&#10; &lt;certNumber type=&quot;String&quot; /&gt;&#13;&#10; &lt;caCertNumber type=&quot;String&quot; /&gt;&#13;&#10; &lt;earlyExpDate type=&quot;String&quot; /&gt;&#13;&#10; &lt;lateExpDate type=&quot;String&quot; /&gt;&#13;&#10; &lt;usePerRangeCertNameExp type=&quot;Bool&quot;&gt;0&lt;/usePerRangeCertNameExp&gt;&#13;&#10; &lt;checkCrl type=&quot;Bool&quot;&gt;0&lt;/checkCrl&gt;&#13;&#10; &lt;crlOverrideEnable type=&quot;Bool&quot;&gt;0&lt;/crlOverrideEnable&gt;&#13;&#10; &lt;crlOverrideUrl type=&quot;String&quot; /&gt;&#13;&#10; &lt;checkOcsp type=&quot;Bool&quot;&gt;0&lt;/checkOcsp&gt;&#13;&#10; &lt;ocspOverrideEnable type=&quot;Bool&quot;&gt;0&lt;/ocspOverrideEnable&gt;&#13;&#10; &lt;ocspOverrideUrl type=&quot;String&quot; /&gt;&#13;&#10; &lt;unknownIsRevoked type=&quot;Bool&quot;&gt;0&lt;/unknownIsRevoked&gt;&#13;&#10; &lt;certProto type=&quot;String&quot;&gt;kSCEP&lt;/certProto&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;7&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/ipsecCertificates&gt;&#13;&#10; &lt;ipsecCertManager type=&quot;Ixia.Aptixia.StackManager.IPSecCertManager&quot; objectid=&quot;21591e4a-9e87-48e6-8679-68685c5c8383&quot; version=&quot;6.70.0&quot;&gt;&#13;&#10; &lt;caURL type=&quot;String&quot; /&gt;&#13;&#10; &lt;caDN type=&quot;String&quot;&gt;CN=RootCA,C=RO,L=Bucharest,O=Ixia,OU=IxLoad,IP:201.121.87.2,email:ixia@ixiacom.com&lt;/caDN&gt;&#13;&#10; &lt;certSubjectDN type=&quot;String&quot;&gt;CN=IxiaVPN,C=RO,L=Bucharest,O=Ixia&lt;/certSubjectDN&gt;&#13;&#10; &lt;keyGenAlgo type=&quot;String&quot;&gt;kRSA_512&lt;/keyGenAlgo&gt;&#13;&#10; &lt;cacheCertFolder type=&quot;String&quot;&gt;C:\Program Files (x86)\Ixia\CachedCerts&lt;/cacheCertFolder&gt;&#13;&#10; &lt;caKeyFile type=&quot;String&quot;&gt;C:\Program Files (x86)\Ixia\ca-priv.key&lt;/caKeyFile&gt;&#13;&#10; &lt;caCrtFile type=&quot;String&quot;&gt;C:\Program Files (x86)\Ixia\ca-cert.crt&lt;/caCrtFile&gt;&#13;&#10; &lt;certNumber type=&quot;Int&quot;&gt;1&lt;/certNumber&gt;&#13;&#10; &lt;certProto type=&quot;String&quot;&gt;kSCEP&lt;/certProto&gt;&#13;&#10; &lt;createRootCA type=&quot;Bool&quot;&gt;0&lt;/createRootCA&gt;&#13;&#10; &lt;uniqueCert type=&quot;Bool&quot;&gt;0&lt;/uniqueCert&gt;&#13;&#10; &lt;descFilePath type=&quot;String&quot;&gt;C:\Program Files (x86)\Ixia\CachedCerts\sample.desc&lt;/descFilePath&gt;&#13;&#10; &lt;useDescFile type=&quot;Bool&quot;&gt;0&lt;/useDescFile&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;6&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/ipsecCertManager&gt;&#13;&#10; &lt;eapSimTuples type=&quot;ListNode&quot; /&gt;&#13;&#10; &lt;eapAkaTuples type=&quot;ListNode&quot; /&gt;&#13;&#10; &lt;maxInitiationRate type=&quot;Int&quot;&gt;50&lt;/maxInitiationRate&gt;&#13;&#10; &lt;maxPendingTunnels type=&quot;Int&quot;&gt;50&lt;/maxPendingTunnels&gt;&#13;&#10; &lt;negotiationStartDelay type=&quot;Int&quot;&gt;0&lt;/negotiationStartDelay&gt;&#13;&#10; &lt;teardownRate type=&quot;Int&quot;&gt;10&lt;/teardownRate&gt;&#13;&#10; &lt;burstInitiation type=&quot;Bool&quot;&gt;0&lt;/burstInitiation&gt;&#13;&#10; &lt;parallelInitiation type=&quot;Bool&quot;&gt;0&lt;/parallelInitiation&gt;&#13;&#10; &lt;enableWildcardTsi type=&quot;Bool&quot;&gt;0&lt;/enableWildcardTsi&gt;&#13;&#10; &lt;enableWildcardTsr type=&quot;Bool&quot;&gt;0&lt;/enableWildcardTsr&gt;&#13;&#10; &lt;enablePlutoWildcardTsi type=&quot;Bool&quot;&gt;0&lt;/enablePlutoWildcardTsi&gt;&#13;&#10; &lt;enablePlutoModeCfgWildcardTsr type=&quot;Bool&quot;&gt;1&lt;/enablePlutoModeCfgWildcardTsr&gt;&#13;&#10; &lt;enablePlutoS2SWildcardTsr type=&quot;Bool&quot;&gt;0&lt;/enablePlutoS2SWildcardTsr&gt;&#13;&#10; &lt;payloadAttrTypes type=&quot;ListNode&quot; /&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;3&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.IPSecSessionData&gt;&#13;&#10; &lt;/typeSpecificData&gt;&#13;&#10; &lt;statViewManager type=&quot;Ixia.Aptixia.StackManager.StatViewManager&quot; objectid=&quot;32b6a125-39ad-4da3-9710-e09cc94bf306&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;enableStats type=&quot;Bool&quot;&gt;1&lt;/enableStats&gt;&#13;&#10; &lt;enableOverviewStats type=&quot;Bool&quot;&gt;1&lt;/enableOverviewStats&gt;&#13;&#10; &lt;enablePerSessionStats type=&quot;Bool&quot;&gt;1&lt;/enablePerSessionStats&gt;&#13;&#10; &lt;/statViewManager&gt;&#13;&#10; &lt;waitForLinkUp type=&quot;Bool&quot;&gt;0&lt;/waitForLinkUp&gt;&#13;&#10; &lt;overloadProtection type=&quot;Bool&quot;&gt;1&lt;/overloadProtection&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;1&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.SMSession&gt;&#13;&#10;&lt;/rpf&gt;</xml>
- </_smSessionXml>
- <_composerConfig ver="[0, [1, [0, [0]]]]" type="ixComposerConfig">
- <xml type="str"></xml>
- </_composerConfig>
- <_quickTestConfig ver="[0, [1, [0, [0]]]]" type="ixQuickTestConfig">
- <xml type="str"></xml>
- </_quickTestConfig>
- <lastApiUniqueId type="int">17217</lastApiUniqueId>
- <version type="str">8.30.0.161</version>
- <name type="str">REG_CALL_OPNFV_ORANGE_v13.rxf</name>
- <comment type="str"></comment>
- <path type="str">C:\Users\asordo\Documents\__Customers\Orange\OPNFV2_Lannion</path>
- <last type="str">REG_CALL_OPNFV_ORANGE_v9j.rxf</last>
- <activeTest type="str">Test1</activeTest>
- <chassisChain ver="[2, [1, [0, [0]]]]" oid="6" type="ixChassisChain">
- <chassisList ver="[0, [3, [0, [0, [0], [0]], [0]]]]" type="ixChassisSequenceContainer" itemtype="ixChassis">
- <item ver="[1, [1, [0, [0]]]]" oid="0" type="ixChassis">
- <name type="str">{{ipchassis}}</name>
- <id type="int">1</id>
- <hiddenCards type="NoneType">None</hiddenCards>
- </item>
- </chassisList>
- <_apiUniqueId type="int">15685</_apiUniqueId>
- <chassisMap type="dict">
- <item>
- <key type="int">1</key>
- <value ref="0"/>
- </item>
- </chassisMap>
- <hiddenChassis type="str"></hiddenChassis>
- </chassisChain>
- <AfmPortPacketRewriteConfigList ver="[0, [3, [0, [0, [0], [0]], [0]]]]" type="ixAfmPortPacketRewriteConfigList" itemtype="ixAfmPortPacketRewriteConfig"/>
- <networkList ver="[0, [0, [1, [0, [3, [0, [0, [0], [0]], [0]]]]]]]" type="ixRepositoryNetworkList" itemtype="ixNullNetwork"/>
- <dutList ver="[0, [0, [1, [0, [3, [0, [0, [0], [0]], [0]]]]]]]" type="ixDutList" itemtype="ixDut"/>
- <trafficList ver="[0, [0, [1, [0, [3, [0, [0, [0], [0]], [0]]]]]]]" type="ixTrafficList" itemtype="ixActivityModel"/>
- <testList ver="[0, [0, [1, [0, [3, [0, [0, [0], [0]], [0]]]]]]]" type="ixTestList" itemtype="ixTestEnvelope">
- <item ver="[18, [1, [0, [0]]]]" type="ixTestEnvelope">
- <name type="str">Test1</name>
- <comment type="str"></comment>
- <enableForceOwnership type="bool">True</enableForceOwnership>
- <enableResetPorts type="bool">False</enableResetPorts>
- <statsRequired type="bool">True</statsRequired>
- <enableConditionalView type="bool">False</enableConditionalView>
- <conditionalViewType type="int">1</conditionalViewType>
- <conditionalViewList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="ixConditionalViewList" itemtype="ixConditionalView"/>
- <enableReleaseConfigAfterRun type="bool">False</enableReleaseConfigAfterRun>
- <csvInterval type="int">4</csvInterval>
- <networkFailureThreshold type="int">0</networkFailureThreshold>
- <captureViewOptions ver="[1, [1, [0, [0]]]]" oid="12" type="ixViewOptions">
- <runMode type="int">1</runMode>
- <collectScheme type="int">0</collectScheme>
- <allocatedBufferMemoryPercentage type="long">30</allocatedBufferMemoryPercentage>
- <captureRunAfter type="int">0</captureRunAfter>
- <captureRunDuration type="int">0</captureRunDuration>
- <_apiUniqueId type="int">15467</_apiUniqueId>
- </captureViewOptions>
- <scenarioList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="ixScenarioList" itemtype="ixScenario">
- <item ver="[3, [1, [0, [0]]]]" type="ixScenario">
- <name type="str">New Traffic Flow</name>
- <columnList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="ixTrafficColumnList" itemtype="ixTrafficColumn">
- <item ver="[0, [1, [0, [0]]]]" type="ixTrafficColumn">
- <name type="str">Originate</name>
- <elementList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="ixScenarioElementList" itemtype="ixScenarioElement">
- <item ver="[1, [23, [0, [1, [0, [0]]]]]]" oid="5" type="ixNetTraffic">
- <name type="str">VoIP1@VM1</name>
- <column type="NoneType">None</column>
- <scenarioElementType type="str">netTraffic</scenarioElementType>
- <enable type="bool">True</enable>
- <role type="str">Peer</role>
- <networkType type="str">ethernet</networkType>
- <activityFunction type="str">ipTrafficAgent</activityFunction>
- <activeRole type="str">Both</activeRole>
- <networkActivityList ver="[0, [0, [0, [3, [0, [0, [0], [0]], [0]]]]]]" type="ixNetworkActivityList" itemtype="ixNetworkActivity"/>
- <activityGroupList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="ixActivityGroupList" itemtype="ixActivityGroup"/>
- <traffic ver="[0, [6, [1, [0, [0]]]]]" type="ixTraffic">
- <resourceSyncTimeStamp type="NoneType">None</resourceSyncTimeStamp>
- <name type="str">VoIP1</name>
- <role type="str">Peer</role>
- <activityFunction type="str">ipTrafficAgent</activityFunction>
- <payload type="NoneType">None</payload>
- <agentList ver="[2, [0, [0, [3, [0, [0, [0], [0]], [0]]]]]]" type="_agentListSequenceContainer" itemtype="ixAgent">
- <item ver="[34, [1, [0, [6, [1, [0, [0]]]], [0, [0]]], [0]]]" oid="18" type="#VoIP_Peer_plugin$Plugin">
- <enable type="bool">True</enable>
- <name type="str">REGISTERING</name>
- <activityFunction type="NoneType">None</activityFunction>
- <needToRefreshStatViews type="bool">False</needToRefreshStatViews>
- <activeRole type="str">Both</activeRole>
- <cmdListLoops type="int">0</cmdListLoops>
- <sources ver="[0, [3, [0, [0, [0], [0]], [0]]]]" type="ixSourceList" itemtype="ixSource"/>
- <destinations ver="[1, [3, [0, [0, [0], [0]], [0]]]]" type="ixDestinationList" itemtype="ixDestination"/>
- <flowPercentage type="float">100.0</flowPercentage>
- <uniqueID type="int">27</uniqueID>
- <pm ver="[0, [1, [0.1, [1, [0, [0]]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyMap_VoIP">
- <szPluginVersion type="str">4.10</szPluginVersion>
- <ceCommands ver="[1, [0, [0, [3, [0, [0, [0], [0]], [0]]]], [0, [0, [3, [0, [0, [0], [0]], [0]]]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_VoIP_ceCommands" itemtype="ixConfig">
- <item ver="[0, [0, [0, [0.1, [1, [0, [0]]]], [0, [1, [0, [0]]]]], [0, [0, [1, [0, [0]]]]]], [0, [0, [0, [0, [1, [0, [0]]]]]]]]" type="#Pdk.ixPdkCommands$ixPropertyCommandStart">
- <commandId type="int">-2</commandId>
- <commandType type="str">START</commandType>
- <cmdName type="str">Start</cmdName>
- <outputList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="ixCommandOutputList" itemtype="ixCommandOutput">
- <item ver="[1, [1, [0, [0]]]]" type="ixCommandOutput">
- <name type="str">Output1</name>
- <outputType type="int">0</outputType>
- <destCmdId type="int">2</destCmdId>
- <objectID type="int">0</objectID>
- <destinationCommandIdx type="int">2</destinationCommandIdx>
- </item>
- </outputList>
- </item>
- <item ver="[0, [0, [0, [0.1, [1, [0, [0]]]], [0, [1, [0, [0]]]]], [0, [0, [1, [0, [0]]]]]], [0, [0, [0, [0, [1, [0, [0]]]]]]]]" type="#Pdk.ixPdkCommands$ixPropertyCommandStop">
- <commandId type="int">-3</commandId>
- <commandType type="str">STOP</commandType>
- <cmdName type="str">Stop</cmdName>
- <outputList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="ixCommandOutputList" itemtype="ixCommandOutput"/>
- </item>
- <item ver="[0, [0, [0, [0.1, [1, [0, [0]]]], [0, [1, [0, [0]]]]], [0, [0, [1, [0, [0]]]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_Procedure">
- <commandId type="int">2</commandId>
- <commandType type="str">Procedure</commandType>
- <cmdName type="str">Register Complete (#4)</cmdName>
- <outputList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="ixCommandOutputList" itemtype="ixCommandOutput">
- <item ver="[1, [1, [0, [0]]]]" type="ixCommandOutput">
- <name type="str">OK</name>
- <outputType type="int">0</outputType>
- <destCmdId type="int">47</destCmdId>
- <objectID type="int">1</objectID>
- <destinationCommandIdx type="int">3</destinationCommandIdx>
- </item>
- </outputList>
- </item>
- <item ver="[0, [1, [0, [0, [0.1, [1, [0, [0]]]], [0, [1, [0, [0]]]]], [0, [0, [1, [0, [0]]]]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CommandEx">
- <commandId type="int">47</commandId>
- <commandType type="str">CommandEx</commandType>
- <cmdName type="str">Sleep (#2)</cmdName>
- <outputList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="ixCommandOutputList" itemtype="ixCommandOutput">
- <item ver="[1, [1, [0, [0]]]]" type="ixCommandOutput">
- <name type="str">OK</name>
- <outputType type="int">0</outputType>
- <destCmdId type="int">-3</destCmdId>
- <objectID type="int">1</objectID>
- <destinationCommandIdx type="int">1</destinationCommandIdx>
- </item>
- </outputList>
- <cmdType type="str">FlowSleep</cmdType>
- </item>
- </ceCommands>
- <activityLink ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_ActivityLinkInfo">
- <name type="str">&lt;None&gt;</name>
- <activitiesCount type="int">1</activitiesCount>
- </activityLink>
- <triggers ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TriggerConfig">
- <triggersInCount type="int">0</triggersInCount>
- <triggersOutCount type="int">0</triggersOutCount>
- </triggers>
- <globalSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_GlobalSettings">
- <globalExecStg ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_GlobalExecSettings">
- <setAborted type="bool">False</setAborted>
- <setAllFailed type="bool">False</setAllFailed>
- <trigTimeout type="int">600000</trigTimeout>
- <notAbortOnTimeout type="bool">False</notAbortOnTimeout>
- <limitErrors type="bool">False</limitErrors>
- <maxErrors type="int">1</maxErrors>
- <limitArrayVarSize type="bool">False</limitArrayVarSize>
- <maxArrayVarSize type="int">10</maxArrayVarSize>
- </globalExecStg>
- <globalSIPStg ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_GlobalSIPSettings">
- <disableTCP type="bool">False</disableTCP>
- <prefQOP type="int">0</prefQOP>
- <warnAsError type="bool">False</warnAsError>
- <limitQueueSize type="bool">True</limitQueueSize>
- <maxChannelsInQueue type="int">25</maxChannelsInQueue>
- <enableSIPLogging type="bool">False</enableSIPLogging>
- <limitSIPLoggingChannels type="bool">False</limitSIPLoggingChannels>
- <maxSIPLoggingChannels type="int">10</maxSIPLoggingChannels>
- <minSIPLoggingChannels type="int">0</minSIPLoggingChannels>
- <voipPeerLogSettings type="int">0</voipPeerLogSettings>
- <voipPeerLogExpForChannels type="str"></voipPeerLogExpForChannels>
- <abortLoopOnTriggerTimeout type="bool">False</abortLoopOnTriggerTimeout>
- </globalSIPStg>
- <globalRTPStg ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_GlobalRTPSettings">
- <transmMode type="int">0</transmMode>
- <playMode type="int">0</playMode>
- <repeatCount type="int">1</repeatCount>
- <repeatTime type="int">1000</repeatTime>
- <timeUnit type="int">0</timeUnit>
- <volume type="int">-20</volume>
- <playModePathConf type="int">0</playModePathConf>
- <repeatCountPathConf type="int">0</repeatCountPathConf>
- <repeatTimePathConf type="int">10</repeatTimePathConf>
- <timeUnitPathConf type="int">0</timeUnitPathConf>
- <toneDurationPathConf type="int">200</toneDurationPathConf>
- <interToneDelayPathConf type="int">200</interToneDelayPathConf>
- <toneAmplitudePathConf type="int">-10</toneAmplitudePathConf>
- <firstToneTimeoutPathConf type="int">4000</firstToneTimeoutPathConf>
- <interToneTimeoutPathConf type="int">2000</interToneTimeoutPathConf>
- <qovTalkExtraSilence type="int">500</qovTalkExtraSilence>
- <qovListenExtraDuration type="int">2000</qovListenExtraDuration>
- <downloadRTPCSV type="bool">True</downloadRTPCSV>
- <waitQoVScore type="bool">False</waitQoVScore>
- </globalRTPStg>
- <globalSTUNStg ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_GlobalSTUNSettings">
- <keepAliveInterval type="int">15</keepAliveInterval>
- </globalSTUNStg>
- <globalSKINNYStg ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_GlobalSKINNYSettings">
- <softKeyCount type="int">25</softKeyCount>
- <receiveVideo type="bool">False</receiveVideo>
- <transmitVideo type="bool">False</transmitVideo>
- </globalSKINNYStg>
- <globalT38Stg ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_GlobalT38Settings">
- <t30Log type="bool">False</t30Log>
- <t38Log type="bool">False</t38Log>
- <receivedImageLog type="bool">False</receivedImageLog>
- <logType type="int">0</logType>
- <logBegin type="int">1</logBegin>
- <logEnd type="int">10</logEnd>
- <channelRange type="str">[00-10]</channelRange>
- </globalT38Stg>
- </globalSettings>
- <info ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_Info">
- <userChannelsNo type="int">86534</userChannelsNo>
- <portInstances type="int">3</portInstances>
- <portInstanceIdx type="int">0</portInstanceIdx>
- <objectiveType type="str">activeUsers</objectiveType>
- <objectiveValue type="int">1000</objectiveValue>
- <maxAllowedObjective type="long">9223372036854775807</maxAllowedObjective>
- <firstSignalingFnID type="int">23</firstSignalingFnID>
- <enableRTPDest type="bool">False</enableRTPDest>
- <rtpPortDest type="str"></rtpPortDest>
- <rtpObjectiveValue type="int">32000</rtpObjectiveValue>
- <hasRtpFunction type="bool">False</hasRtpFunction>
- <hasVideoFunction type="bool">False</hasVideoFunction>
- <hasT38Function type="bool">False</hasT38Function>
- <hasMSRPFunction type="bool">False</hasMSRPFunction>
- <src ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_ActivityInfo">
- <name type="str">REGISTERING</name>
- <portCount type="int">1</portCount>
- <portCountRtp type="int">1</portCountRtp>
- <portCountT38 type="int">1</portCountT38>
- <portCountMSRP type="int">1</portCountMSRP>
- <ipRangeCount type="int">1</ipRangeCount>
- <ipCount type="int">1</ipCount>
- <ipRule type="int">0</ipRule>
- <ipRuleCh type="int">1</ipRuleCh>
- <port type="str">{{sipportregistering}}</port>
- <portRule type="int">0</portRule>
- <portRuleCh type="int">1</portRuleCh>
- <phone type="str">{{pnregistering}}</phone>
- <aliases type="int">1</aliases>
- <phoneType type="int">0</phoneType>
- <phoneRule type="int">1</phoneRule>
- <phoneCount type="int">0</phoneCount>
- <telPar type="str"></telPar>
- <ipRangeCountRtp type="int">1</ipRangeCountRtp>
- <ipCountRtp type="int">1</ipCountRtp>
- <ipRuleRtp type="int">0</ipRuleRtp>
- <ipRuleChRtp type="int">1</ipRuleChRtp>
- <portRtp type="str">[10000-65535,4]</portRtp>
- <portT38 type="str">40000</portT38>
- <portMSRP type="str">2855</portMSRP>
- <portRuleRtp type="int">0</portRuleRtp>
- <portRuleChRtp type="int">1</portRuleChRtp>
- <ipRangeCountT38 type="int">1</ipRangeCountT38>
- <ipCountT38 type="int">1</ipCountT38>
- <ipRangeCountMSRP type="int">1</ipRangeCountMSRP>
- <ipCountMSRP type="int">1</ipCountMSRP>
- <symType type="int">1</symType>
- <enableTLS type="bool">False</enableTLS>
- <enableDTLS type="bool">False</enableDTLS>
- <enableTLS_MSRP type="bool">False</enableTLS_MSRP>
- <enableTLS_HTTP type="bool">False</enableTLS_HTTP>
- <tlsPort type="str">5061</tlsPort>
- <tlsDisableUdpAndTcp type="bool">True</tlsDisableUdpAndTcp>
- <nodeCount type="int">1</nodeCount>
- <coreCount type="int">2</coreCount>
- <nicCount type="int">1</nicCount>
- <gtpEnabled type="bool">False</gtpEnabled>
- <dcpEnabled type="bool">False</dcpEnabled>
- <rangeType type="int">0</rangeType>
- <calActivityID type="int">0</calActivityID>
- <layerName type="str">aptixia-T.03440c56.4e1a.4def.8406.ec64db91d4c1-L2EthernetPlugin-166a11b6.4d30.40ea.b9e1.ac4fb44f112b-161.105.231.12;1;1default</layerName>
- </src>
- <dest ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_ActivityInfo">
- <name type="str"></name>
- <portCount type="int">1</portCount>
- <portCountRtp type="int">1</portCountRtp>
- <portCountT38 type="int">1</portCountT38>
- <portCountMSRP type="int">1</portCountMSRP>
- <ipRangeCount type="int">0</ipRangeCount>
- <ipCount type="int">0</ipCount>
- <ipRule type="int">0</ipRule>
- <ipRuleCh type="int">0</ipRuleCh>
- <port type="str"></port>
- <portRule type="int">0</portRule>
- <portRuleCh type="int">0</portRuleCh>
- <phone type="str"></phone>
- <aliases type="int">1</aliases>
- <phoneType type="int">0</phoneType>
- <phoneRule type="int">0</phoneRule>
- <phoneCount type="int">0</phoneCount>
- <telPar type="str"></telPar>
- <ipRangeCountRtp type="int">0</ipRangeCountRtp>
- <ipCountRtp type="int">0</ipCountRtp>
- <ipRuleRtp type="int">0</ipRuleRtp>
- <ipRuleChRtp type="int">0</ipRuleChRtp>
- <portRtp type="str"></portRtp>
- <portT38 type="str"></portT38>
- <portMSRP type="str">2855</portMSRP>
- <portRuleRtp type="int">0</portRuleRtp>
- <portRuleChRtp type="int">0</portRuleChRtp>
- <ipRangeCountT38 type="int">0</ipRangeCountT38>
- <ipCountT38 type="int">0</ipCountT38>
- <ipRangeCountMSRP type="int">1</ipRangeCountMSRP>
- <ipCountMSRP type="int">12</ipCountMSRP>
- <symType type="int">0</symType>
- <enableTLS type="bool">False</enableTLS>
- <enableDTLS type="bool">False</enableDTLS>
- <enableTLS_MSRP type="bool">False</enableTLS_MSRP>
- <enableTLS_HTTP type="bool">False</enableTLS_HTTP>
- <tlsPort type="str"></tlsPort>
- <tlsDisableUdpAndTcp type="bool">False</tlsDisableUdpAndTcp>
- <nodeCount type="int">1</nodeCount>
- <coreCount type="int">2</coreCount>
- <nicCount type="int">1</nicCount>
- <gtpEnabled type="bool">False</gtpEnabled>
- <dcpEnabled type="bool">False</dcpEnabled>
- <rangeType type="int">0</rangeType>
- <calActivityID type="int">0</calActivityID>
- <layerName type="str"></layerName>
- </dest>
- <useServerDest type="bool">False</useServerDest>
- <srvDomainDest type="str"></srvDomainDest>
- <srvAddrDest type="str"></srvAddrDest>
- <srvPortDest type="str">5060</srvPortDest>
- <cloudServerDest ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CloudServer">
- <name type="str"></name>
- <ipAddr type="str"></ipAddr>
- <rangeType type="str"></rangeType>
- <ipType type="str"></ipType>
- <port type="int">0</port>
- <attachedInfo type="str"></attachedInfo>
- <firstIp type="str"></firstIp>
- <netMask type="str"></netMask>
- <ipCount type="str"></ipCount>
- <ipStep type="str"></ipStep>
- </cloudServerDest>
- <transfer ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_ActivityInfo">
- <name type="str"></name>
- <portCount type="int">0</portCount>
- <portCountRtp type="int">0</portCountRtp>
- <portCountT38 type="int">0</portCountT38>
- <portCountMSRP type="int">0</portCountMSRP>
- <ipRangeCount type="int">0</ipRangeCount>
- <ipCount type="int">0</ipCount>
- <ipRule type="int">0</ipRule>
- <ipRuleCh type="int">0</ipRuleCh>
- <port type="str"></port>
- <portRule type="int">0</portRule>
- <portRuleCh type="int">0</portRuleCh>
- <phone type="str"></phone>
- <aliases type="int">0</aliases>
- <phoneType type="int">0</phoneType>
- <phoneRule type="int">0</phoneRule>
- <phoneCount type="int">0</phoneCount>
- <telPar type="str"></telPar>
- <ipRangeCountRtp type="int">0</ipRangeCountRtp>
- <ipCountRtp type="int">0</ipCountRtp>
- <ipRuleRtp type="int">0</ipRuleRtp>
- <ipRuleChRtp type="int">0</ipRuleChRtp>
- <portRtp type="str"></portRtp>
- <portT38 type="str"></portT38>
- <portMSRP type="str"></portMSRP>
- <portRuleRtp type="int">0</portRuleRtp>
- <portRuleChRtp type="int">0</portRuleChRtp>
- <ipRangeCountT38 type="int">0</ipRangeCountT38>
- <ipCountT38 type="int">0</ipCountT38>
- <ipRangeCountMSRP type="int">0</ipRangeCountMSRP>
- <ipCountMSRP type="int">0</ipCountMSRP>
- <symType type="int">0</symType>
- <enableTLS type="bool">False</enableTLS>
- <enableDTLS type="bool">False</enableDTLS>
- <enableTLS_MSRP type="bool">False</enableTLS_MSRP>
- <enableTLS_HTTP type="bool">False</enableTLS_HTTP>
- <tlsPort type="str"></tlsPort>
- <tlsDisableUdpAndTcp type="bool">False</tlsDisableUdpAndTcp>
- <nodeCount type="int">0</nodeCount>
- <coreCount type="int">1</coreCount>
- <nicCount type="int">1</nicCount>
- <gtpEnabled type="bool">False</gtpEnabled>
- <dcpEnabled type="bool">False</dcpEnabled>
- <rangeType type="int">0</rangeType>
- <calActivityID type="int">0</calActivityID>
- <layerName type="str"></layerName>
- </transfer>
- <useServerTransfer type="bool">False</useServerTransfer>
- <registrarSrvTransfer type="bool">False</registrarSrvTransfer>
- <srvAddrTransfer type="str"></srvAddrTransfer>
- <srvPortTransfer type="str">5060</srvPortTransfer>
- <cloudServerTransfer ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CloudServer">
- <name type="str"></name>
- <ipAddr type="str"></ipAddr>
- <rangeType type="str"></rangeType>
- <ipType type="str"></ipType>
- <port type="int">0</port>
- <attachedInfo type="str"></attachedInfo>
- <firstIp type="str"></firstIp>
- <netMask type="str"></netMask>
- <ipCount type="str"></ipCount>
- <ipStep type="str"></ipStep>
- </cloudServerTransfer>
- </info>
- <scenarioSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_ScenarioSettings">
- <scenarioFile type="str">.\Registration_only_LPS.tst</scenarioFile>
- <activeScenarioChannel type="int">0</activeScenarioChannel>
- <funcsCount type="int">48</funcsCount>
- <isModified type="int">66</isModified>
- <activityID type="int">2</activityID>
- <exportToRM type="int">0</exportToRM>
- </scenarioSettings>
- <executionSettings ver="[1, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_ExecutionSettings">
- <loopMode type="int">0</loopMode>
- <loopCount type="int">1</loopCount>
- <loopPreDelay type="int">0</loopPreDelay>
- <loopMidDelay type="int">0</loopMidDelay>
- <gracefulRampDown type="bool">True</gracefulRampDown>
- <rampdownSleep type="bool">False</rampdownSleep>
- <aliases type="int">1</aliases>
- <ipRule type="int">0</ipRule>
- <ipRuleCh type="int">1</ipRuleCh>
- <portRule type="int">0</portRule>
- <portRuleCh type="int">1</portRuleCh>
- <phoneRule type="int">1</phoneRule>
- <multipleUsersPerIO type="bool">True</multipleUsersPerIO>
- <rtpIpRule type="int">0</rtpIpRule>
- <rtpIpRuleCh type="int">1</rtpIpRuleCh>
- <rtpPortRule type="int">0</rtpPortRule>
- <rtpPortRuleCh type="int">1</rtpPortRuleCh>
- <dl_BUG type="bool">True</dl_BUG>
- <dl_TRACE type="bool">False</dl_TRACE>
- <dl_L_INFO type="bool">True</dl_L_INFO>
- <dl_L_ADV type="bool">False</dl_L_ADV>
- <dl_L_VRB type="bool">False</dl_L_VRB>
- <dl_T_IO type="bool">False</dl_T_IO>
- <dl_T_INFO type="bool">False</dl_T_INFO>
- <dl_T_ADV type="bool">False</dl_T_ADV>
- <dl_T_VRB type="bool">False</dl_T_VRB>
- <dl_TG_ADV type="bool">False</dl_TG_ADV>
- <dl_TG_VRB type="bool">False</dl_TG_VRB>
- <dl_Q_ADV type="bool">False</dl_Q_ADV>
- <dl_Q_VRB type="bool">False</dl_Q_VRB>
- <dl_S_FSM type="bool">False</dl_S_FSM>
- <dl_S_SER type="bool">False</dl_S_SER>
- <dl_S_SUA type="bool">False</dl_S_SUA>
- <dl_S_WAIT type="bool">False</dl_S_WAIT>
- <dl_S_SEND type="bool">False</dl_S_SEND>
- <dl_S_INFO type="bool">False</dl_S_INFO>
- <dl_S_ADV type="bool">False</dl_S_ADV>
- <dl_S_VRB type="bool">False</dl_S_VRB>
- <dl_R_DD type="bool">False</dl_R_DD>
- <dl_R_VRB type="bool">False</dl_R_VRB>
- <dl_R_PAR type="bool">False</dl_R_PAR>
- <dl_EE_VRB type="bool">False</dl_EE_VRB>
- <dl_EE_DD type="bool">False</dl_EE_DD>
- <dl_FLOW type="bool">False</dl_FLOW>
- <dl_M_IO type="bool">False</dl_M_IO>
- <dl_SDP_DD type="bool">False</dl_SDP_DD>
- <dl_1 type="bool">False</dl_1>
- <dl_2 type="bool">False</dl_2>
- <dl_3 type="bool">False</dl_3>
- <log_level type="int">9</log_level>
- <log_in_memory type="int">1</log_in_memory>
- <rtp_log_in_file type="int">1</rtp_log_in_file>
- <log_filesize type="int">32</log_filesize>
- <_gbDebugLogs type="bool">False</_gbDebugLogs>
- <ccExportProfile type="bool">False</ccExportProfile>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">_ipRule1</item>
- <item ver="[0, [1, [0, [0]]]]" oid="2" type="ixPropertyState">
- <enable type="int">1</enable>
- <show type="int">0</show>
- </item>
- </item>
- <item type="tuple">
- <item type="str">dl_S_ADV</item>
- <item ver="[0, [1, [0, [0]]]]" oid="1" type="ixPropertyState">
- <enable type="int">1</enable>
- <show type="int">1</show>
- </item>
- </item>
- <item type="tuple">
- <item type="str">loopMidDelay</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">dl_T_IO</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">dl_T_INFO</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">dl_S_SEND</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_rtpIpRule1</item>
- <item ref="2"/>
- </item>
- <item type="tuple">
- <item type="str">_estimatedBacklog</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">loopPreDelay</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">dl_EE_VRB</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">dl_S_VRB</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">log_filesize</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">rtp_log_in_file</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">loopCount</item>
- <item ver="[0, [1, [0, [0]]]]" oid="3" type="ixPropertyState">
- <enable type="int">0</enable>
- <show type="int">1</show>
- </item>
- </item>
- <item type="tuple">
- <item type="str">dl_T_VRB</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">aliases</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">dl_Q_ADV</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">multipleUsersPerIO</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">log_level</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">rtpIpRule</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">dl_1</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">dl_3</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">dl_2</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">rampdownSleep</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_portRule1</item>
- <item ref="2"/>
- </item>
- <item type="tuple">
- <item type="str">dl_FLOW</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">dl_S_SER</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">log_in_memory</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">dl_R_VRB</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">dl_Q_VRB</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">portRuleCh</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">rtpPortRule</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">dl_M_IO</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">dl_EE_DD</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">rtpIpRuleCh</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">dl_S_FSM</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">loopMode</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_rtpPortRule1</item>
- <item ref="2"/>
- </item>
- <item type="tuple">
- <item type="str">dl_BUG</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">dl_S_SUA</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">ipRule</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">ipRuleCh</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">phoneRule</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">dl_S_INFO</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">dl_R_PAR</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">gracefulRampDown</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">dl_S_WAIT</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">dl_SDP_DD</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">dl_TRACE</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_gbDebugLogs</item>
- <item ref="2"/>
- </item>
- <item type="tuple">
- <item type="str">rtpPortRuleCh</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">dl_TG_VRB</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">portRule</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">dl_L_INFO</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">dl_TG_ADV</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">dl_R_DD</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">dl_T_ADV</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">ccExportProfile</item>
- <item ref="2"/>
- </item>
- <item type="tuple">
- <item type="str">dl_L_ADV</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">dl_L_VRB</item>
- <item ref="1"/>
- </item>
- </_dict>
- </state>
- </executionSettings>
- <customActivityLinkSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_ixCustomActivityParameters">
- <enableDbgLog type="bool">False</enableDbgLog>
- <dbgLogChannels type="str">1-5</dbgLogChannels>
- <bhcaType type="int">0</bhcaType>
- <talkTime type="int">10000</talkTime>
- <channelsNo type="int">1</channelsNo>
- <callSetupTime type="int">500</callSetupTime>
- <callTeardownTime type="int">500</callTeardownTime>
- <interCallDuration type="int">4000</interCallDuration>
- <bhcaObjectiveValue type="int">1</bhcaObjectiveValue>
- <cpsOverwriteValueChecked type="int">0</cpsOverwriteValueChecked>
- <cpsTotalChannelsChecked type="int">0</cpsTotalChannelsChecked>
- <cpsOverwriteValue type="int">18</cpsOverwriteValue>
- <cpsType type="int">1</cpsType>
- <cpsTalkTime type="int">1500</cpsTalkTime>
- <cpsChannelsNo type="int">5</cpsChannelsNo>
- <cpsTotalChannelsNo type="int">2500</cpsTotalChannelsNo>
- <cpsOverheadTime type="int">1500</cpsOverheadTime>
- <cpsInterCallDuration type="int">2000</cpsInterCallDuration>
- <cpsObjectiveValue type="int">1</cpsObjectiveValue>
- <cpsRegisterTime type="int">40</cpsRegisterTime>
- <cpsSplitTimeline type="int">0</cpsSplitTimeline>
- <lpsType type="int">0</lpsType>
- <lpsTalkTime type="int">800</lpsTalkTime>
- <lpsChannelsNo type="int">2150</lpsChannelsNo>
- <lpsOverheadTime type="int">1500</lpsOverheadTime>
- <lpsInterLoopDuration type="int">2000</lpsInterLoopDuration>
- <lpsObjectiveValue type="int">500</lpsObjectiveValue>
- <lpsActiveChannel type="int">0</lpsActiveChannel>
- <activeUsersTalkTime type="int">750</activeUsersTalkTime>
- <activeUsersNo type="int">86534</activeUsersNo>
- <activeUsersChannel type="int">0</activeUsersChannel>
- <activeUsersObjectiveValue type="int">{{registeringtotalcalls}}</activeUsersObjectiveValue>
- </customActivityLinkSettings>
- <rtpWaveFiles ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_RTPWaveFiles">
- <wavesCount type="int">0</wavesCount>
- </rtpWaveFiles>
- <rtpTones ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_RTPTones">
- <usedTonesCount type="int">0</usedTonesCount>
- <customTonesCount type="int">35</customTonesCount>
- <seqCustTonesCount type="int">0</seqCustTonesCount>
- </rtpTones>
- <codecCustomPopup ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CodecCustomPopup">
- <captureFile type="str">Default.cap</captureFile>
- <parseRTPPort type="bool">False</parseRTPPort>
- <parseSSRC type="bool">False</parseSSRC>
- <rtpPort type="int">10000</rtpPort>
- <ssrc type="str">0x8078C5D3</ssrc>
- </codecCustomPopup>
- <codecCustomPropDlg ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CodecCustomPropDlg"/>
- <codecSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CodecSettings">
- <codecs ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_CodecSettings_codecs" itemtype="ixConfig">
- <item ver="[0, [0, [0.1, [1, [0, [0]]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CodecG711u">
- <dPayloadIn type="int">0</dPayloadIn>
- <dPayloadOut type="int">0</dPayloadOut>
- <frameSize type="int">160</frameSize>
- </item>
- <item ver="[0, [0, [0.1, [1, [0, [0]]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CodecG711a">
- <dPayloadIn type="int">8</dPayloadIn>
- <dPayloadOut type="int">8</dPayloadOut>
- <frameSize type="int">160</frameSize>
- </item>
- </codecs>
- <codecs_number type="int">2</codecs_number>
- <_gbVideoCodecs type="bool">False</_gbVideoCodecs>
- <videoPayloadType type="int">96</videoPayloadType>
- <_gbDataCodecs type="bool">False</_gbDataCodecs>
- <dataCodecs ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_CodecSettings_dataCodecs" itemtype="ixConfig">
- <item ver="[0, [0, [0.1, [1, [0, [0]]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_Rtp2833Events">
- <dPayloadType type="int">100</dPayloadType>
- </item>
- <item ver="[0, [0, [0.1, [1, [0, [0]]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_Rtp2833Tones">
- <dPayloadType type="int">101</dPayloadType>
- </item>
- </dataCodecs>
- <crtCustomCodecIndex type="int">-1</crtCustomCodecIndex>
- </codecSettings>
- <rtpSettings ver="[7, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_RTPSettings">
- <rtpPort type="str">[10000-65535,4]</rtpPort>
- <enableAdvStatCalc type="bool">False</enableAdvStatCalc>
- <enableRTCP type="bool">False</enableRTCP>
- <enableRTCPMux type="bool">False</enableRTCPMux>
- <chEnableHwAcc type="bool">False</chEnableHwAcc>
- <chDisableHwAcc type="bool">False</chDisableHwAcc>
- <enableHwAcc type="bool">False</enableHwAcc>
- <enableIxStack type="bool">False</enableIxStack>
- <enableNBExec type="bool">False</enableNBExec>
- <enablePerStream type="bool">False</enablePerStream>
- <enableMDI type="bool">False</enableMDI>
- <enableRTP type="bool">False</enableRTP>
- <enableMediaSDPParams type="bool">False</enableMediaSDPParams>
- <audioB_option type="bool">False</audioB_option>
- <audioB_value type="str">AS:48</audioB_value>
- <audioRR_option type="bool">False</audioRR_option>
- <audioRR_value type="str">800</audioRR_value>
- <audioRS_option type="bool">False</audioRS_option>
- <audioRS_value type="str">800</audioRS_value>
- <videoB_option type="bool">False</videoB_option>
- <videoB_value type="str">AS:384</videoB_value>
- <videoRR_option type="bool">False</videoRR_option>
- <videoRR_value type="str">6400</videoRR_value>
- <videoRS_option type="bool">False</videoRS_option>
- <videoRS_value type="str">6400</videoRS_value>
- <textB_option type="bool">False</textB_option>
- <textB_value type="str">AS:48</textB_value>
- <textRR_option type="bool">False</textRR_option>
- <textRR_value type="str">800</textRR_value>
- <textRS_option type="bool">False</textRS_option>
- <textRS_value type="str">800</textRS_value>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">videoRR_value</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">_gbVideoSDPParams</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">textRS_value</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">channelsQoVPerZionPort</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_gbAudioSDPParams</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">dedicatedCoreRange</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enableRTP</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">rtpTosVal</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">channelTypeQoV</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enableMediaSDPParams</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_gbTextSDPParams</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">activityIdQoV</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">rtpPort</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">serviceEnabledQoV</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">audioRS_option</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">useJitComp</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">maxMosStreams</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">audioB_option</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">audioB_value</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">portIPsQoV</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">customTos</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enableHwAcc</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enableIxStack</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">jitMs</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">videoRR_option</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">rtpTos</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enableRTCPMux</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">textRR_option</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">silenceMode</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_gbMediaSDPParams</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">textB_option</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enableQoV</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">jitCMs</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">valueQoV</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enableRTCP</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">dedicatedCoreRangeLength</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enableMDI</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">chEnableHwAcc</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enableOWD</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">unitsQoV</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">ixnamSupported</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">chDisableHwAcc</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">customTosGroupBox</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">audioRR_option</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enablePerStream</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">useSilence</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">useMos</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">textRR_value</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">audioRS_value</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">videoB_value</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">mosInterval</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enableAdvStatCalc</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">useJitter</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">limitMos</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">metricsQoV</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">videoRS_option</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">videoRS_value</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">jitCMaxDrop</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">audioRR_value</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">textB_value</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">enableTosRtp</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">videoB_option</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">activityNameQoV</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">textRS_option</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enableNBExec</item>
- <item ref="1"/>
- </item>
- </_dict>
- </state>
- </rtpSettings>
- <rtcpSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_RTCPSettings">
- <rtcpIgnoreSSRC type="bool">False</rtcpIgnoreSSRC>
- <rtcpCNAMEType type="int">0</rtcpCNAMEType>
- <hasSDESName type="bool">False</hasSDESName>
- <hasSDESTool type="bool">False</hasSDESTool>
- <rtcpSDESTool type="str">IxLoad</rtcpSDESTool>
- <rtcpReceiverTimer type="int">2000</rtcpReceiverTimer>
- <rtcpSenderTimer type="int">2000</rtcpSenderTimer>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">rtcpSDESTool</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">rtcpSenderTimer</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">rtcpCNAMEType</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">hasSDESTool</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">rtcpReceiverTimer</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">rtcpIgnoreSSRC</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">hasSDESName</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enableRTCPMux2</item>
- <item ref="1"/>
- </item>
- </_dict>
- </state>
- </rtcpSettings>
- <audioSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_AudioSettings">
- <enableAudio type="bool">False</enableAudio>
- <_gbEnableAudio type="bool">False</_gbEnableAudio>
- <enableAudioOWD type="bool">False</enableAudioOWD>
- <useJitter type="bool">False</useJitter>
- <_JB1 type="bool">False</_JB1>
- <jitMs type="int">20</jitMs>
- <useJitComp type="bool">False</useJitComp>
- <jitCMs type="int">1000</jitCMs>
- <jitCMaxDrop type="int">7</jitCMaxDrop>
- <dodName type="str">rtp_esmad-asordo-l_1224</dodName>
- <useMos type="bool">False</useMos>
- <useSilence type="bool">False</useSilence>
- <silenceMode type="int">1</silenceMode>
- <enableTosRtp type="bool">False</enableTosRtp>
- <rtpTos type="int">1</rtpTos>
- <customTosGroupBox type="bool">False</customTosGroupBox>
- <customTos type="str">0x20</customTos>
- <rtpTosVal type="int">32</rtpTosVal>
- <_COV1 type="bool">False</_COV1>
- <useQoV type="bool">False</useQoV>
- <qovAnalize type="int">5</qovAnalize>
- <qovSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_QoVSettings">
- <activityIdQoV type="int">0</activityIdQoV>
- <enableQoV type="bool">False</enableQoV>
- <_gbEnableQoV type="bool">False</_gbEnableQoV>
- <serviceEnabledQoV type="bool">False</serviceEnabledQoV>
- <activityNameQoV type="str"></activityNameQoV>
- <portIPsQoV type="str"></portIPsQoV>
- <unitsQoV type="int">0</unitsQoV>
- <valueQoV type="int">100</valueQoV>
- <channelTypeQoV type="int">0</channelTypeQoV>
- <metricsQoV type="int">0</metricsQoV>
- <channelsQoVPerZionPort type="int">0</channelsQoVPerZionPort>
- <radioBtnQoVASR type="int">0</radioBtnQoVASR>
- <languageASR type="str">English(US)</languageASR>
- </qovSettings>
- <activityIdQoV type="int">0</activityIdQoV>
- <enableQoV type="bool">False</enableQoV>
- <_gbEnableQoV type="bool">False</_gbEnableQoV>
- <serviceEnabledQoV type="bool">False</serviceEnabledQoV>
- <activityNameQoV type="str"></activityNameQoV>
- <portIPsQoV type="str"></portIPsQoV>
- <unitsQoV type="int">0</unitsQoV>
- <valueQoV type="int">100</valueQoV>
- <channelTypeQoV type="int">0</channelTypeQoV>
- <metricsQoV type="int">0</metricsQoV>
- <channelsQoVPerZionPort type="int">0</channelsQoVPerZionPort>
- <radioBtnQoVASR type="int">0</radioBtnQoVASR>
- <languageASR type="str">English(US)</languageASR>
- <audioClip type="str">US_042.wav</audioClip>
- <_audioFormat type="str">Format: PCM, Duration: 32785 ms, Size: 524556 bytes</_audioFormat>
- <outputLevel type="int">-20</outputLevel>
- <_gbOutputLevel type="bool">False</_gbOutputLevel>
- <playTypeAudio type="int">0</playTypeAudio>
- <audioDuration type="int">10</audioDuration>
- <audioDurationUnit type="int">1</audioDurationUnit>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">_gbEnableQoV</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">channelTypeQoV</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">pesqPolqa</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enablePTT</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enableP56</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">qovAnalize</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">channelsQoVPerZionPort</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_COV1</item>
- <item ver="[0, [1, [0, [0]]]]" oid="4" type="ixPropertyState">
- <enable type="int">0</enable>
- <show type="int">0</show>
- </item>
- </item>
- <item type="tuple">
- <item type="str">useTelchemy</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">activityIdQoV</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">rtpTosVal</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">useJitComp</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">audioDuration</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">_JB1</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">enableAudio</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">portIPsQoV</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_gbQoVMetrics</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">dodName</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">jitMs</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">_gbASRLanguage</item>
- <item ref="2"/>
- </item>
- <item type="tuple">
- <item type="str">rtpTos</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">radioBtnQoVASR</item>
- <item ref="2"/>
- </item>
- <item type="tuple">
- <item type="str">silenceMode</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">playTypeAudio</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">useQoV</item>
- <item ref="2"/>
- </item>
- <item type="tuple">
- <item type="str">activityNameQoV</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enableQoV</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">jitCMs</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">valueQoV</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_gbOutputLevel</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">unitsQoV</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">serviceEnabledQoV</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">audioClip</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">languageASR</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">customTosGroupBox</item>
- <item ref="2"/>
- </item>
- <item type="tuple">
- <item type="str">audioDurationUnit</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">useMos</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">channelsQoV</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">customTos</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">qovSettings</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">useJitter</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">useSilence</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">metricsQoV</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">jitCMaxDrop</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">enableTosRtp</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enableAudioOWD</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_audioFormat</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_gbEnableAudio</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">outputLevel</item>
- <item ref="1"/>
- </item>
- </_dict>
- </state>
- </audioSettings>
- <editTos ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_EditTos">
- <bits012 type="int">0</bits012>
- <minDelay type="bool">False</minDelay>
- <maxThroughput type="bool">False</maxThroughput>
- <maxReliability type="bool">False</maxReliability>
- <_gbBtnTosBit7_0 type="bool">False</_gbBtnTosBit7_0>
- <_gbBtnTosBit7_1 type="bool">False</_gbBtnTosBit7_1>
- <_gbBtnTosBit6_0 type="bool">False</_gbBtnTosBit6_0>
- <_gbBtnTosBit6_1 type="bool">False</_gbBtnTosBit6_1>
- <_gbBtnTosBit5_0 type="bool">False</_gbBtnTosBit5_0>
- <_gbBtnTosBit5_1 type="bool">False</_gbBtnTosBit5_1>
- <_gbBtnTosBit4_0 type="bool">False</_gbBtnTosBit4_0>
- <_gbBtnTosBit4_1 type="bool">False</_gbBtnTosBit4_1>
- <_gbBtnTosBit3_0 type="bool">False</_gbBtnTosBit3_0>
- <_gbBtnTosBit3_1 type="bool">False</_gbBtnTosBit3_1>
- <_gbBtnTosBit2_0 type="bool">False</_gbBtnTosBit2_0>
- <_gbBtnTosBit2_1 type="bool">False</_gbBtnTosBit2_1>
- <_gbDisabledBtns type="bool">False</_gbDisabledBtns>
- </editTos>
- <srtpSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_SRTPSettings">
- <bEnableSRTP type="bool">False</bEnableSRTP>
- <bEnableVideoSRTP type="bool">False</bEnableVideoSRTP>
- <bEnableTextSRTP type="bool">False</bEnableTextSRTP>
- <bDisableSRTCPEncryption type="bool">False</bDisableSRTCPEncryption>
- <bDisableSRTPEncryption type="bool">False</bDisableSRTPEncryption>
- <bDisableSRTPAuthentication type="bool">False</bDisableSRTPAuthentication>
- <bDisableValidations type="bool">False</bDisableValidations>
- <bAllowOnlySecureStreams type="bool">False</bAllowOnlySecureStreams>
- <bIncludeMKI type="bool">False</bIncludeMKI>
- <bEnablePreencryption type="bool">False</bEnablePreencryption>
- <bDisableMasterSalt type="bool">False</bDisableMasterSalt>
- <bStaticMasterKeySalt type="bool">False</bStaticMasterKeySalt>
- <_masterKeySelection type="int">0</_masterKeySelection>
- <staticSingleKeySalt type="str"></staticSingleKeySalt>
- <staticKeyFile type="str"></staticKeyFile>
- <_enableSRTP type="bool">False</_enableSRTP>
- <_useStaticKey type="bool">False</_useStaticKey>
- <_singleMasterKeyGrp type="bool">False</_singleMasterKeyGrp>
- <_multipleMasterKeysGrp type="bool">False</_multipleMasterKeysGrp>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">bDisableSRTPAuthentication</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_singleMasterKeyGrp</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">bIncludeMKI</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">bEnableSRTP</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">bDisableValidations</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_useStaticKey</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">bEnablePreencryption</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_multipleMasterKeysGrp</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">_enableSRTP</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">bStaticMasterKeySalt</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">staticKeyFile</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">bDisableMasterSalt</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">staticSingleKeySalt</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">bAllowOnlySecureStreams</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">bDisableSRTCPEncryption</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">bEnableVideoSRTP</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">bDisableSRTPEncryption</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">bEnableTextSRTP</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_masterKeySelection</item>
- <item ref="1"/>
- </item>
- </_dict>
- </state>
- </srtpSettings>
- <videoClips ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_VideoClips">
- <videoClipsInfo ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_VideoClips_videoClipsInfo" itemtype="ixConfig"/>
- <videoClipsInfoLength type="int">0</videoClipsInfoLength>
- <H323MaxProfile type="int">0</H323MaxProfile>
- <H323MaxLevel type="int">0</H323MaxLevel>
- <H323MaxBitRate type="int">0</H323MaxBitRate>
- <H323Packetization type="int">0</H323Packetization>
- <MaxProfileIdc type="int">66</MaxProfileIdc>
- <MaxProfileIop type="int">0</MaxProfileIop>
- <MaxLevel type="int">1</MaxLevel>
- </videoClips>
- <advancedVideo ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_AdvancedVideoSettings">
- <enableCustomMaxMBPS type="bool">False</enableCustomMaxMBPS>
- <customMaxMBPS type="int">0</customMaxMBPS>
- <enableCustomMaxFS type="bool">False</enableCustomMaxFS>
- <customMaxFS type="int">0</customMaxFS>
- <enableCustomMaxDPB type="bool">False</enableCustomMaxDPB>
- <customMaxDPB type="int">0</customMaxDPB>
- <enableCustomMaxBRandCPB type="bool">False</enableCustomMaxBRandCPB>
- <customMaxBRandCPB type="int">0</customMaxBRandCPB>
- <enableMaxStaticMBPS type="bool">False</enableMaxStaticMBPS>
- <maxStaticMBPS type="int">0</maxStaticMBPS>
- <enableMaxRcmdNalUnitSize type="bool">False</enableMaxRcmdNalUnitSize>
- <maxRcmdNalUnitSize type="int">0</maxRcmdNalUnitSize>
- <enableMaxNalUnitSize type="bool">False</enableMaxNalUnitSize>
- <maxNalUnitSize type="int">0</maxNalUnitSize>
- </advancedVideo>
- <videoSettings ver="[1, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_VideoSettings">
- <enableVideo type="bool">False</enableVideo>
- <enableVideoOWD type="bool">False</enableVideoOWD>
- <videoMaxSessions type="int">1</videoMaxSessions>
- <_gbEnableVideo type="bool">False</_gbEnableVideo>
- <videoClip type="str">Fire_avc.mp4</videoClip>
- <_videoFormat type="str">Codec: H264, Duration: 12800 ms, Size: 2012176 bytes, Bitrate: 1225 kbps</_videoFormat>
- <playTypeVideo type="int">0</playTypeVideo>
- <videoDuration type="int">5</videoDuration>
- <videoDurationUnit type="int">1</videoDurationUnit>
- <useConference type="bool">False</useConference>
- <_gbUseConference type="bool">False</_gbUseConference>
- <rotationScheme type="int">0</rotationScheme>
- <confVideoDuration type="int">1</confVideoDuration>
- <confVideoDurationUnit type="int">1</confVideoDurationUnit>
- <confDuration type="int">1</confDuration>
- <confDurationUnit type="int">1</confDurationUnit>
- <btnTelepresence type="bool">False</btnTelepresence>
- <_gbUseTelepresence type="bool">False</_gbUseTelepresence>
- <tipSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_VideoTelepresenceSettings">
- <tipEndpointType type="int">1</tipEndpointType>
- <tipResolution type="int">1</tipResolution>
- <tipVersion type="int">1</tipVersion>
- <tipSyntheticPayload type="bool">False</tipSyntheticPayload>
- <tipMoreClips type="bool">False</tipMoreClips>
- <_gbTipMoreClips type="int">0</_gbTipMoreClips>
- <tipVideoClip2 type="str">Fire_avc.mp4</tipVideoClip2>
- <tipRotationScheme type="int">0</tipRotationScheme>
- <tipConfDuration type="int">1</tipConfDuration>
- <tipConfDurationUnit type="int">1</tipConfDurationUnit>
- <tipAudioDuration type="int">1</tipAudioDuration>
- <tipAudioDurationUnit type="int">1</tipAudioDurationUnit>
- <_gbTipPresentation type="bool">False</_gbTipPresentation>
- <tipUsePresentationStream type="bool">False</tipUsePresentationStream>
- <tipVideoClip type="str">Fire_avc.mp4</tipVideoClip>
- <tipAudioClip type="str">US_042.wav</tipAudioClip>
- <tipStartAfter type="int">1</tipStartAfter>
- <tipStartAfterUnit type="int">1</tipStartAfterUnit>
- <tipDuration type="int">1</tipDuration>
- <tipDurationUnit type="int">1</tipDurationUnit>
- <tipPresentationRotation type="int">0</tipPresentationRotation>
- <tipLegacyMode type="bool">False</tipLegacyMode>
- <_gbTipLegacy type="int">0</_gbTipLegacy>
- <tipLegacyClip type="str">Fire_avc.mp4</tipLegacyClip>
- <tipLegacyModeAudio type="bool">False</tipLegacyModeAudio>
- <_gbTipLegacyAudio type="int">0</_gbTipLegacyAudio>
- <tipLegacyClipAudio type="str">US_042.wav</tipLegacyClipAudio>
- <tipG722Legacy type="bool">False</tipG722Legacy>
- <tipAudioActivityMetric type="bool">False</tipAudioActivityMetric>
- <tipDinamicChannels type="bool">False</tipDinamicChannels>
- <tipVideoRefresh type="bool">False</tipVideoRefresh>
- <tipInbandSets type="bool">False</tipInbandSets>
- <tipArithmetingCoding type="bool">False</tipArithmetingCoding>
- <tipLTRP type="bool">False</tipLTRP>
- <tipGDR type="bool">False</tipGDR>
- <tipHighProfile type="bool">False</tipHighProfile>
- <tipUnrestrictedMedia type="bool">False</tipUnrestrictedMedia>
- <tipRtcpFeedback type="bool">True</tipRtcpFeedback>
- </tipSettings>
- <_gbTosVideo type="bool">False</_gbTosVideo>
- <enableTosVideo type="bool">False</enableTosVideo>
- <tosVideo type="int">1</tosVideo>
- <customTosVideo type="str">0x20</customTosVideo>
- <_gbCustomTosVideo type="bool">False</_gbCustomTosVideo>
- <tosValVideo type="int">32</tosValVideo>
- <useMosVideo type="bool">False</useMosVideo>
- <enableAcceptSSRCChanges type="bool">False</enableAcceptSSRCChanges>
- <ignoreHintTrack type="bool">False</ignoreHintTrack>
- <hintTrackType type="int">1</hintTrackType>
- <enablePACSI type="bool">True</enablePACSI>
- <useSingleNALUnit type="bool">False</useSingleNALUnit>
- <_gbH323AdvancedSettings type="bool">False</_gbH323AdvancedSettings>
- <useH323AdvancedSettings type="bool">False</useH323AdvancedSettings>
- <_gbUseH323AdvancedSettings type="bool">False</_gbUseH323AdvancedSettings>
- <rtpmap type="str"></rtpmap>
- <fmtp type="str"></fmtp>
- <isMP4 type="bool">False</isMP4>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">hintTrackType</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">videoMaxSessions</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">useSingleNALUnit</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enableVideo</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">useConference</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">customTosVideo</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tipSettings</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">playTypeVideo</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">rotationScheme</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_gbUseH323AdvancedSettings</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">isMP4</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">confVideoDuration</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tosValVideo</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enablePACSI</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_videoFormat</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">confDuration</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tosVideo</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">_gbUseTelepresence</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">enableVideoOWD</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enableTosVideo</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">fmtp</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">videoType</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">confDurationUnit</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">videoDurationUnit</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">_gbUseConference</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">_gbH323AdvancedSettings</item>
- <item ref="4"/>
- </item>
- <item type="tuple">
- <item type="str">_gbTosVideo</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">_gbCustomTosVideo</item>
- <item ref="4"/>
- </item>
- <item type="tuple">
- <item type="str">ignoreHintTrack</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enableAcceptSSRCChanges</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">videoDuration</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">useH323AdvancedSettings</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">videoClip</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">confVideoDurationUnit</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">rtpmap</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_gbEnableVideo</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">btnTelepresence</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">useMosVideo</item>
- <item ref="1"/>
- </item>
- </_dict>
- </state>
- </videoSettings>
- <videoConfSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_VideoConfSettings">
- <rotationScheme type="int">0</rotationScheme>
- <_gbRotationScheme type="int">0</_gbRotationScheme>
- <confVideoDuration type="int">0</confVideoDuration>
- <confVideoDurationUnit type="int">0</confVideoDurationUnit>
- <confDuration type="int">0</confDuration>
- <confDurationUnit type="int">0</confDurationUnit>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">rotationScheme</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">confDuration</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">confVideoDurationUnit</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">confDurationUnit</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_gbRotationScheme</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">confVideoDuration</item>
- <item ref="1"/>
- </item>
- </_dict>
- </state>
- </videoConfSettings>
- <videoTelepresenceSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_VideoTelepresenceSettings">
- <tipEndpointType type="int">0</tipEndpointType>
- <tipResolution type="int">0</tipResolution>
- <tipVersion type="int">0</tipVersion>
- <tipSyntheticPayload type="bool">False</tipSyntheticPayload>
- <tipMoreClips type="bool">False</tipMoreClips>
- <_gbTipMoreClips type="int">0</_gbTipMoreClips>
- <tipVideoClip2 type="str">Fire_avc.mp4</tipVideoClip2>
- <tipRotationScheme type="int">0</tipRotationScheme>
- <tipConfDuration type="int">0</tipConfDuration>
- <tipConfDurationUnit type="int">0</tipConfDurationUnit>
- <tipAudioDuration type="int">0</tipAudioDuration>
- <tipAudioDurationUnit type="int">0</tipAudioDurationUnit>
- <_gbTipPresentation type="bool">False</_gbTipPresentation>
- <tipUsePresentationStream type="bool">False</tipUsePresentationStream>
- <tipVideoClip type="str">Fire_avc.mp4</tipVideoClip>
- <tipAudioClip type="str">US_042.wav</tipAudioClip>
- <tipStartAfter type="int">0</tipStartAfter>
- <tipStartAfterUnit type="int">0</tipStartAfterUnit>
- <tipDuration type="int">0</tipDuration>
- <tipDurationUnit type="int">0</tipDurationUnit>
- <tipPresentationRotation type="int">0</tipPresentationRotation>
- <tipLegacyMode type="bool">False</tipLegacyMode>
- <_gbTipLegacy type="int">0</_gbTipLegacy>
- <tipLegacyClip type="str">Fire_avc.mp4</tipLegacyClip>
- <tipLegacyModeAudio type="bool">False</tipLegacyModeAudio>
- <_gbTipLegacyAudio type="int">0</_gbTipLegacyAudio>
- <tipLegacyClipAudio type="str">US_042.wav</tipLegacyClipAudio>
- <tipG722Legacy type="bool">False</tipG722Legacy>
- <tipAudioActivityMetric type="bool">False</tipAudioActivityMetric>
- <tipDinamicChannels type="bool">False</tipDinamicChannels>
- <tipVideoRefresh type="bool">False</tipVideoRefresh>
- <tipInbandSets type="bool">False</tipInbandSets>
- <tipArithmetingCoding type="bool">False</tipArithmetingCoding>
- <tipLTRP type="bool">False</tipLTRP>
- <tipGDR type="bool">False</tipGDR>
- <tipHighProfile type="bool">False</tipHighProfile>
- <tipUnrestrictedMedia type="bool">False</tipUnrestrictedMedia>
- <tipRtcpFeedback type="bool">True</tipRtcpFeedback>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">tipUnrestrictedMedia</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tipLegacyClipAudio</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tipRotationScheme</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tipLegacyMode</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_tipLegacyClip</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tipVideoRefresh</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tipUsePresentationStream</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tipRtcpFeedback</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tipStartAfterUnit</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tipArithmetingCoding</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_gbTipLegacyAudio</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">tipConfDuration</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tipConfDurationUnit</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tipG722Legacy</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tipDuration</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tipLegacyClip</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tipMoreClips</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tipDurationUnit</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tipInbandSets</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tipLegacyModeAudio</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_tipVideoClip2</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tipAudioDurationUnit</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tipResolution</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tipDinamicChannels</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_tipLegacyClipAudio</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tipSyntheticPayload</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_gbTipPresentation</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">tipHighProfile</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tipAudioActivityMetric</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tipGDR</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tipVideoClip2</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_gbTipMoreClips</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">tipVersion</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_tipVideoClip</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tipEndpointType</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_gbTipLegacy</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">tipLTRP</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tipStartAfter</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_tipAudioClip</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tipPresentationRotation</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tipAudioClip</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tipVideoClip</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tipAudioDuration</item>
- <item ref="1"/>
- </item>
- </_dict>
- </state>
- </videoTelepresenceSettings>
- <textSettings ver="[1, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TextSettings">
- <enableText type="bool">False</enableText>
- <enableTextOWD type="bool">False</enableTextOWD>
- <_gbEnableText type="bool">False</_gbEnableText>
- <textClip type="str">The quick brown fox jumps over the lazy dog</textClip>
- <textFormat type="str">Format: t140, Max duration: 42300 ms</textFormat>
- <textChpsMin type="float">1.0</textChpsMin>
- <textChpsMax type="float">1.0</textChpsMax>
- <textBufferTime type="int">300</textBufferTime>
- <textRedundancyLevel type="int">0</textRedundancyLevel>
- <textPlayType type="int">0</textPlayType>
- <textDuration type="int">5</textDuration>
- <textDurationUnit type="int">1</textDurationUnit>
- <_gbTosText type="bool">False</_gbTosText>
- <enableTosText type="bool">False</enableTosText>
- <tosText type="int">1</tosText>
- <customTosText type="str">0x20</customTosText>
- <_gbCustomTosText type="bool">False</_gbCustomTosText>
- <tosValText type="int">32</tosValText>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">tosValText</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_gbEnableText</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">textClip</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">customTosText</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">textChpsMin</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">textRedundancyLevel</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">textChpsMax</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">textBufferTime</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">textDuration</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">enableTextOWD</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_gbTosText</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">enableText</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">textPlayType</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_gbCustomTosText</item>
- <item ref="4"/>
- </item>
- <item type="tuple">
- <item type="str">enableTosText</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">textFormat</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">textDurationUnit</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">tosText</item>
- <item ref="3"/>
- </item>
- </_dict>
- </state>
- </textSettings>
- <t38Settings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_T38Settings">
- <enableT38 type="bool">False</enableT38>
- <_gbEnableT38 type="bool">False</_gbEnableT38>
- <_gbEnableT38_2 type="bool">False</_gbEnableT38_2>
- <faxImage type="str">Ixia2Pages.tif</faxImage>
- <_faxFormat type="str">Format: TIFF, Img size: 1660 x 2291, Size: 140402 bytes</_faxFormat>
- <t38TransportType type="int">1</t38TransportType>
- <t38Port type="str">40000</t38Port>
- <t38UdpEncapsulation type="int">0</t38UdpEncapsulation>
- <_gbT38UdpEncapsulation type="bool">False</_gbT38UdpEncapsulation>
- <t38PayloadType type="int">102</t38PayloadType>
- <useFaxVersion type="bool">True</useFaxVersion>
- <faxVersion type="int">0</faxVersion>
- <useT38MaxBitrate type="bool">True</useT38MaxBitrate>
- <t38MaxBitrate type="int">5</t38MaxBitrate>
- <useT38RateMgmt type="bool">True</useT38RateMgmt>
- <t38RateMgmt type="int">0</t38RateMgmt>
- <useT38FillBitRemoval type="bool">False</useT38FillBitRemoval>
- <t38FillBitRemoval type="int">0</t38FillBitRemoval>
- <t38TranscodingMMR type="bool">False</t38TranscodingMMR>
- <t38TranscodingJBIG type="bool">False</t38TranscodingJBIG>
- <_gbUdpOptions type="bool">False</_gbUdpOptions>
- <useErrorRecoverySchema type="bool">True</useErrorRecoverySchema>
- <errorRecoverySchema type="int">0</errorRecoverySchema>
- <useT38MaxDatagramSize type="bool">True</useT38MaxDatagramSize>
- <t38MaxDatagramSize type="int">256</t38MaxDatagramSize>
- <useT38MaxBufferSize type="bool">False</useT38MaxBufferSize>
- <t38MaxBufferSize type="int">200</t38MaxBufferSize>
- <imagesList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_T38Settings_imagesList" itemtype="ixConfig"/>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">t38TranscodingMMR</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">t38UdpEncapsulation</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">useT38MaxBitrate</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">t38RateMgmt</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">t38TranscodingJBIG</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enableT38</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">t38TransportType</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_gbEnableT38_2</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">_gbEnableT38</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">useFaxVersion</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">t38Port</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">t38FillBitRemoval</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">faxVersion</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">useT38FillBitRemoval</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">useT38RateMgmt</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">faxImage</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">useT38MaxBufferSize</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">errorRecoverySchema</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">t38MaxDatagramSize</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">t38MaxBufferSize</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">t38PayloadType</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">useT38MaxDatagramSize</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">t38MaxBitrate</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_faxFormat</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_gbUdpOptions</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_gbT38UdpEncapsulation</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">imagesList</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">useErrorRecoverySchema</item>
- <item ref="1"/>
- </item>
- </_dict>
- </state>
- </t38Settings>
- <t30Parameters ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_T30Parameters">
- <t30StationId type="str">5551[000-]</t30StationId>
- <t30SendCoding type="int">0</t30SendCoding>
- <t30SendDataRate type="int">5</t30SendDataRate>
- <t30SendPageSize type="int">0</t30SendPageSize>
- <t30SendMSLT type="int">0</t30SendMSLT>
- <t30SendProtocol type="int">1</t30SendProtocol>
- <t30SendResolution type="int">0</t30SendResolution>
- <sendCNG type="int">1</sendCNG>
- <t30ReceiveCoding type="int">2</t30ReceiveCoding>
- <t30ReceivePageSize type="int">2</t30ReceivePageSize>
- <t30ReceiveMSLT type="int">0</t30ReceiveMSLT>
- <t30ReceiveProtocol type="int">1</t30ReceiveProtocol>
- <t30ReceiveR8x3 type="bool">True</t30ReceiveR8x3>
- <t30ReceiveR8x7 type="bool">True</t30ReceiveR8x7>
- <t30ReceiveR8x15 type="bool">True</t30ReceiveR8x15>
- <t30Receive200x200 type="bool">True</t30Receive200x200>
- <t30ReceiveModulations type="int">3</t30ReceiveModulations>
- <sendCedBeforeDIS type="int">1</sendCedBeforeDIS>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">t30SendResolution</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">sendCedBeforeDIS</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">t30ReceiveR8x7</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">t30SendPageSize</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">t30ReceiveR8x3</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">t30SendProtocol</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">t30ReceiveProtocol</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">sendCNG</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">t30SendCoding</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">t30ReceiveMSLT</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">t30SendMSLT</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">t30ReceiveCoding</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">t30ReceivePageSize</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">t30ReceiveModulations</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">t30ReceiveR8x15</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">t30StationId</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">t30SendDataRate</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">t30Receive200x200</item>
- <item ref="1"/>
- </item>
- </_dict>
- </state>
- </t30Parameters>
- <msrpSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_MSRPSettings">
- <enableMSRP type="bool">False</enableMSRP>
- <_gbEnableMSRP type="bool">False</_gbEnableMSRP>
- <msrpPort type="str">2855</msrpPort>
- <domainType type="int">0</domainType>
- <localDomain type="str">alice[00-99].example.com</localDomain>
- <relays ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_MSRPSettings_relays" itemtype="ixConfig"/>
- <relaysCount type="int">0</relaysCount>
- <firstRelayIpEnabled type="bool">False</firstRelayIpEnabled>
- <firstRelayIp type="str">10.10.10.1</firstRelayIp>
- <firstRelayIsIPv4 type="bool">True</firstRelayIsIPv4>
- <msrpRelayPort type="int">2855</msrpRelayPort>
- <enableMSRPTos type="bool">False</enableMSRPTos>
- <msrpTos type="int">0</msrpTos>
- <customMSRPTos type="str">0x00</customMSRPTos>
- <tosMSRPVal type="int">0</tosMSRPVal>
- <automaticMSRPAuth type="bool">True</automaticMSRPAuth>
- <msrpReuseTCP type="bool">True</msrpReuseTCP>
- <msrpSendEmptyMsg type="bool">False</msrpSendEmptyMsg>
- <msrpTransactionTimeout type="int">30000</msrpTransactionTimeout>
- <msrpFirstChunkTimeout type="int">60000</msrpFirstChunkTimeout>
- <msrpInterChunkTimeout type="int">30000</msrpInterChunkTimeout>
- <msrpSessionTimeout type="int">70000</msrpSessionTimeout>
- <msrpGuiFiles ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_MSRPSettings_msrpGuiFiles" itemtype="ixConfig"/>
- <files ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_MSRPSettings_files" itemtype="ixConfig"/>
- <filesCount type="int">0</filesCount>
- <advSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_MSRPAdvancedSettings">
- <closeTCPConnectionAfterBye type="bool">False</closeTCPConnectionAfterBye>
- </advSettings>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">domainType</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">filesCount</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">firstRelayIpEnabled</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">automaticMSRPAuth</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">msrpSendEmptyMsg</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">msrpTransactionTimeout</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">msrpInterChunkTimeout</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tosMSRPVal</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enableMSRP</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">localDomain</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">relaysCount</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">customMSRPTos</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">firstRelayIp</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">advSettings</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">files</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">msrpFirstChunkTimeout</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">firstRelayIsIPv4</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">msrpPort</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_gbMSRPCustomTos</item>
- <item ref="4"/>
- </item>
- <item type="tuple">
- <item type="str">msrpSessionTimeout</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_gbEnableMSRP</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">enableMSRPTos</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">msrpReuseTCP</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">msrpGuiFiles</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">msrpTos</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">relays</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">msrpRelayPort</item>
- <item ref="3"/>
- </item>
- </_dict>
- </state>
- </msrpSettings>
- <_tempFile ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_FileRecord">
- <synthetic type="int">0</synthetic>
- <_typeStr type="str"></_typeStr>
- <name type="str"></name>
- <nameSynthetic type="str"></nameSynthetic>
- <fileClientPath type="str"></fileClientPath>
- <filePcpuPath type="str"></filePcpuPath>
- <_bFileSize type="int">20</_bFileSize>
- <_msrpSizeCombo type="int">2</_msrpSizeCombo>
- <size type="int">0</size>
- <btnMSRPFileBrowse type="int">0</btnMSRPFileBrowse>
- <type type="str">application/octet-stream</type>
- <fileHash type="str"></fileHash>
- </_tempFile>
- <_tempAdvSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_MSRPAdvancedSettings">
- <closeTCPConnectionAfterBye type="bool">False</closeTCPConnectionAfterBye>
- </_tempAdvSettings>
- <phoneBookInputLabel ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_PhoneBookInputLabel">
- <label type="str">5</label>
- </phoneBookInputLabel>
- <akaConfigurationInputLabel ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_AKAConfigurationInputLabel">
- <configurationLabel type="str"></configurationLabel>
- </akaConfigurationInputLabel>
- <phoneBook ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_PhoneBook">
- <fromFile type="int">0</fromFile>
- <pattern type="str">201004[0000-]</pattern>
- <filePath type="str"></filePath>
- <_PN1 type="bool">False</_PN1>
- <_bTelGrp type="bool">False</_bTelGrp>
- <ckTelURIBook type="bool">False</ckTelURIBook>
- <_bkTelURIparams type="str">phone-context=example.com</_bkTelURIparams>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">phoneBookList</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">filePath</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">pattern</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">ckTelURIBook</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_bkTelURIparams</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">_PN1</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_bTelGrp</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">fromFile</item>
- <item ref="1"/>
- </item>
- </_dict>
- </state>
- </phoneBook>
- <akaConfiguration ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_AKAConfiguration"/>
- <milenageConfiguration ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_MilenageConfiguration"/>
- <msgBox ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_MsgBox">
- <msg1 type="str"></msg1>
- <msg2 type="str"></msg2>
- </msgBox>
- <editCloudRule ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_EditCloudRule">
- <_gbStep1 type="bool">False</_gbStep1>
- <requestList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_EditCloudRule_requestList" itemtype="ixConfig">
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">ANY</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">INVITE</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">ACK</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">BYE</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">CANCEL</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">OPTIONS</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">REGISTER</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">NOTIFY</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">SUBSCRIBE</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">REFER</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">MESSAGE</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">PRACK</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">INFO</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">UPDATE</str>
- </item>
- </requestList>
- <reqList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_EditCloudRule_reqList" itemtype="ixConfig"/>
- <_gbStep2 type="bool">False</_gbStep2>
- <what type="int">2</what>
- <reqLine type="int">1</reqLine>
- <headerTypeList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_EditCloudRule_headerTypeList" itemtype="ixConfig">
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">To</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">From</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">Contact</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">Also</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">Authorization</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">Call-ID</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">Content-Length</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">Content-Type</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">CSeq</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">Event</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">Proxy-Authenticate</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">Proxy-Authorization</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">RAck</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">Record-Route</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">Refer-To</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">Referred-By</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">Replaces</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">Route</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">RSeq</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">Subscription-State</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">Via</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">WWW-Authenticate</str>
- </item>
- </headerTypeList>
- <headerType type="str">To</headerType>
- <compactForm type="str">t</compactForm>
- <occurFrom type="str">1</occurFrom>
- <occurTo type="str">1</occurTo>
- <whatExtract type="int">3</whatExtract>
- <extractHeaderName type="bool">False</extractHeaderName>
- <paramName type="str"></paramName>
- <revHeaderOrder type="bool">False</revHeaderOrder>
- <keepHeaderCrlf type="bool">False</keepHeaderCrlf>
- <_gbStep3 type="bool">False</_gbStep3>
- <usePosition type="int">0</usePosition>
- <beginAfter type="bool">False</beginAfter>
- <afterStr type="str">&lt;</afterStr>
- <afterOccur type="str">1</afterOccur>
- <endBefore type="bool">False</endBefore>
- <endStr type="str">&gt;</endStr>
- <endOccur type="str">last</endOccur>
- <positionFrom type="str">1</positionFrom>
- <positionTo type="str">last</positionTo>
- <_gbStep4 type="bool">False</_gbStep4>
- <formulaSource type="int">0</formulaSource>
- <formula type="str"></formula>
- <phoneBookPath type="str"></phoneBookPath>
- <phoneBookDodPath type="str"></phoneBookDodPath>
- <btnPBBrowse type="int">0</btnPBBrowse>
- </editCloudRule>
- <cloudRules ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CloudRules">
- <rulesList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_CloudRules_rulesList" itemtype="ixConfig"/>
- <cloudPhoneBooksAbsolutePath type="str">C:\Users\asordo\Documents\__Customers\Orange\OPNFV2_Lannion</cloudPhoneBooksAbsolutePath>
- </cloudRules>
- <cloudServers ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_VoIP_cloudServers" itemtype="ixConfig"/>
- <transferAddress ver="[1, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TransferAddress">
- <symTransferStr type="str">None</symTransferStr>
- <overridePhoneNo type="bool">False</overridePhoneNo>
- <_useTPb type="int">0</_useTPb>
- <_tBp type="str">&lt;None&gt;</_tBp>
- <_tBpPrv type="str"></_tBpPrv>
- <_tPhone type="str">150[00000000-]</_tPhone>
- <tPhoneType type="int">0</tPhoneType>
- <tPhone type="str">150[00000000-]</tPhone>
- <_tTelGrp type="bool">False</_tTelGrp>
- <_ckTTelURIParams type="bool">False</_ckTTelURIParams>
- <_tTelURIparams type="str">phone-context=example.com</_tTelURIparams>
- <transTelPar type="str"></transTelPar>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">_tBpPrv</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">overridePhoneNo</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">transTelPar</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_useTPb</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">tPhone</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_tTelGrp</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_tPhone</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_ckTTelURIParams</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">symTransferStr</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tPhoneType</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_tTelURIparams</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">_tBp</item>
- <item ref="3"/>
- </item>
- </_dict>
- </state>
- </transferAddress>
- <editContact ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_EditContact">
- <useDomainName type="int">0</useDomainName>
- <domainName type="str">mysipdomain.ixiacom.com</domainName>
- <_useEPb type="int">0</_useEPb>
- <_eBp type="str">&lt;None&gt;</_eBp>
- <_eBpPrv type="str"></_eBpPrv>
- <_ePhone type="str">160[00000000-]</_ePhone>
- <ePhoneType type="int">0</ePhoneType>
- <ePhone type="str">160[00000000-]</ePhone>
- <_eTelGrp type="bool">False</_eTelGrp>
- <_ckETelURI type="bool">False</_ckETelURI>
- <_eTelURIparams type="str">phone-context=example.com</_eTelURIparams>
- <editTelPar type="str"></editTelPar>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">_useEPb</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_eBpPrv</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">domainName</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">_eBp</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">_ePhone</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_eTelGrp</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">ePhoneType</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_eTelURIparams</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">useDomainName</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">editTelPar</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">ePhone</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_ckETelURI</item>
- <item ref="1"/>
- </item>
- </_dict>
- </state>
- </editContact>
- <dialPlan ver="[1, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_DialPlan">
- <sourceIPs type="str"></sourceIPs>
- <_useSPb type="int">0</_useSPb>
- <_sBp type="str">&lt;None&gt;</_sBp>
- <_sBpPrv type="str"></_sBpPrv>
- <_sPhone type="str">{{pnregistering}}</_sPhone>
- <srcPhoneType type="int">0</srcPhoneType>
- <srcPhone type="str">{{pnregistering}}</srcPhone>
- <_sTelGrp type="bool">False</_sTelGrp>
- <_ckSTelURIParams type="bool">False</_ckSTelURIParams>
- <_sTelURIparams type="str">phone-context=example.com</_sTelURIparams>
- <srcTelPar type="str"></srcTelPar>
- <_sTelGrp1 type="bool">False</_sTelGrp1>
- <_dTelGrp1 type="bool">False</_dTelGrp1>
- <symDestStr type="str">None</symDestStr>
- <ovrDestPhone type="bool">False</ovrDestPhone>
- <_useDPb type="int">0</_useDPb>
- <_dBp type="str">&lt;None&gt;</_dBp>
- <_dBpPrv type="str"></_dBpPrv>
- <_dPhone type="str">170[00000000-]</_dPhone>
- <destPhoneType type="int">0</destPhoneType>
- <destPhone type="str">170[00000000-]</destPhone>
- <_dTelGrp type="bool">False</_dTelGrp>
- <_ckDTelURIParams type="bool">False</_ckDTelURIParams>
- <_dTelURIparams type="str">phone-context=example.com</_dTelURIparams>
- <destTelPar type="str"></destTelPar>
- <enableEmergencyCalls type="bool">False</enableEmergencyCalls>
- <useAnonymous type="bool">False</useAnonymous>
- <makeEmergencyReg type="bool">False</makeEmergencyReg>
- <emergencyService type="str">sos</emergencyService>
- <emergencyServiceList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_DialPlan_emergencyServiceList" itemtype="ixConfig">
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">sos</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">sos.ambulance</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">sos.fire</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">sos.police</str>
- </item>
- </emergencyServiceList>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">_useSPb</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_dTelGrp1</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">sourceIPs</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enableEmergencyCalls</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_sPhone</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_dBpPrv</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">destPhoneType</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">destTelPar</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">useAnonymous</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_dTelGrp</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">symDestStr</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_gbEmergencyDest</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">_sBp</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">makeEmergencyReg</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">destPhone</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_gbEmergency</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_gbEmergencySource</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">_ckSTelURIParams</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_dTelURIparams</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">_dBp</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">ovrDestPhone</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_sTelGrp1</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">emergencyServiceList</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_dPhone</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">srcPhone</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">srcTelPar</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_sTelURIparams</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">_UseSrv1</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">srcPhoneType</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_sBpPrv</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_sTelGrp</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">emergencyService</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_useDPb</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">_ckDTelURIParams</item>
- <item ref="1"/>
- </item>
- </_dict>
- </state>
- </dialPlan>
- <signalingSettings ver="[1, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_SignalingSettings">
- <enableSIP type="bool">True</enableSIP>
- <port type="str">{{sipportregistering}}</port>
- <tcpWriteImmediate type="bool">False</tcpWriteImmediate>
- <fqdn type="bool">False</fqdn>
- <realm type="str"></realm>
- <user type="str">{{pnregistering}}@{{domainname}}</user>
- <passwd type="str">{{authpassword}}</passwd>
- <akaConfCombo type="str">&lt;None&gt;</akaConfCombo>
- <akaConfComboSelIndex type="int">0</akaConfComboSelIndex>
- <akaSharedSecretType type="int">0</akaSharedSecretType>
- <akaOperatorVariantType type="int">0</akaOperatorVariantType>
- <akaSharedSecretSequence type="str">ixia</akaSharedSecretSequence>
- <akaAbsolutePath type="str">C:\Users\asordo\Documents\__Customers\Orange\OPNFV2_Lannion</akaAbsolutePath>
- <akaOperatorVariantSequence type="str">ixia</akaOperatorVariantSequence>
- <akaSharedSecretSource type="int">0</akaSharedSecretSource>
- <akaOperatorVariantSource type="int">0</akaOperatorVariantSource>
- <akaExportComplete type="int">0</akaExportComplete>
- <akaUseOPasOPC type="bool">False</akaUseOPasOPC>
- <milenageConfCombo type="str">&lt;Default&gt;</milenageConfCombo>
- <milenage_c1 type="str">00000000000000000000000000000000</milenage_c1>
- <milenage_c2 type="str">00000000000000000000000000000001</milenage_c2>
- <milenage_c3 type="str">00000000000000000000000000000002</milenage_c3>
- <milenage_c4 type="str">00000000000000000000000000000004</milenage_c4>
- <milenage_c5 type="str">00000000000000000000000000000008</milenage_c5>
- <milenage_r1 type="int">64</milenage_r1>
- <milenage_r2 type="int">0</milenage_r2>
- <milenage_r3 type="int">32</milenage_r3>
- <milenage_r4 type="int">64</milenage_r4>
- <milenage_r5 type="int">96</milenage_r5>
- <enableTos type="bool">False</enableTos>
- <tos type="int">0</tos>
- <customSipTos type="str">0x00</customSipTos>
- <tosVal type="int">0</tosVal>
- <ovrTrans type="bool">False</ovrTrans>
- <ovrTransOption type="int">0</ovrTransOption>
- <useServer type="bool">True</useServer>
- <srvAddr type="str">{{iplistims}}</srvAddr>
- <srvPort type="str">5060</srvPort>
- <srvDomain type="str">{{domainname}}</srvDomain>
- <outboundProxy type="bool">False</outboundProxy>
- <useDnsSrv type="bool">False</useDnsSrv>
- <registrarSrv type="bool">False</registrarSrv>
- <autoRegister type="bool">True</autoRegister>
- <overrideRegistrar type="bool">False</overrideRegistrar>
- <overrideRegistrarAddress type="str">IP:PORT</overrideRegistrarAddress>
- <ovrContact type="bool">False</ovrContact>
- <ovrDest type="bool">False</ovrDest>
- <ovrDestHostPort type="str"></ovrDestHostPort>
- <nUdpMaxSize type="int">1024</nUdpMaxSize>
- <enableSigComp type="bool">False</enableSigComp>
- <telURISource type="bool">False</telURISource>
- <telURIDest type="bool">False</telURIDest>
- <securityMechanismValList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_SignalingSettings_securityMechanismValList" itemtype="ixConfig">
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_SecurityMechanismVal">
- <checked type="bool">False</checked>
- <mechanism type="str">ipsec-3gpp</mechanism>
- <algorithm type="int">0</algorithm>
- <algorithmStr type="str">hmac-sha-1-96</algorithmStr>
- <protocol type="int">0</protocol>
- <protocolStr type="str">esp</protocolStr>
- <mode type="int">0</mode>
- <modeStr type="str">trans</modeStr>
- <encrypt_algorithm type="int">0</encrypt_algorithm>
- <encrypt_algorithmStr type="str">aes-cbc</encrypt_algorithmStr>
- <spi_start_idx type="int">255</spi_start_idx>
- <port_c type="str">[3000-4000]</port_c>
- <port_s type="str">4060</port_s>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">protocol</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">encrypt_algorithmStr</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">algorithm</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">modeStr</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">protocolStr</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">mechanism</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">algorithmStr</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">mode</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">port_s</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">port_c</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">spi_start_idx</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">encrypt_algorithm</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">checked</item>
- <item ref="1"/>
- </item>
- </_dict>
- </state>
- </item>
- </securityMechanismValList>
- <useIPSecDoubleSPIPatch type="bool">False</useIPSecDoubleSPIPatch>
- <enablePeriodicDNSQueries type="bool">False</enablePeriodicDNSQueries>
- <DNSTimeoutValue type="int">60</DNSTimeoutValue>
- <skipDeleteDNSRecordsAtLoopEnd type="bool">False</skipDeleteDNSRecordsAtLoopEnd>
- <enableVoLTE type="bool">False</enableVoLTE>
- <mediaBearerType type="int">0</mediaBearerType>
- <enableCCDedicatedBearer type="bool">True</enableCCDedicatedBearer>
- <volte_grbox type="bool">False</volte_grbox>
- <_enableAutoHeaders type="bool">False</_enableAutoHeaders>
- <_btnAutoHeaders type="bool">False</_btnAutoHeaders>
- <dontEndMediaOnBye type="bool">False</dontEndMediaOnBye>
- <closeTCPConnectionsOnRampdown type="bool">False</closeTCPConnectionsOnRampdown>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">_gbSrvSettings</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">akaSharedSecretType</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">T1</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tcpWriteImmediate</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">telURISource</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_gbRetransmissions</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_enableAutoHeaders</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enableSIP</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">fqdn</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">akaSharedSecretSource</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">milenageConfCombo</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">milenage_c3</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">milenage_c2</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">milenage_c5</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">milenage_c4</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">akaConfCombo</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">akaOperatorVariantType</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">overrideRegistrar</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">port</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">milenage_r4</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">milenage_r5</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">realm</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">milenage_r3</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">milenage_r1</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">srvPort</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tos</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">user</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">akaOperatorVariantSource</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">ovrDest</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">useServer</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">nUdpMaxSize</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">retransmit1xx</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">srvDomain</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_btnEditContact1</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">telURIDest</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">ovrTimeout</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enablePeriodicDNSQueries</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">useIPSecDoubleSPIPatch</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">securityMechanismValList</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enableRetransmissions</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">overrideRegistrarAddress</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">enableTos</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">srvAddr</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">ovrDestHostPort</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">DNSTimeoutValue</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">tosVal</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">passwd</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">akaSharedSecretSequence</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">T2</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">autoRegister</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">skipDeleteDNSRecordsAtLoopEnd</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enableSigComp</item>
- <item ref="2"/>
- </item>
- <item type="tuple">
- <item type="str">akaOperatorVariantSequence</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enableVoLTE</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">retransmitACK</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_btnAutoHeaders</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">volte_grbox</item>
- <item ref="2"/>
- </item>
- <item type="tuple">
- <item type="str">customSipTos</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">dontEndMediaOnBye</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">milenage_r2</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">akaExportComplete</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">mediaBearerType</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">registrarSrv</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">milenage_c1</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">akaUseOPasOPC</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_ovrDest1</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">outboundProxy</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_UseSrv1</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_enableSIP1</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">closeTCPConnectionsOnRampdown</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">ovrContact</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">akaAbsolutePath</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">serverAddresses</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enableCCDedicatedBearer</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">akaConfComboSelIndex</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_gbCustomTos</item>
- <item ref="4"/>
- </item>
- <item type="tuple">
- <item type="str">ovrTrans</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">useDnsSrv</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">ovrTransOption</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">_enableSIP2</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_gbPeriodicDNSQuery</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">ignoreRetransmissions</item>
- <item ref="1"/>
- </item>
- </_dict>
- </state>
- </signalingSettings>
- <timerSettings ver="[2, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TimerSettings">
- <enableTimers type="bool">True</enableTimers>
- <expirationValList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_TimerSettings_expirationValList" itemtype="ixConfig">
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_ExpirationVal">
- <checked type="bool">True</checked>
- <message type="str">REGISTER</message>
- <msgPart type="int">0</msgPart>
- <msgPartStr type="str">Expires Header(s)</msgPartStr>
- <value type="int">3600</value>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">message</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">msgPartStr</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">checked</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">value</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">msgPart</item>
- <item ref="1"/>
- </item>
- </_dict>
- </state>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_ExpirationVal">
- <checked type="bool">True</checked>
- <message type="str">INVITE</message>
- <msgPart type="int">2</msgPart>
- <msgPartStr type="str">Session-Expire(s)</msgPartStr>
- <value type="int">90</value>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">message</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">msgPartStr</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">checked</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">value</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">msgPart</item>
- <item ref="1"/>
- </item>
- </_dict>
- </state>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_ExpirationVal">
- <checked type="bool">True</checked>
- <message type="str">UPDATE</message>
- <msgPart type="int">2</msgPart>
- <msgPartStr type="str">Session-Expire(s)</msgPartStr>
- <value type="int">90</value>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">message</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">msgPartStr</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">checked</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">value</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">msgPart</item>
- <item ref="1"/>
- </item>
- </_dict>
- </state>
- </item>
- </expirationValList>
- <sessionRefreshType type="int">1</sessionRefreshType>
- <refreshAfterSecs type="int">3000</refreshAfterSecs>
- <refreshAfterPercent type="int">50</refreshAfterPercent>
- <refreshInSecs type="int">32</refreshInSecs>
- <enableRetransmissions type="bool">False</enableRetransmissions>
- <T1 type="int">500</T1>
- <T2 type="int">4000</T2>
- <ignoreRetransmissions type="bool">True</ignoreRetransmissions>
- <retransmitACK type="bool">True</retransmitACK>
- <stopActiveRetr type="bool">True</stopActiveRetr>
- <retransmit1xx type="bool">False</retransmit1xx>
- <ovrTimeout type="bool">False</ovrTimeout>
- <minInterReregister type="int">0</minInterReregister>
- <autoEndCall2 type="bool">False</autoEndCall2>
- <enableAutoPRACK type="bool">False</enableAutoPRACK>
- <rprSendNegotiatedSDP type="bool">False</rprSendNegotiatedSDP>
- <rprTimeUntilNextRPR type="int">150</rprTimeUntilNextRPR>
- <rprScenarioHasPRACK type="bool">False</rprScenarioHasPRACK>
- <auto4xx type="bool">False</auto4xx>
- <auto4xxAbort type="bool">False</auto4xxAbort>
- <autoProcedureList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_TimerSettings_autoProcedureList" itemtype="ixConfig"/>
- <autoProceduresCount type="int">0</autoProceduresCount>
- <procListChanged type="bool">True</procListChanged>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">btnRefreshProcList</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">autoEndCall</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">ignoreRetransmissions</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">minInterReregister</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">autoEndCall2</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enableTimers</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">refreshInSecs</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">retransmit1xx</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">auto4xxAbort</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">_gbEnableTimers</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">ovrTimeout</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">sessionRefreshType</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">auto4xx</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">procListChanged</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">T2</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">autoProcedureList</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_gbAutoPRACK</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">T1</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">refreshAfterPercent</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enableAutoPRACK</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">stopActiveRetr</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">enableRetransmissions</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">rprTimeUntilNextRPR</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">rprScenarioHasPRACK</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">expirationValList</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">refreshAfterSecs</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">autoProceduresCount</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">retransmitACK</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">rprSendNegotiatedSDP</item>
- <item ref="1"/>
- </item>
- </_dict>
- </state>
- </timerSettings>
- <advancedSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_AdvancedSettings">
- <useCloud type="bool">False</useCloud>
- <_useCloud1 type="bool">False</_useCloud1>
- <cloud type="str">&lt;None&gt;</cloud>
- <serverRules ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_AdvancedSettings_serverRules" itemtype="ixConfig"/>
- <enableVirtualIPs type="bool">False</enableVirtualIPs>
- <virtualIPTable ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_AdvancedSettings_virtualIPTable" itemtype="ixConfig"/>
- <ovrCloudRules type="bool">False</ovrCloudRules>
- <_ovrCloudRules1 type="bool">False</_ovrCloudRules1>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">_gbVirtualIPs</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">useCloud</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">ovrCloudRules</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_ovrCloudRules1</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">_useCloud1</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">enableVirtualIPs</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">virtualIPTable</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">serverRules</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">cloud</item>
- <item ref="3"/>
- </item>
- </_dict>
- </state>
- </advancedSettings>
- <tlsSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsSettings">
- <enableTLS type="bool">False</enableTLS>
- <enableDTLS type="bool">False</enableDTLS>
- <enableTLS_MSRP type="bool">False</enableTLS_MSRP>
- <enableTLS_HTTP type="bool">False</enableTLS_HTTP>
- <_enableTLS1 type="bool">False</_enableTLS1>
- <_enableTLS2 type="bool">False</_enableTLS2>
- <_enableTLS3 type="bool">False</_enableTLS3>
- <tlsPort type="str">5061</tlsPort>
- <tlsProtocol type="int">3</tlsProtocol>
- <tlsSessionRefresh type="bool">False</tlsSessionRefresh>
- <_tlsSessionRefresh type="bool">False</_tlsSessionRefresh>
- <tlsRefreshInterval type="int">3600</tlsRefreshInterval>
- <tlsAuthClient type="int">0</tlsAuthClient>
- <tlsReuseConnection type="bool">False</tlsReuseConnection>
- <_tlsReuseConnection type="bool">False</_tlsReuseConnection>
- <ignoreSubjectAltName type="bool">False</ignoreSubjectAltName>
- <tlsMutual type="bool">False</tlsMutual>
- <_gbTlsMutual type="bool">False</_gbTlsMutual>
- <tlsCyphers ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_TlsSettings_tlsCyphers" itemtype="ixConfig">
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers">
- <enabled type="bool">True</enabled>
- <name type="str">ECDHE-ECDSA-AES128-GCM-SHA256</name>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">enabled</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">name</item>
- <item ref="3"/>
- </item>
- </_dict>
- </state>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers">
- <enabled type="bool">True</enabled>
- <name type="str">ECDHE-ECDSA-AES256-GCM-SHA384</name>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">enabled</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">name</item>
- <item ref="3"/>
- </item>
- </_dict>
- </state>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers">
- <enabled type="bool">True</enabled>
- <name type="str">ECDHE-RSA-AES128-GCM-SHA256</name>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">enabled</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">name</item>
- <item ref="3"/>
- </item>
- </_dict>
- </state>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers">
- <enabled type="bool">True</enabled>
- <name type="str">ECDHE-ECDSA-AES256-SHA</name>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">enabled</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">name</item>
- <item ref="3"/>
- </item>
- </_dict>
- </state>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers">
- <enabled type="bool">True</enabled>
- <name type="str">ECDHE-ECDSA-AES128-SHA</name>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">enabled</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">name</item>
- <item ref="3"/>
- </item>
- </_dict>
- </state>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers">
- <enabled type="bool">True</enabled>
- <name type="str">ECDHE-RSA-AES128-SHA</name>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">enabled</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">name</item>
- <item ref="3"/>
- </item>
- </_dict>
- </state>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers">
- <enabled type="bool">True</enabled>
- <name type="str">AES128-SHA</name>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">enabled</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">name</item>
- <item ref="3"/>
- </item>
- </_dict>
- </state>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers">
- <enabled type="bool">True</enabled>
- <name type="str">AES256-SHA</name>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">enabled</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">name</item>
- <item ref="3"/>
- </item>
- </_dict>
- </state>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers">
- <enabled type="bool">False</enabled>
- <name type="str">ECDHE-ECDSA-AES256-SHA384</name>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">enabled</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">name</item>
- <item ref="3"/>
- </item>
- </_dict>
- </state>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers">
- <enabled type="bool">False</enabled>
- <name type="str">ECDHE-ECDSA-AES128-SHA256</name>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">enabled</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">name</item>
- <item ref="3"/>
- </item>
- </_dict>
- </state>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers">
- <enabled type="bool">False</enabled>
- <name type="str">ECDHE-RSA-AES256-GCM-SHA384</name>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">enabled</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">name</item>
- <item ref="3"/>
- </item>
- </_dict>
- </state>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers">
- <enabled type="bool">False</enabled>
- <name type="str">ECDHE-RSA-AES128-SHA256</name>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">enabled</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">name</item>
- <item ref="3"/>
- </item>
- </_dict>
- </state>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers">
- <enabled type="bool">False</enabled>
- <name type="str">ECDHE-RSA-AES256-SHA384</name>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">enabled</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">name</item>
- <item ref="3"/>
- </item>
- </_dict>
- </state>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers">
- <enabled type="bool">False</enabled>
- <name type="str">DES-CBC-SHA</name>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">enabled</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">name</item>
- <item ref="3"/>
- </item>
- </_dict>
- </state>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers">
- <enabled type="bool">False</enabled>
- <name type="str">DES-CBC3-SHA</name>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">enabled</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">name</item>
- <item ref="3"/>
- </item>
- </_dict>
- </state>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers">
- <enabled type="bool">False</enabled>
- <name type="str">EXP-DES-CBC-SHA</name>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">enabled</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">name</item>
- <item ref="3"/>
- </item>
- </_dict>
- </state>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers">
- <enabled type="bool">False</enabled>
- <name type="str">EXP-RC2-CBC-MD5</name>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">enabled</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">name</item>
- <item ref="3"/>
- </item>
- </_dict>
- </state>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers">
- <enabled type="bool">False</enabled>
- <name type="str">EXP-RC4-MD5</name>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">enabled</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">name</item>
- <item ref="3"/>
- </item>
- </_dict>
- </state>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers">
- <enabled type="bool">False</enabled>
- <name type="str">EXP1024-DES-CBC-SHA</name>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">enabled</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">name</item>
- <item ref="3"/>
- </item>
- </_dict>
- </state>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers">
- <enabled type="bool">False</enabled>
- <name type="str">EXP1024-RC4-SHA</name>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">enabled</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">name</item>
- <item ref="3"/>
- </item>
- </_dict>
- </state>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers">
- <enabled type="bool">False</enabled>
- <name type="str">IDEA-CBC-SHA</name>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">enabled</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">name</item>
- <item ref="3"/>
- </item>
- </_dict>
- </state>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers">
- <enabled type="bool">False</enabled>
- <name type="str">NULL-MD5</name>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">enabled</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">name</item>
- <item ref="3"/>
- </item>
- </_dict>
- </state>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers">
- <enabled type="bool">False</enabled>
- <name type="str">NULL-SHA</name>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">enabled</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">name</item>
- <item ref="3"/>
- </item>
- </_dict>
- </state>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers">
- <enabled type="bool">False</enabled>
- <name type="str">RC4-MD5</name>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">enabled</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">name</item>
- <item ref="3"/>
- </item>
- </_dict>
- </state>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers">
- <enabled type="bool">False</enabled>
- <name type="str">RC4-SHA</name>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">enabled</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">name</item>
- <item ref="3"/>
- </item>
- </_dict>
- </state>
- </item>
- </tlsCyphers>
- <tlsCertificatesPath type="str">C:\Program Files (x86)\Ixia\IxLoad\8.20-EA\aptixia\data\SSL_Certificates</tlsCertificatesPath>
- <tlsPrivateKeyCertificate type="str">Unsecured_RSA_key_1024.pem</tlsPrivateKeyCertificate>
- <tlsPublicKeyCertificate type="str">Unsecured_RSA_cert_1024.pem</tlsPublicKeyCertificate>
- <tlsKeyType type="int">0</tlsKeyType>
- <tlsCertType type="int">0</tlsCertType>
- <tlsPassword type="str"></tlsPassword>
- <sipScheme type="int">0</sipScheme>
- <tlsTransportType type="int">0</tlsTransportType>
- <tlsDisableUdpAndTcp type="bool">True</tlsDisableUdpAndTcp>
- <tlsEnableTcpKeepAlive type="bool">False</tlsEnableTcpKeepAlive>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">tlsCertType</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tlsPassword</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tlsPort</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tlsMutual</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tlsPrivateKeyCertificate</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tlsTransportType</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enableTLS_HTTP</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tlsCyphers</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tlsProtocol</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tlsKeyType</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_tlsSessionRefresh</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">tlsCertificatesPath</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tlsEnableTcpKeepAlive</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_gbTlsMutual</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">tlsPublicKeyCertificate</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_enableCert</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">enableTLS</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tlsAuthClient</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">ignoreSubjectAltName</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_enableTLS4</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">_enableTLS1</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">_enableTLS2</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">_enableTLS3</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">enableDTLS</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enableTLS_MSRP</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tlsReuseConnection</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tlsRefreshInterval</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tlsSessionRefresh</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tlsDisableUdpAndTcp</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">sipScheme</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_tlsReuseConnection</item>
- <item ref="3"/>
- </item>
- </_dict>
- </state>
- </tlsSettings>
- <dtlsOptions ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_DtlsOptions">
- <dtlsRetry type="int">200</dtlsRetry>
- <dtlsTimeout type="int">30000</dtlsTimeout>
- <dtlsSessionTicket type="bool">False</dtlsSessionTicket>
- </dtlsOptions>
- <iceOptions ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_IceOptions">
- <iceRetryCount type="int">6</iceRetryCount>
- <iceInitialRetry type="int">100</iceInitialRetry>
- <iceTimeout type="int">30000</iceTimeout>
- </iceOptions>
- <otherSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_OtherSettings">
- <VOIP_Var0 type="str"></VOIP_Var0>
- <VOIP_Var1 type="str"></VOIP_Var1>
- <VOIP_Var2 type="str"></VOIP_Var2>
- <VOIP_Var3 type="str"></VOIP_Var3>
- <VOIP_Var4 type="str"></VOIP_Var4>
- <VOIP_IPAddress0 type="str"></VOIP_IPAddress0>
- <VOIP_IPAddress1 type="str"></VOIP_IPAddress1>
- <VOIP_IPAddress2 type="str"></VOIP_IPAddress2>
- <VOIP_IPAddress3 type="str"></VOIP_IPAddress3>
- <VOIP_IPAddress4 type="str"></VOIP_IPAddress4>
- <ipPreference type="int">0</ipPreference>
- <bUseHardcoded type="bool">False</bUseHardcoded>
- <_gbHardcodedForDemo type="bool">False</_gbHardcodedForDemo>
- <_gbStunSettings type="bool">False</_gbStunSettings>
- <bUseStun type="bool">False</bUseStun>
- <stunAddr type="str">127.0.0.1</stunAddr>
- <stunPort type="str">3478</stunPort>
- <bUseIce type="bool">False</bUseIce>
- <bIceLite type="bool">False</bIceLite>
- <_gbSRVCCSettings type="bool">False</_gbSRVCCSettings>
- <bUseSRVCC type="bool">False</bUseSRVCC>
- <mobilityPath type="str"></mobilityPath>
- <ddgGroupboxSRVCC type="bool">False</ddgGroupboxSRVCC>
- <PCO_Groupbox type="bool">False</PCO_Groupbox>
- <bUsePCO type="bool">False</bUsePCO>
- <_gbPCO type="bool">False</_gbPCO>
- <PCO_List type="str"></PCO_List>
- <useBHCA type="bool">False</useBHCA>
- <loadVariablesFromCsv type="bool">False</loadVariablesFromCsv>
- <pathForCsvWithVariables type="str"></pathForCsvWithVariables>
- <absolutePathForCsvWithVariables type="str"></absolutePathForCsvWithVariables>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">_gbIceSettings</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">_gbPCO</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">VOIP_IPAddress4</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_gbStunSettings</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">VOIP_IPAddress0</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">VOIP_IPAddress3</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">VOIP_IPAddress2</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">bUseIce</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">mobilityPath</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">VOIP_Var0</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">VOIP_IPAddress1</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">PCO_List</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_gbSRVCCSettings</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">absolutePathForCsvWithVariables</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">VOIP_Var2</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">PCO_Groupbox</item>
- <item ref="2"/>
- </item>
- <item type="tuple">
- <item type="str">bUseHardcoded</item>
- <item ref="2"/>
- </item>
- <item type="tuple">
- <item type="str">bUseSRVCC</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">useBHCA</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">ipPreference</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">btnBrowseForVariableCsv</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">bUsePCO</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">stunPort</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">bUseStun</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">stunAddr</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">ddgGroupboxSRVCC</item>
- <item ref="2"/>
- </item>
- <item type="tuple">
- <item type="str">_gbHardcodedForDemo</item>
- <item ref="2"/>
- </item>
- <item type="tuple">
- <item type="str">pathForCsvWithVariables</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">DodPathForCsvWithVariables</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_varCsvGroupBox</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">VOIP_Var1</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">loadVariablesFromCsv</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">VOIP_Var3</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">bIceLite</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">VOIP_Var4</item>
- <item ref="1"/>
- </item>
- </_dict>
- </state>
- </otherSettings>
- <smsSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_SMSSettings">
- <enableSMS type="bool">False</enableSMS>
- <requestURI type="str">sc.home1.net</requestURI>
- <enableTelURI type="bool">False</enableTelURI>
- <telURI type="str">phone-context=example</telURI>
- <smscPhoneNo type="str">61814712345</smscPhoneNo>
- <smscTypeOfNo type="int">0</smscTypeOfNo>
- <smscNumberingPlan type="int">0</smscNumberingPlan>
- <enableSMOrigOverrideDest type="bool">False</enableSMOrigOverrideDest>
- <btnSMOrigEdit type="bool">False</btnSMOrigEdit>
- <enableSMOrigReqStatusReport type="bool">False</enableSMOrigReqStatusReport>
- <enableSMOrigReplyPath type="bool">False</enableSMOrigReplyPath>
- <smsAddressOriginator ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_SMSAddressInfo">
- <phoneType type="bool">False</phoneType>
- <phoneValue type="str">160[00000000-]</phoneValue>
- <comboPhoneBookEntry type="str">&lt;None&gt;</comboPhoneBookEntry>
- </smsAddressOriginator>
- <smOrigTypeOfNo type="int">0</smOrigTypeOfNo>
- <smOrigNumberingPlan type="int">0</smOrigNumberingPlan>
- <enableSMRecipOverrideSrc type="bool">False</enableSMRecipOverrideSrc>
- <btnSMRecipEdit type="bool">False</btnSMRecipEdit>
- <enableSMRecipReqStatusReport type="bool">False</enableSMRecipReqStatusReport>
- <enableSMRecipReplyPath type="bool">False</enableSMRecipReplyPath>
- <smsAddressRecipient ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_SMSAddressInfo">
- <phoneType type="bool">False</phoneType>
- <phoneValue type="str">160[00000000-]</phoneValue>
- <comboPhoneBookEntry type="str">&lt;None&gt;</comboPhoneBookEntry>
- </smsAddressRecipient>
- <smRecipTypeOfNo type="int">0</smRecipTypeOfNo>
- <smRecipNumberingPlan type="int">0</smRecipNumberingPlan>
- <depActivities ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_SMSSettings_depActivities" itemtype="ixConfig"/>
- <useFilesFromActivity type="bool">False</useFilesFromActivity>
- <verifyUserInfo type="bool">False</verifyUserInfo>
- <smsImportFilesActivity type="str">None</smsImportFilesActivity>
- <smsActivityForFiles type="int">0</smsActivityForFiles>
- <pcpuCommonPath type="str"></pcpuCommonPath>
- <smsFiles ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_SMSSettings_smsFiles" itemtype="ixConfig"/>
- <smsFilesCount type="int">0</smsFilesCount>
- <grBoxSMServiceCenter type="bool">False</grBoxSMServiceCenter>
- <grBoxSMOriginator type="bool">False</grBoxSMOriginator>
- <grBoxSMRecipient type="bool">False</grBoxSMRecipient>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">smOrigNumberingPlan</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">smsFiles</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">enableSMS</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enableSMOrigReplyPath</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">smsFilesCount</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">btnSMRecipEdit</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">grBoxSMOriginator</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">grBoxSMRecipient</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">enableSMRecipOverrideSrc</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enableSMOrigReqStatusReport</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">smsAddressOriginator</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">telURI</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">depActivities</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">pcpuCommonPath</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">smOrigTypeOfNo</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">smRecipTypeOfNo</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">requestURI</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">smsFilesBackup</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">smsAddressRecipient</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enableTelURI</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">useFilesFromActivity</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">smRecipNumberingPlan</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">smscPhoneNo</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">smsImportFilesActivity</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">enableSMRecipReplyPath</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">btnSMOrigEdit</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">smscNumberingPlan</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">duringLoadFromBackup</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enableSMRecipReqStatusReport</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">grBoxSMServiceCenter</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">verifyUserInfo</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">smscTypeOfNo</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enableSMOrigOverrideDest</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">smsActivityForFiles</item>
- <item ref="1"/>
- </item>
- </_dict>
- </state>
- </smsSettings>
- <smsFilesAdd ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_SMSFilesAdd">
- <loadedFileType type="int">0</loadedFileType>
- <fileName type="str"></fileName>
- <ixSmsFileName type="str"></ixSmsFileName>
- <ixSmsFilePath type="str"></ixSmsFilePath>
- <segmentOrder type="str"></segmentOrder>
- <totalTpudSize type="str"></totalTpudSize>
- <segmentNo type="str">0</segmentNo>
- <comboCoding type="int">0</comboCoding>
- <comboRefNo type="int">0</comboRefNo>
- <contentViewEdit type="str"></contentViewEdit>
- <contentViewShow type="str"></contentViewShow>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">segmentNo</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">contentViewShow</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">ixSmsFilePath</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">contentViewEdit</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">comboCoding</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">segmentOrder</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">comboRefNo</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">loadedFileType</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">btnSmsLoadFiles</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">ixSmsFileName</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">btnSmsSaveAs</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">fileName</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">totalTpudSize</item>
- <item ref="1"/>
- </item>
- </_dict>
- </state>
- </smsFilesAdd>
- <smsAddressOriginator ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_SMSAddress">
- <radioBtnPhoneNo type="int">0</radioBtnPhoneNo>
- <comboPhoneBook type="str">&lt;None&gt;</comboPhoneBook>
- <phoneBookPreview type="str"></phoneBookPreview>
- <userPattern type="str">160[00000000-]</userPattern>
- <ePhoneType type="int">0</ePhoneType>
- <ePhone type="str">160[00000000-]</ePhone>
- <fakeEnableTelURI type="bool">False</fakeEnableTelURI>
- <fakeTelURI type="str"></fakeTelURI>
- <fakeTelToPort type="str"></fakeTelToPort>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">userPattern</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">phoneBookPreview</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">ePhoneType</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">fakeEnableTelURI</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">fakeTelToPort</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">comboPhoneBook</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">ePhone</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">fakeTelURI</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">radioBtnPhoneNo</item>
- <item ref="1"/>
- </item>
- </_dict>
- </state>
- </smsAddressOriginator>
- <smsAddressRecipient ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_SMSAddress">
- <radioBtnPhoneNo type="int">0</radioBtnPhoneNo>
- <comboPhoneBook type="str">&lt;None&gt;</comboPhoneBook>
- <phoneBookPreview type="str"></phoneBookPreview>
- <userPattern type="str">160[00000000-]</userPattern>
- <ePhoneType type="int">0</ePhoneType>
- <ePhone type="str">160[00000000-]</ePhone>
- <fakeEnableTelURI type="bool">False</fakeEnableTelURI>
- <fakeTelURI type="str"></fakeTelURI>
- <fakeTelToPort type="str"></fakeTelToPort>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">userPattern</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">phoneBookPreview</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">ePhoneType</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">fakeEnableTelURI</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">fakeTelToPort</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">comboPhoneBook</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">ePhone</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">fakeTelURI</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">radioBtnPhoneNo</item>
- <item ref="1"/>
- </item>
- </_dict>
- </state>
- </smsAddressRecipient>
- <compatibility ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_Compatibility">
- <hasRtpChMapRules type="bool">True</hasRtpChMapRules>
- </compatibility>
- <editAutoHeaderRule ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_EditAutoHeaderRule">
- <defaultMessagesList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_EditAutoHeaderRule_defaultMessagesList" itemtype="ixConfig">
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">INVITE</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">ACK</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">BYE</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">CANCEL</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">OPTIONS</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">REGISTER</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">NOTIFY</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">SUBSCRIBE</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">REFER</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">MESSAGE</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">PRACK</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">INFO</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">UPDATE</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">100 (Trying)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">180 (Ringing)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">181 (Call Is Being Forwarded)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">182 (Queued)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">183 (Session Progress)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">200 (OK)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">202 (Accepted)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">300 (Multiple Choices)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">301 (Moved Permanently)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">302 (Moved Temporarily)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">305 (Use Proxy)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">380 (Alternative Service)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">400 (Bad Request)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">401 (Unauthorized)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">402 (Payment Required)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">403 (Forbidden)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">404 (Not Found)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">405 (Method Not Allowed)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">406 (Not Acceptable)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">407 (Proxy Authentication Required)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">408 (Request Timeout)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">410 (Gone)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">413 (Request Entity Too Large)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">414 (Request-URI Too Large)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">415 (Unsupported Media Type)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">416 (Unsupported URI Scheme)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">420 (Bad Extension)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">421 (Extension Required)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">423 (Interval Too Brief)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">480 (Temporarily not available)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">481 (Call Leg/Transaction Does Not Exist)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">482 (Loop Detected)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">483 (Too Many Hops)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">484 (Address Incomplete)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">485 (Ambiguous)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">486 (Busy Here)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">487 (Request Terminated)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">488 (Not Acceptable Here)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">491 (Request Pending)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">493 (Undecipherable)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">500 (Internal Server Error)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">501 (Not Implemented)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">502 (Bad Gateway)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">503 (Service Unavailable)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">504 (Server Time-out)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">505 (SIP Version not supported)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">513 (Message Too Large)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">600 (Busy Everywhere)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">603 (Decline)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">604 (Does not exist anywhere)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">606 (Not Acceptable)</str>
- </item>
- </defaultMessagesList>
- <messagesList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_EditAutoHeaderRule_messagesList" itemtype="ixConfig"/>
- <autoHeaderTypeList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_EditAutoHeaderRule_autoHeaderTypeList" itemtype="ixConfig">
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">Request-Uri</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">Via</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">From</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">To</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">Call-ID</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">CSeq</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">Contact</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">Content-Length</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">Route</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">Record-Route</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">Authorization</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">Proxy-Authorization</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">Referred-By</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">Replaces</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">Event</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">RAck</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">RSeq</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">Refer-To</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">Subscription-State</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">WWW-Authenticate</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">Also</str>
- </item>
- </autoHeaderTypeList>
- <autoHeaderType type="str">To</autoHeaderType>
- <option type="int">0</option>
- <appendToUri type="bool">False</appendToUri>
- <headerValue type="str"></headerValue>
- <parsedHeader ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_EditAutoHeaderRule_parsedHeader" itemtype="ixConfig"/>
- <valid type="bool">True</valid>
- </editAutoHeaderRule>
- <autoHeadersSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_AutoHeadersSettings">
- <enableAutoHeaders type="bool">False</enableAutoHeaders>
- <tableRules ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_AutoHeadersSettings_tableRules" itemtype="ixConfig"/>
- <reqAutoHeadRules ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_AutoHeadersSettings_reqAutoHeadRules" itemtype="ixConfig"/>
- <respAutoHeadRules ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_AutoHeadersSettings_respAutoHeadRules" itemtype="ixConfig"/>
- </autoHeadersSettings>
- <sipAdvSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_SipAdvancedSettings">
- <overrideTCPLocalPort type="bool">False</overrideTCPLocalPort>
- <tcpLocalPortStart type="int">40000</tcpLocalPortStart>
- <tcpLocalPortEnd type="int">60000</tcpLocalPortEnd>
- <tcpLocalPortStep type="int">1</tcpLocalPortStep>
- <closeNonsecureTcpConnectionsEnable type="bool">False</closeNonsecureTcpConnectionsEnable>
- <closeIdleTcpConnectionsEnable type="bool">False</closeIdleTcpConnectionsEnable>
- <tcpIdlePeriod type="int">10</tcpIdlePeriod>
- <donotCloseTCPInsideCallEnable type="bool">False</donotCloseTCPInsideCallEnable>
- <recordingServerEnable type="bool">False</recordingServerEnable>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">tcpIdlePeriod</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tcpEndPortLabel</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">tcpIdlePeriodLabel</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">donotCloseTCPInsideCallEnable</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tcpPortStepLabel</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">tcpLocalPortStep</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">tcpLocalPortEnd</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">tcpStartPortLabel</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">tcpLocalPortStart</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">closeIdleTcpConnectionsEnable</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">recordingServerEnable</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">overrideTCPLocalPort</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">closeNonsecureTcpConnectionsEnable</item>
- <item ref="1"/>
- </item>
- </_dict>
- </state>
- </sipAdvSettings>
- </pm>
- <objectID type="int">2</objectID>
- <_apiUniqueId type="int">15470</_apiUniqueId>
- <uniqueID type="int">27</uniqueID>
- <commandIdCounter type="int">11</commandIdCounter>
- <networkPluginSettings ver="[0]" type="ixNetworkActivityPluginSupport">
- <serializedNetworkSettingsMap ver="[0, [0, [0]]]" type="ixOrderedDict">
- <_dict type="list"/>
- </serializedNetworkSettingsMap>
- <protocolName type="str">VoIP</protocolName>
- </networkPluginSettings>
- </item>
- <item ver="[34, [1, [0, [6, [1, [0, [0]]]], [0, [0]]], [0]]]" oid="19" type="#VoIP_Peer_plugin$Plugin">
- <enable type="bool">True</enable>
- <name type="str">CALLING</name>
- <activityFunction type="NoneType">None</activityFunction>
- <needToRefreshStatViews type="bool">False</needToRefreshStatViews>
- <activeRole type="str">Both</activeRole>
- <cmdListLoops type="int">0</cmdListLoops>
- <sources ver="[0, [3, [0, [0, [0], [0]], [0]]]]" type="ixSourceList" itemtype="ixSource"/>
- <destinations ver="[1, [3, [0, [0, [0], [0]], [0]]]]" type="ixDestinationList" itemtype="ixDestination">
- <item ver="[0, [3, [1, [0, [0]]]]]" type="ixAgentDestination">
- <name type="str">VoIP2_CALLED</name>
- <portMapPolicy type="str">protocolSpecific</portMapPolicy>
- <sameAs type="str"></sameAs>
- <validPortMapPolicies type="list">
- <item type="str">protocolSpecific</item>
- </validPortMapPolicies>
- <inUse type="bool">True</inUse>
- <customPortMap type="NoneType">None</customPortMap>
- <sourceCommunity ref="5"/>
- <destinationCommunity ver="[1, [23, [0, [1, [0, [0]]]]]]" oid="23" type="ixNetTraffic">
- <name type="str">VoIP2@VM2</name>
- <column type="NoneType">None</column>
- <scenarioElementType type="str">netTraffic</scenarioElementType>
- <enable type="bool">True</enable>
- <role type="str">Peer</role>
- <networkType type="str">ethernet</networkType>
- <activityFunction type="str">ipTrafficAgent</activityFunction>
- <activeRole type="str">Both</activeRole>
- <networkActivityList ver="[0, [0, [0, [3, [0, [0, [0], [0]], [0]]]]]]" type="ixNetworkActivityList" itemtype="ixNetworkActivity"/>
- <activityGroupList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="ixActivityGroupList" itemtype="ixActivityGroup"/>
- <traffic ver="[6, [1, [0, [0]]]]" type="ixActivityModel">
- <resourceSyncTimeStamp type="NoneType">None</resourceSyncTimeStamp>
- <name type="str">VoIP2</name>
- <role type="str">Peer</role>
- <activityFunction type="str">ipTrafficAgent</activityFunction>
- <payload type="NoneType">None</payload>
- <agentList ver="[2, [0, [0, [3, [0, [0, [0], [0]], [0]]]]]]" type="_agentListSequenceContainer" itemtype="ixAgent">
- <item ver="[34, [1, [0, [6, [1, [0, [0]]]], [0, [0]]], [0]]]" oid="10" type="#VoIP_Peer_plugin$Plugin">
- <enable type="int">1</enable>
- <name type="str">CALLED</name>
- <activityFunction type="NoneType">None</activityFunction>
- <needToRefreshStatViews type="bool">False</needToRefreshStatViews>
- <activeRole type="str">Both</activeRole>
- <cmdListLoops type="int">0</cmdListLoops>
- <sources ver="[0, [3, [0, [0, [0], [0]], [0]]]]" type="ixSourceList" itemtype="ixSource"/>
- <destinations ver="[1, [3, [0, [0, [0], [0]], [0]]]]" type="ixDestinationList" itemtype="ixDestination"/>
- <flowPercentage type="float">100.0</flowPercentage>
- <uniqueID type="int">43</uniqueID>
- <pm ver="[0, [1, [0.1, [1, [0, [0]]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyMap_VoIP">
- <szPluginVersion type="str">4.10</szPluginVersion>
- <ceCommands ver="[1, [0, [0, [3, [0, [0, [0], [0]], [0]]]], [0, [0, [3, [0, [0, [0], [0]], [0]]]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_VoIP_ceCommands" itemtype="ixConfig">
- <item ver="[0, [0, [0, [0.1, [1, [0, [0]]]], [0, [1, [0, [0]]]]], [0, [0, [1, [0, [0]]]]]], [0, [0, [0, [0, [1, [0, [0]]]]]]]]" type="#Pdk.ixPdkCommands$ixPropertyCommandStart">
- <commandId type="int">-2</commandId>
- <commandType type="str">START</commandType>
- <cmdName type="str">Start</cmdName>
- <outputList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="ixCommandOutputList" itemtype="ixCommandOutput">
- <item ver="[1, [1, [0, [0]]]]" type="ixCommandOutput">
- <name type="str">Output1</name>
- <outputType type="int">0</outputType>
- <destCmdId type="int">3</destCmdId>
- <objectID type="int">0</objectID>
- <destinationCommandIdx type="int">2</destinationCommandIdx>
- </item>
- </outputList>
- </item>
- <item ver="[0, [0, [0, [0.1, [1, [0, [0]]]], [0, [1, [0, [0]]]]], [0, [0, [1, [0, [0]]]]]], [0, [0, [0, [0, [1, [0, [0]]]]]]]]" type="#Pdk.ixPdkCommands$ixPropertyCommandStop">
- <commandId type="int">-3</commandId>
- <commandType type="str">STOP</commandType>
- <cmdName type="str">Stop</cmdName>
- <outputList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="ixCommandOutputList" itemtype="ixCommandOutput"/>
- </item>
- <item ver="[0, [0, [0, [0.1, [1, [0, [0]]]], [0, [1, [0, [0]]]]], [0, [0, [1, [0, [0]]]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_Procedure">
- <commandId type="int">3</commandId>
- <commandType type="str">Procedure</commandType>
- <cmdName type="str">SIP ReceiveCall (#3)</cmdName>
- <outputList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="ixCommandOutputList" itemtype="ixCommandOutput">
- <item ver="[1, [1, [0, [0]]]]" type="ixCommandOutput">
- <name type="str">OK</name>
- <outputType type="int">0</outputType>
- <destCmdId type="int">17</destCmdId>
- <objectID type="int">1</objectID>
- <destinationCommandIdx type="int">4</destinationCommandIdx>
- </item>
- <item ver="[1, [1, [0, [0]]]]" type="ixCommandOutput">
- <name type="str">Error</name>
- <outputType type="int">1</outputType>
- <destCmdId type="int">-3</destCmdId>
- <objectID type="int">2</objectID>
- <destinationCommandIdx type="int">1</destinationCommandIdx>
- </item>
- </outputList>
- </item>
- <item ver="[0, [0, [0, [0.1, [1, [0, [0]]]], [0, [1, [0, [0]]]]], [0, [0, [1, [0, [0]]]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_Procedure">
- <commandId type="int">11</commandId>
- <commandType type="str">Procedure</commandType>
- <cmdName type="str">SIP EndCall Receive (#4)</cmdName>
- <outputList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="ixCommandOutputList" itemtype="ixCommandOutput">
- <item ver="[1, [1, [0, [0]]]]" type="ixCommandOutput">
- <name type="str">OK</name>
- <outputType type="int">0</outputType>
- <destCmdId type="int">-3</destCmdId>
- <objectID type="int">1</objectID>
- <destinationCommandIdx type="int">1</destinationCommandIdx>
- </item>
- <item ver="[1, [1, [0, [0]]]]" type="ixCommandOutput">
- <name type="str">Error</name>
- <outputType type="int">1</outputType>
- <destCmdId type="int">-3</destCmdId>
- <objectID type="int">2</objectID>
- <destinationCommandIdx type="int">1</destinationCommandIdx>
- </item>
- </outputList>
- </item>
- <item ver="[0, [1, [0, [0, [0.1, [1, [0, [0]]]], [0, [1, [0, [0]]]]], [0, [0, [1, [0, [0]]]]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CommandEx">
- <commandId type="int">17</commandId>
- <commandType type="str">CommandEx</commandType>
- <cmdName type="str">Voice Session (#2)</cmdName>
- <outputList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="ixCommandOutputList" itemtype="ixCommandOutput">
- <item ver="[1, [1, [0, [0]]]]" type="ixCommandOutput">
- <name type="str">OK</name>
- <outputType type="int">0</outputType>
- <destCmdId type="int">11</destCmdId>
- <objectID type="int">1</objectID>
- <destinationCommandIdx type="int">3</destinationCommandIdx>
- </item>
- <item ver="[1, [1, [0, [0]]]]" type="ixCommandOutput">
- <name type="str">Error</name>
- <outputType type="int">1</outputType>
- <destCmdId type="int">11</destCmdId>
- <objectID type="int">2</objectID>
- <destinationCommandIdx type="int">3</destinationCommandIdx>
- </item>
- </outputList>
- <cmdType type="str">RTPVoiceSession</cmdType>
- </item>
- </ceCommands>
- <activityLink ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_ActivityLinkInfo">
- <name type="str">VoiceLink1</name>
- <activitiesCount type="int">2</activitiesCount>
- </activityLink>
- <triggers ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TriggerConfig">
- <triggersInCount type="int">3</triggersInCount>
- <triggersOutCount type="int">5</triggersOutCount>
- </triggers>
- <globalSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_GlobalSettings">
- <globalExecStg ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_GlobalExecSettings">
- <setAborted type="bool">False</setAborted>
- <setAllFailed type="bool">False</setAllFailed>
- <trigTimeout type="int">600000</trigTimeout>
- <notAbortOnTimeout type="bool">False</notAbortOnTimeout>
- <limitErrors type="bool">False</limitErrors>
- <maxErrors type="int">1</maxErrors>
- <limitArrayVarSize type="bool">False</limitArrayVarSize>
- <maxArrayVarSize type="int">10</maxArrayVarSize>
- </globalExecStg>
- <globalSIPStg ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_GlobalSIPSettings">
- <disableTCP type="bool">False</disableTCP>
- <prefQOP type="int">0</prefQOP>
- <warnAsError type="bool">False</warnAsError>
- <limitQueueSize type="bool">True</limitQueueSize>
- <maxChannelsInQueue type="int">25</maxChannelsInQueue>
- <enableSIPLogging type="bool">False</enableSIPLogging>
- <limitSIPLoggingChannels type="bool">False</limitSIPLoggingChannels>
- <maxSIPLoggingChannels type="int">10</maxSIPLoggingChannels>
- <minSIPLoggingChannels type="int">0</minSIPLoggingChannels>
- <voipPeerLogSettings type="int">0</voipPeerLogSettings>
- <voipPeerLogExpForChannels type="str"></voipPeerLogExpForChannels>
- <abortLoopOnTriggerTimeout type="bool">False</abortLoopOnTriggerTimeout>
- </globalSIPStg>
- <globalRTPStg ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_GlobalRTPSettings">
- <transmMode type="int">0</transmMode>
- <playMode type="int">0</playMode>
- <repeatCount type="int">1</repeatCount>
- <repeatTime type="int">1000</repeatTime>
- <timeUnit type="int">0</timeUnit>
- <volume type="int">-20</volume>
- <playModePathConf type="int">0</playModePathConf>
- <repeatCountPathConf type="int">0</repeatCountPathConf>
- <repeatTimePathConf type="int">10</repeatTimePathConf>
- <timeUnitPathConf type="int">0</timeUnitPathConf>
- <toneDurationPathConf type="int">200</toneDurationPathConf>
- <interToneDelayPathConf type="int">200</interToneDelayPathConf>
- <toneAmplitudePathConf type="int">-10</toneAmplitudePathConf>
- <firstToneTimeoutPathConf type="int">4000</firstToneTimeoutPathConf>
- <interToneTimeoutPathConf type="int">2000</interToneTimeoutPathConf>
- <qovTalkExtraSilence type="int">500</qovTalkExtraSilence>
- <qovListenExtraDuration type="int">2000</qovListenExtraDuration>
- <downloadRTPCSV type="bool">True</downloadRTPCSV>
- <waitQoVScore type="bool">False</waitQoVScore>
- </globalRTPStg>
- <globalSTUNStg ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_GlobalSTUNSettings">
- <keepAliveInterval type="int">15</keepAliveInterval>
- </globalSTUNStg>
- <globalSKINNYStg ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_GlobalSKINNYSettings">
- <softKeyCount type="int">25</softKeyCount>
- <receiveVideo type="bool">False</receiveVideo>
- <transmitVideo type="bool">False</transmitVideo>
- </globalSKINNYStg>
- <globalT38Stg ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_GlobalT38Settings">
- <t30Log type="bool">False</t30Log>
- <t38Log type="bool">False</t38Log>
- <receivedImageLog type="bool">False</receivedImageLog>
- <logType type="int">0</logType>
- <logBegin type="int">1</logBegin>
- <logEnd type="int">10</logEnd>
- <channelRange type="str">[00-10]</channelRange>
- </globalT38Stg>
- </globalSettings>
- <info ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_Info">
- <userChannelsNo type="int">653520</userChannelsNo>
- <portInstances type="int">3</portInstances>
- <portInstanceIdx type="int">2</portInstanceIdx>
- <objectiveType type="str">activeUsers</objectiveType>
- <objectiveValue type="int">1000</objectiveValue>
- <maxAllowedObjective type="long">9223372036854775807</maxAllowedObjective>
- <firstSignalingFnID type="int">8</firstSignalingFnID>
- <enableRTPDest type="bool">False</enableRTPDest>
- <rtpPortDest type="str"></rtpPortDest>
- <rtpObjectiveValue type="int">32000</rtpObjectiveValue>
- <hasRtpFunction type="bool">False</hasRtpFunction>
- <hasVideoFunction type="bool">False</hasVideoFunction>
- <hasT38Function type="bool">False</hasT38Function>
- <hasMSRPFunction type="bool">False</hasMSRPFunction>
- <src ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_ActivityInfo">
- <name type="str">CALLED</name>
- <portCount type="int">1</portCount>
- <portCountRtp type="int">1</portCountRtp>
- <portCountT38 type="int">1</portCountT38>
- <portCountMSRP type="int">1</portCountMSRP>
- <ipRangeCount type="int">1</ipRangeCount>
- <ipCount type="int">1</ipCount>
- <ipRule type="int">0</ipRule>
- <ipRuleCh type="int">1</ipRuleCh>
- <port type="str">{{sipportcalled}}</port>
- <portRule type="int">0</portRule>
- <portRuleCh type="int">1</portRuleCh>
- <phone type="str">{{pncalled}}</phone>
- <aliases type="int">1</aliases>
- <phoneType type="int">0</phoneType>
- <phoneRule type="int">1</phoneRule>
- <phoneCount type="int">0</phoneCount>
- <telPar type="str"></telPar>
- <ipRangeCountRtp type="int">1</ipRangeCountRtp>
- <ipCountRtp type="int">1</ipCountRtp>
- <ipRuleRtp type="int">0</ipRuleRtp>
- <ipRuleChRtp type="int">1</ipRuleChRtp>
- <portRtp type="str">[10000-65535,4]</portRtp>
- <portT38 type="str">40000</portT38>
- <portMSRP type="str">2855</portMSRP>
- <portRuleRtp type="int">1</portRuleRtp>
- <portRuleChRtp type="int">1</portRuleChRtp>
- <ipRangeCountT38 type="int">1</ipRangeCountT38>
- <ipCountT38 type="int">1</ipCountT38>
- <ipRangeCountMSRP type="int">1</ipRangeCountMSRP>
- <ipCountMSRP type="int">1</ipCountMSRP>
- <symType type="int">1</symType>
- <enableTLS type="bool">False</enableTLS>
- <enableDTLS type="bool">False</enableDTLS>
- <enableTLS_MSRP type="bool">False</enableTLS_MSRP>
- <enableTLS_HTTP type="bool">False</enableTLS_HTTP>
- <tlsPort type="str">5061</tlsPort>
- <tlsDisableUdpAndTcp type="bool">True</tlsDisableUdpAndTcp>
- <nodeCount type="int">1</nodeCount>
- <coreCount type="int">2</coreCount>
- <nicCount type="int">1</nicCount>
- <gtpEnabled type="bool">False</gtpEnabled>
- <dcpEnabled type="bool">False</dcpEnabled>
- <rangeType type="int">0</rangeType>
- <calActivityID type="int">0</calActivityID>
- <layerName type="str">aptixia-T.03440c56.4e1a.4def.8406.ec64db91d4c1-L2EthernetPlugin-820b0582.6a4c.4109.bd5d.587621a43ce2-161.105.231.12;2;1default</layerName>
- </src>
- <dest ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_ActivityInfo">
- <name type="str"></name>
- <portCount type="int">1</portCount>
- <portCountRtp type="int">1</portCountRtp>
- <portCountT38 type="int">1</portCountT38>
- <portCountMSRP type="int">1</portCountMSRP>
- <ipRangeCount type="int">0</ipRangeCount>
- <ipCount type="int">0</ipCount>
- <ipRule type="int">0</ipRule>
- <ipRuleCh type="int">0</ipRuleCh>
- <port type="str"></port>
- <portRule type="int">0</portRule>
- <portRuleCh type="int">0</portRuleCh>
- <phone type="str"></phone>
- <aliases type="int">1</aliases>
- <phoneType type="int">0</phoneType>
- <phoneRule type="int">0</phoneRule>
- <phoneCount type="int">0</phoneCount>
- <telPar type="str"></telPar>
- <ipRangeCountRtp type="int">0</ipRangeCountRtp>
- <ipCountRtp type="int">0</ipCountRtp>
- <ipRuleRtp type="int">0</ipRuleRtp>
- <ipRuleChRtp type="int">0</ipRuleChRtp>
- <portRtp type="str"></portRtp>
- <portT38 type="str"></portT38>
- <portMSRP type="str">2855</portMSRP>
- <portRuleRtp type="int">0</portRuleRtp>
- <portRuleChRtp type="int">0</portRuleChRtp>
- <ipRangeCountT38 type="int">0</ipRangeCountT38>
- <ipCountT38 type="int">0</ipCountT38>
- <ipRangeCountMSRP type="int">1</ipRangeCountMSRP>
- <ipCountMSRP type="int">12</ipCountMSRP>
- <symType type="int">0</symType>
- <enableTLS type="bool">False</enableTLS>
- <enableDTLS type="bool">False</enableDTLS>
- <enableTLS_MSRP type="bool">False</enableTLS_MSRP>
- <enableTLS_HTTP type="bool">False</enableTLS_HTTP>
- <tlsPort type="str"></tlsPort>
- <tlsDisableUdpAndTcp type="bool">False</tlsDisableUdpAndTcp>
- <nodeCount type="int">1</nodeCount>
- <coreCount type="int">2</coreCount>
- <nicCount type="int">1</nicCount>
- <gtpEnabled type="bool">False</gtpEnabled>
- <dcpEnabled type="bool">False</dcpEnabled>
- <rangeType type="int">0</rangeType>
- <calActivityID type="int">0</calActivityID>
- <layerName type="str"></layerName>
- </dest>
- <useServerDest type="bool">False</useServerDest>
- <srvDomainDest type="str"></srvDomainDest>
- <srvAddrDest type="str"></srvAddrDest>
- <srvPortDest type="str">5060</srvPortDest>
- <cloudServerDest ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CloudServer">
- <name type="str"></name>
- <ipAddr type="str"></ipAddr>
- <rangeType type="str"></rangeType>
- <ipType type="str"></ipType>
- <port type="int">0</port>
- <attachedInfo type="str"></attachedInfo>
- <firstIp type="str"></firstIp>
- <netMask type="str"></netMask>
- <ipCount type="str"></ipCount>
- <ipStep type="str"></ipStep>
- </cloudServerDest>
- <transfer ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_ActivityInfo">
- <name type="str"></name>
- <portCount type="int">0</portCount>
- <portCountRtp type="int">0</portCountRtp>
- <portCountT38 type="int">0</portCountT38>
- <portCountMSRP type="int">0</portCountMSRP>
- <ipRangeCount type="int">0</ipRangeCount>
- <ipCount type="int">0</ipCount>
- <ipRule type="int">0</ipRule>
- <ipRuleCh type="int">0</ipRuleCh>
- <port type="str"></port>
- <portRule type="int">0</portRule>
- <portRuleCh type="int">0</portRuleCh>
- <phone type="str"></phone>
- <aliases type="int">0</aliases>
- <phoneType type="int">0</phoneType>
- <phoneRule type="int">0</phoneRule>
- <phoneCount type="int">0</phoneCount>
- <telPar type="str"></telPar>
- <ipRangeCountRtp type="int">0</ipRangeCountRtp>
- <ipCountRtp type="int">0</ipCountRtp>
- <ipRuleRtp type="int">0</ipRuleRtp>
- <ipRuleChRtp type="int">0</ipRuleChRtp>
- <portRtp type="str"></portRtp>
- <portT38 type="str"></portT38>
- <portMSRP type="str"></portMSRP>
- <portRuleRtp type="int">0</portRuleRtp>
- <portRuleChRtp type="int">0</portRuleChRtp>
- <ipRangeCountT38 type="int">0</ipRangeCountT38>
- <ipCountT38 type="int">0</ipCountT38>
- <ipRangeCountMSRP type="int">0</ipRangeCountMSRP>
- <ipCountMSRP type="int">0</ipCountMSRP>
- <symType type="int">0</symType>
- <enableTLS type="bool">False</enableTLS>
- <enableDTLS type="bool">False</enableDTLS>
- <enableTLS_MSRP type="bool">False</enableTLS_MSRP>
- <enableTLS_HTTP type="bool">False</enableTLS_HTTP>
- <tlsPort type="str"></tlsPort>
- <tlsDisableUdpAndTcp type="bool">False</tlsDisableUdpAndTcp>
- <nodeCount type="int">0</nodeCount>
- <coreCount type="int">1</coreCount>
- <nicCount type="int">1</nicCount>
- <gtpEnabled type="bool">False</gtpEnabled>
- <dcpEnabled type="bool">False</dcpEnabled>
- <rangeType type="int">0</rangeType>
- <calActivityID type="int">0</calActivityID>
- <layerName type="str"></layerName>
- </transfer>
- <useServerTransfer type="bool">False</useServerTransfer>
- <registrarSrvTransfer type="bool">False</registrarSrvTransfer>
- <srvAddrTransfer type="str"></srvAddrTransfer>
- <srvPortTransfer type="str">5060</srvPortTransfer>
- <cloudServerTransfer ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CloudServer">
- <name type="str"></name>
- <ipAddr type="str"></ipAddr>
- <rangeType type="str"></rangeType>
- <ipType type="str"></ipType>
- <port type="int">0</port>
- <attachedInfo type="str"></attachedInfo>
- <firstIp type="str"></firstIp>
- <netMask type="str"></netMask>
- <ipCount type="str"></ipCount>
- <ipStep type="str"></ipStep>
- </cloudServerTransfer>
- </info>
- <scenarioSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_ScenarioSettings">
- <scenarioFile type="str">.\SIPCall.tst</scenarioFile>
- <activeScenarioChannel type="int">1</activeScenarioChannel>
- <funcsCount type="int">18</funcsCount>
- <isModified type="int">66</isModified>
- <activityID type="int">8</activityID>
- <exportToRM type="int">0</exportToRM>
- </scenarioSettings>
- <executionSettings ver="[1, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_ExecutionSettings">
- <loopMode type="int">0</loopMode>
- <loopCount type="int">1</loopCount>
- <loopPreDelay type="int">0</loopPreDelay>
- <loopMidDelay type="int">0</loopMidDelay>
- <gracefulRampDown type="bool">True</gracefulRampDown>
- <rampdownSleep type="bool">False</rampdownSleep>
- <aliases type="int">1</aliases>
- <ipRule type="int">0</ipRule>
- <ipRuleCh type="int">1</ipRuleCh>
- <portRule type="int">0</portRule>
- <portRuleCh type="int">1</portRuleCh>
- <phoneRule type="int">1</phoneRule>
- <multipleUsersPerIO type="bool">True</multipleUsersPerIO>
- <rtpIpRule type="int">0</rtpIpRule>
- <rtpIpRuleCh type="int">1</rtpIpRuleCh>
- <rtpPortRule type="int">1</rtpPortRule>
- <rtpPortRuleCh type="int">1</rtpPortRuleCh>
- <dl_BUG type="bool">True</dl_BUG>
- <dl_TRACE type="bool">False</dl_TRACE>
- <dl_L_INFO type="bool">True</dl_L_INFO>
- <dl_L_ADV type="bool">False</dl_L_ADV>
- <dl_L_VRB type="bool">False</dl_L_VRB>
- <dl_T_IO type="bool">False</dl_T_IO>
- <dl_T_INFO type="bool">False</dl_T_INFO>
- <dl_T_ADV type="bool">False</dl_T_ADV>
- <dl_T_VRB type="bool">False</dl_T_VRB>
- <dl_TG_ADV type="bool">False</dl_TG_ADV>
- <dl_TG_VRB type="bool">False</dl_TG_VRB>
- <dl_Q_ADV type="bool">False</dl_Q_ADV>
- <dl_Q_VRB type="bool">False</dl_Q_VRB>
- <dl_S_FSM type="bool">False</dl_S_FSM>
- <dl_S_SER type="bool">False</dl_S_SER>
- <dl_S_SUA type="bool">False</dl_S_SUA>
- <dl_S_WAIT type="bool">False</dl_S_WAIT>
- <dl_S_SEND type="bool">False</dl_S_SEND>
- <dl_S_INFO type="bool">False</dl_S_INFO>
- <dl_S_ADV type="bool">False</dl_S_ADV>
- <dl_S_VRB type="bool">False</dl_S_VRB>
- <dl_R_DD type="bool">False</dl_R_DD>
- <dl_R_VRB type="bool">False</dl_R_VRB>
- <dl_R_PAR type="bool">False</dl_R_PAR>
- <dl_EE_VRB type="bool">False</dl_EE_VRB>
- <dl_EE_DD type="bool">False</dl_EE_DD>
- <dl_FLOW type="bool">False</dl_FLOW>
- <dl_M_IO type="bool">False</dl_M_IO>
- <dl_SDP_DD type="bool">False</dl_SDP_DD>
- <dl_1 type="bool">False</dl_1>
- <dl_2 type="bool">False</dl_2>
- <dl_3 type="bool">False</dl_3>
- <log_level type="int">9</log_level>
- <log_in_memory type="int">1</log_in_memory>
- <rtp_log_in_file type="int">1</rtp_log_in_file>
- <log_filesize type="int">32</log_filesize>
- <_gbDebugLogs type="bool">False</_gbDebugLogs>
- <ccExportProfile type="bool">False</ccExportProfile>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">_ipRule1</item>
- <item ref="2"/>
- </item>
- <item type="tuple">
- <item type="str">dl_S_ADV</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">loopMidDelay</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">dl_T_IO</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">dl_T_INFO</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">dl_S_SEND</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_rtpIpRule1</item>
- <item ref="2"/>
- </item>
- <item type="tuple">
- <item type="str">_estimatedBacklog</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">loopPreDelay</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">dl_S_VRB</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">dl_TG_ADV</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">log_filesize</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">rtp_log_in_file</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">dl_T_VRB</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">aliases</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">dl_Q_ADV</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">multipleUsersPerIO</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">log_level</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">rtpIpRule</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">dl_1</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">dl_3</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">dl_2</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">rampdownSleep</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_portRule1</item>
- <item ref="2"/>
- </item>
- <item type="tuple">
- <item type="str">dl_S_SER</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">dl_R_VRB</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">dl_L_ADV</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">dl_Q_VRB</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">portRuleCh</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">dl_S_INFO</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">rtpPortRule</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">dl_M_IO</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">dl_EE_DD</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">rtpIpRuleCh</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">dl_S_FSM</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">loopMode</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">gracefulRampDown</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">dl_FLOW</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">dl_BUG</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">dl_S_SUA</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">ipRule</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">ipRuleCh</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">phoneRule</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_rtpPortRule1</item>
- <item ref="2"/>
- </item>
- <item type="tuple">
- <item type="str">dl_R_PAR</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">loopCount</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">dl_S_WAIT</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">dl_SDP_DD</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">dl_TRACE</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_gbDebugLogs</item>
- <item ref="2"/>
- </item>
- <item type="tuple">
- <item type="str">rtpPortRuleCh</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">dl_TG_VRB</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">portRule</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">dl_L_INFO</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">dl_EE_VRB</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">dl_R_DD</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">dl_T_ADV</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">ccExportProfile</item>
- <item ref="2"/>
- </item>
- <item type="tuple">
- <item type="str">log_in_memory</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">dl_L_VRB</item>
- <item ref="1"/>
- </item>
- </_dict>
- </state>
- </executionSettings>
- <customActivityLinkSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_ixCustomActivityParameters">
- <enableDbgLog type="bool">False</enableDbgLog>
- <dbgLogChannels type="str">1-5</dbgLogChannels>
- <bhcaType type="int">0</bhcaType>
- <talkTime type="int">10000</talkTime>
- <channelsNo type="int">1</channelsNo>
- <callSetupTime type="int">500</callSetupTime>
- <callTeardownTime type="int">500</callTeardownTime>
- <interCallDuration type="int">4000</interCallDuration>
- <bhcaObjectiveValue type="int">1</bhcaObjectiveValue>
- <cpsOverwriteValueChecked type="int">0</cpsOverwriteValueChecked>
- <cpsTotalChannelsChecked type="int">0</cpsTotalChannelsChecked>
- <cpsOverwriteValue type="int">18</cpsOverwriteValue>
- <cpsType type="int">0</cpsType>
- <cpsTalkTime type="int">30000</cpsTalkTime>
- <cpsChannelsNo type="int">16750</cpsChannelsNo>
- <cpsTotalChannelsNo type="int">33500</cpsTotalChannelsNo>
- <cpsOverheadTime type="int">1500</cpsOverheadTime>
- <cpsInterCallDuration type="int">2000</cpsInterCallDuration>
- <cpsObjectiveValue type="int">500</cpsObjectiveValue>
- <cpsRegisterTime type="int">40</cpsRegisterTime>
- <cpsSplitTimeline type="int">0</cpsSplitTimeline>
- <lpsType type="int">0</lpsType>
- <lpsTalkTime type="int">800</lpsTalkTime>
- <lpsChannelsNo type="int">2150</lpsChannelsNo>
- <lpsOverheadTime type="int">1500</lpsOverheadTime>
- <lpsInterLoopDuration type="int">2000</lpsInterLoopDuration>
- <lpsObjectiveValue type="int">500</lpsObjectiveValue>
- <lpsActiveChannel type="int">0</lpsActiveChannel>
- <activeUsersTalkTime type="int">30000</activeUsersTalkTime>
- <activeUsersNo type="int">{{activecalls}}</activeUsersNo>
- <activeUsersChannel type="int">0</activeUsersChannel>
- <activeUsersObjectiveValue type="int">{{activecalls}}</activeUsersObjectiveValue>
- </customActivityLinkSettings>
- <rtpWaveFiles ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_RTPWaveFiles">
- <wavesCount type="int">1</wavesCount>
- </rtpWaveFiles>
- <rtpTones ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_RTPTones">
- <usedTonesCount type="int">0</usedTonesCount>
- <customTonesCount type="int">35</customTonesCount>
- <seqCustTonesCount type="int">0</seqCustTonesCount>
- </rtpTones>
- <codecCustomPopup ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CodecCustomPopup">
- <captureFile type="str">Default.cap</captureFile>
- <parseRTPPort type="bool">False</parseRTPPort>
- <parseSSRC type="bool">False</parseSSRC>
- <rtpPort type="int">10000</rtpPort>
- <ssrc type="str">0x8078C5D3</ssrc>
- </codecCustomPopup>
- <codecCustomPropDlg ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CodecCustomPropDlg"/>
- <codecSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CodecSettings">
- <codecs ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_CodecSettings_codecs" itemtype="ixConfig">
- <item ver="[0, [0, [0.1, [1, [0, [0]]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CodecG711u">
- <dPayloadIn type="int">0</dPayloadIn>
- <dPayloadOut type="int">0</dPayloadOut>
- <frameSize type="int">160</frameSize>
- </item>
- <item ver="[0, [0, [0.1, [1, [0, [0]]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CodecG711a">
- <dPayloadIn type="int">8</dPayloadIn>
- <dPayloadOut type="int">8</dPayloadOut>
- <frameSize type="int">160</frameSize>
- </item>
- </codecs>
- <codecs_number type="int">2</codecs_number>
- <_gbVideoCodecs type="bool">False</_gbVideoCodecs>
- <videoPayloadType type="int">96</videoPayloadType>
- <_gbDataCodecs type="bool">False</_gbDataCodecs>
- <dataCodecs ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_CodecSettings_dataCodecs" itemtype="ixConfig">
- <item ver="[0, [0, [0.1, [1, [0, [0]]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_Rtp2833Events">
- <dPayloadType type="int">100</dPayloadType>
- </item>
- <item ver="[0, [0, [0.1, [1, [0, [0]]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_Rtp2833Tones">
- <dPayloadType type="int">101</dPayloadType>
- </item>
- </dataCodecs>
- <crtCustomCodecIndex type="int">-1</crtCustomCodecIndex>
- </codecSettings>
- <rtpSettings ver="[7, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_RTPSettings">
- <rtpPort type="str">[10000-65535,4]</rtpPort>
- <enableAdvStatCalc type="bool">False</enableAdvStatCalc>
- <enableRTCP type="bool">False</enableRTCP>
- <enableRTCPMux type="bool">False</enableRTCPMux>
- <chEnableHwAcc type="bool">False</chEnableHwAcc>
- <chDisableHwAcc type="bool">False</chDisableHwAcc>
- <enableHwAcc type="bool">False</enableHwAcc>
- <enableIxStack type="bool">False</enableIxStack>
- <enableNBExec type="bool">False</enableNBExec>
- <enablePerStream type="bool">False</enablePerStream>
- <enableMDI type="bool">False</enableMDI>
- <enableRTP type="bool">False</enableRTP>
- <enableMediaSDPParams type="bool">False</enableMediaSDPParams>
- <audioB_option type="bool">False</audioB_option>
- <audioB_value type="str">AS:48</audioB_value>
- <audioRR_option type="bool">False</audioRR_option>
- <audioRR_value type="str">800</audioRR_value>
- <audioRS_option type="bool">False</audioRS_option>
- <audioRS_value type="str">800</audioRS_value>
- <videoB_option type="bool">False</videoB_option>
- <videoB_value type="str">AS:384</videoB_value>
- <videoRR_option type="bool">False</videoRR_option>
- <videoRR_value type="str">6400</videoRR_value>
- <videoRS_option type="bool">False</videoRS_option>
- <videoRS_value type="str">6400</videoRS_value>
- <textB_option type="bool">False</textB_option>
- <textB_value type="str">AS:48</textB_value>
- <textRR_option type="bool">False</textRR_option>
- <textRR_value type="str">800</textRR_value>
- <textRS_option type="bool">False</textRS_option>
- <textRS_value type="str">800</textRS_value>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">videoRR_value</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">_gbVideoSDPParams</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">textRS_value</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">jitMs</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_gbAudioSDPParams</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">ixnamSupported</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">dedicatedCoreRange</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enableRTP</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">rtpTosVal</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">channelTypeQoV</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enableMediaSDPParams</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_gbTextSDPParams</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">activityIdQoV</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">rtpPort</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">audioRS_option</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">useJitComp</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">dedicatedCoreRangeLength</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">audioB_option</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">audioB_value</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">portIPsQoV</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">audioRS_value</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">enableHwAcc</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">chEnableHwAcc</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">channelsQoVPerZionPort</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">videoRR_option</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">rtpTos</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enableRTCPMux</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">textRR_option</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">silenceMode</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_gbMediaSDPParams</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">textB_option</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enableQoV</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">jitCMs</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">valueQoV</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enableRTCP</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">maxMosStreams</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enableMDI</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enableIxStack</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enableOWD</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">unitsQoV</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">serviceEnabledQoV</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">chDisableHwAcc</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">customTosGroupBox</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">audioRR_option</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enablePerStream</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">limitMos</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">useMos</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">textRR_value</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">customTos</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">videoB_value</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">mosInterval</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enableAdvStatCalc</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">useJitter</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">useSilence</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">metricsQoV</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">videoRS_option</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">videoRS_value</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">jitCMaxDrop</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">audioRR_value</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">textB_value</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">enableTosRtp</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">videoB_option</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">activityNameQoV</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">textRS_option</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enableNBExec</item>
- <item ref="1"/>
- </item>
- </_dict>
- </state>
- </rtpSettings>
- <rtcpSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_RTCPSettings">
- <rtcpIgnoreSSRC type="bool">False</rtcpIgnoreSSRC>
- <rtcpCNAMEType type="int">0</rtcpCNAMEType>
- <hasSDESName type="bool">False</hasSDESName>
- <hasSDESTool type="bool">False</hasSDESTool>
- <rtcpSDESTool type="str">IxLoad</rtcpSDESTool>
- <rtcpReceiverTimer type="int">2000</rtcpReceiverTimer>
- <rtcpSenderTimer type="int">2000</rtcpSenderTimer>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">rtcpSDESTool</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">rtcpSenderTimer</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">rtcpCNAMEType</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">hasSDESTool</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">rtcpReceiverTimer</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">rtcpIgnoreSSRC</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">hasSDESName</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enableRTCPMux2</item>
- <item ref="1"/>
- </item>
- </_dict>
- </state>
- </rtcpSettings>
- <audioSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_AudioSettings">
- <enableAudio type="bool">False</enableAudio>
- <_gbEnableAudio type="bool">False</_gbEnableAudio>
- <enableAudioOWD type="bool">False</enableAudioOWD>
- <useJitter type="bool">False</useJitter>
- <_JB1 type="bool">False</_JB1>
- <jitMs type="int">20</jitMs>
- <useJitComp type="bool">False</useJitComp>
- <jitCMs type="int">1000</jitCMs>
- <jitCMaxDrop type="int">7</jitCMaxDrop>
- <dodName type="str">rtp_esmad-asordo-l_2170</dodName>
- <useMos type="bool">False</useMos>
- <useSilence type="bool">False</useSilence>
- <silenceMode type="int">1</silenceMode>
- <enableTosRtp type="bool">False</enableTosRtp>
- <rtpTos type="int">1</rtpTos>
- <customTosGroupBox type="bool">False</customTosGroupBox>
- <customTos type="str">0x20</customTos>
- <rtpTosVal type="int">32</rtpTosVal>
- <_COV1 type="bool">False</_COV1>
- <useQoV type="bool">False</useQoV>
- <qovAnalize type="int">5</qovAnalize>
- <qovSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_QoVSettings">
- <activityIdQoV type="int">0</activityIdQoV>
- <enableQoV type="bool">False</enableQoV>
- <_gbEnableQoV type="bool">False</_gbEnableQoV>
- <serviceEnabledQoV type="bool">False</serviceEnabledQoV>
- <activityNameQoV type="str"></activityNameQoV>
- <portIPsQoV type="str"></portIPsQoV>
- <unitsQoV type="int">0</unitsQoV>
- <valueQoV type="int">100</valueQoV>
- <channelTypeQoV type="int">0</channelTypeQoV>
- <metricsQoV type="int">0</metricsQoV>
- <channelsQoVPerZionPort type="int">0</channelsQoVPerZionPort>
- <radioBtnQoVASR type="int">0</radioBtnQoVASR>
- <languageASR type="str">English(US)</languageASR>
- </qovSettings>
- <activityIdQoV type="int">0</activityIdQoV>
- <enableQoV type="bool">False</enableQoV>
- <_gbEnableQoV type="bool">False</_gbEnableQoV>
- <serviceEnabledQoV type="bool">False</serviceEnabledQoV>
- <activityNameQoV type="str"></activityNameQoV>
- <portIPsQoV type="str"></portIPsQoV>
- <unitsQoV type="int">0</unitsQoV>
- <valueQoV type="int">100</valueQoV>
- <channelTypeQoV type="int">0</channelTypeQoV>
- <metricsQoV type="int">0</metricsQoV>
- <channelsQoVPerZionPort type="int">0</channelsQoVPerZionPort>
- <radioBtnQoVASR type="int">0</radioBtnQoVASR>
- <languageASR type="str">English(US)</languageASR>
- <audioClip type="str">US_042.wav</audioClip>
- <_audioFormat type="str">Format: PCM, Duration: 32785 ms, Size: 524556 bytes</_audioFormat>
- <outputLevel type="int">-20</outputLevel>
- <_gbOutputLevel type="bool">False</_gbOutputLevel>
- <playTypeAudio type="int">0</playTypeAudio>
- <audioDuration type="int">10</audioDuration>
- <audioDurationUnit type="int">1</audioDurationUnit>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">_gbEnableQoV</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">channelTypeQoV</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">pesqPolqa</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enablePTT</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enableP56</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">qovAnalize</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">channelsQoVPerZionPort</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_COV1</item>
- <item ref="4"/>
- </item>
- <item type="tuple">
- <item type="str">useTelchemy</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">activityIdQoV</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">rtpTosVal</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">useJitComp</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">audioDuration</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">_JB1</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">enableAudio</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enableTosRtp</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">portIPsQoV</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_gbQoVMetrics</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">dodName</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">jitMs</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">_gbASRLanguage</item>
- <item ref="2"/>
- </item>
- <item type="tuple">
- <item type="str">rtpTos</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">radioBtnQoVASR</item>
- <item ref="2"/>
- </item>
- <item type="tuple">
- <item type="str">silenceMode</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">playTypeAudio</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">useQoV</item>
- <item ref="2"/>
- </item>
- <item type="tuple">
- <item type="str">activityNameQoV</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enableQoV</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">jitCMs</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">valueQoV</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_gbOutputLevel</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">unitsQoV</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">serviceEnabledQoV</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">audioClip</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">languageASR</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">customTosGroupBox</item>
- <item ref="2"/>
- </item>
- <item type="tuple">
- <item type="str">audioDurationUnit</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">useMos</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">customTos</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">qovSettings</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">useJitter</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">useSilence</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">metricsQoV</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">jitCMaxDrop</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">channelsQoV</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enableAudioOWD</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_audioFormat</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_gbEnableAudio</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">outputLevel</item>
- <item ref="1"/>
- </item>
- </_dict>
- </state>
- </audioSettings>
- <editTos ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_EditTos">
- <bits012 type="int">0</bits012>
- <minDelay type="bool">False</minDelay>
- <maxThroughput type="bool">False</maxThroughput>
- <maxReliability type="bool">False</maxReliability>
- <_gbBtnTosBit7_0 type="bool">False</_gbBtnTosBit7_0>
- <_gbBtnTosBit7_1 type="bool">False</_gbBtnTosBit7_1>
- <_gbBtnTosBit6_0 type="bool">False</_gbBtnTosBit6_0>
- <_gbBtnTosBit6_1 type="bool">False</_gbBtnTosBit6_1>
- <_gbBtnTosBit5_0 type="bool">False</_gbBtnTosBit5_0>
- <_gbBtnTosBit5_1 type="bool">False</_gbBtnTosBit5_1>
- <_gbBtnTosBit4_0 type="bool">False</_gbBtnTosBit4_0>
- <_gbBtnTosBit4_1 type="bool">False</_gbBtnTosBit4_1>
- <_gbBtnTosBit3_0 type="bool">False</_gbBtnTosBit3_0>
- <_gbBtnTosBit3_1 type="bool">False</_gbBtnTosBit3_1>
- <_gbBtnTosBit2_0 type="bool">False</_gbBtnTosBit2_0>
- <_gbBtnTosBit2_1 type="bool">False</_gbBtnTosBit2_1>
- <_gbDisabledBtns type="bool">False</_gbDisabledBtns>
- </editTos>
- <srtpSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_SRTPSettings">
- <bEnableSRTP type="bool">False</bEnableSRTP>
- <bEnableVideoSRTP type="bool">False</bEnableVideoSRTP>
- <bEnableTextSRTP type="bool">False</bEnableTextSRTP>
- <bDisableSRTCPEncryption type="bool">False</bDisableSRTCPEncryption>
- <bDisableSRTPEncryption type="bool">False</bDisableSRTPEncryption>
- <bDisableSRTPAuthentication type="bool">False</bDisableSRTPAuthentication>
- <bDisableValidations type="bool">False</bDisableValidations>
- <bAllowOnlySecureStreams type="bool">False</bAllowOnlySecureStreams>
- <bIncludeMKI type="bool">False</bIncludeMKI>
- <bEnablePreencryption type="bool">False</bEnablePreencryption>
- <bDisableMasterSalt type="bool">False</bDisableMasterSalt>
- <bStaticMasterKeySalt type="bool">False</bStaticMasterKeySalt>
- <_masterKeySelection type="int">0</_masterKeySelection>
- <staticSingleKeySalt type="str"></staticSingleKeySalt>
- <staticKeyFile type="str"></staticKeyFile>
- <_enableSRTP type="bool">False</_enableSRTP>
- <_useStaticKey type="bool">False</_useStaticKey>
- <_singleMasterKeyGrp type="bool">False</_singleMasterKeyGrp>
- <_multipleMasterKeysGrp type="bool">False</_multipleMasterKeysGrp>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">bEnableSRTP</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_singleMasterKeyGrp</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">bDisableSRTPEncryption</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">bDisableSRTPAuthentication</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">bDisableValidations</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_useStaticKey</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">bEnablePreencryption</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">staticSingleKeySalt</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_enableSRTP</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">bStaticMasterKeySalt</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">staticKeyFile</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">bDisableMasterSalt</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_multipleMasterKeysGrp</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">bAllowOnlySecureStreams</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">bDisableSRTCPEncryption</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">bEnableVideoSRTP</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">bIncludeMKI</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">bEnableTextSRTP</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_masterKeySelection</item>
- <item ref="1"/>
- </item>
- </_dict>
- </state>
- </srtpSettings>
- <videoClips ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_VideoClips">
- <videoClipsInfo ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_VideoClips_videoClipsInfo" itemtype="ixConfig"/>
- <videoClipsInfoLength type="int">0</videoClipsInfoLength>
- <H323MaxProfile type="int">0</H323MaxProfile>
- <H323MaxLevel type="int">0</H323MaxLevel>
- <H323MaxBitRate type="int">0</H323MaxBitRate>
- <H323Packetization type="int">0</H323Packetization>
- <MaxProfileIdc type="int">66</MaxProfileIdc>
- <MaxProfileIop type="int">0</MaxProfileIop>
- <MaxLevel type="int">1</MaxLevel>
- </videoClips>
- <advancedVideo ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_AdvancedVideoSettings">
- <enableCustomMaxMBPS type="bool">False</enableCustomMaxMBPS>
- <customMaxMBPS type="int">0</customMaxMBPS>
- <enableCustomMaxFS type="bool">False</enableCustomMaxFS>
- <customMaxFS type="int">0</customMaxFS>
- <enableCustomMaxDPB type="bool">False</enableCustomMaxDPB>
- <customMaxDPB type="int">0</customMaxDPB>
- <enableCustomMaxBRandCPB type="bool">False</enableCustomMaxBRandCPB>
- <customMaxBRandCPB type="int">0</customMaxBRandCPB>
- <enableMaxStaticMBPS type="bool">False</enableMaxStaticMBPS>
- <maxStaticMBPS type="int">0</maxStaticMBPS>
- <enableMaxRcmdNalUnitSize type="bool">False</enableMaxRcmdNalUnitSize>
- <maxRcmdNalUnitSize type="int">0</maxRcmdNalUnitSize>
- <enableMaxNalUnitSize type="bool">False</enableMaxNalUnitSize>
- <maxNalUnitSize type="int">0</maxNalUnitSize>
- </advancedVideo>
- <videoSettings ver="[1, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_VideoSettings">
- <enableVideo type="bool">False</enableVideo>
- <enableVideoOWD type="bool">False</enableVideoOWD>
- <videoMaxSessions type="int">1</videoMaxSessions>
- <_gbEnableVideo type="bool">False</_gbEnableVideo>
- <videoClip type="str">Fire_avc.mp4</videoClip>
- <_videoFormat type="str">Codec: H264, Duration: 12800 ms, Size: 2012176 bytes, Bitrate: 1225 kbps</_videoFormat>
- <playTypeVideo type="int">0</playTypeVideo>
- <videoDuration type="int">5</videoDuration>
- <videoDurationUnit type="int">1</videoDurationUnit>
- <useConference type="bool">False</useConference>
- <_gbUseConference type="bool">False</_gbUseConference>
- <rotationScheme type="int">0</rotationScheme>
- <confVideoDuration type="int">1</confVideoDuration>
- <confVideoDurationUnit type="int">1</confVideoDurationUnit>
- <confDuration type="int">1</confDuration>
- <confDurationUnit type="int">1</confDurationUnit>
- <btnTelepresence type="bool">False</btnTelepresence>
- <_gbUseTelepresence type="bool">False</_gbUseTelepresence>
- <tipSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_VideoTelepresenceSettings">
- <tipEndpointType type="int">1</tipEndpointType>
- <tipResolution type="int">1</tipResolution>
- <tipVersion type="int">1</tipVersion>
- <tipSyntheticPayload type="bool">False</tipSyntheticPayload>
- <tipMoreClips type="bool">False</tipMoreClips>
- <_gbTipMoreClips type="int">0</_gbTipMoreClips>
- <tipVideoClip2 type="str">Fire_avc.mp4</tipVideoClip2>
- <tipRotationScheme type="int">0</tipRotationScheme>
- <tipConfDuration type="int">1</tipConfDuration>
- <tipConfDurationUnit type="int">1</tipConfDurationUnit>
- <tipAudioDuration type="int">1</tipAudioDuration>
- <tipAudioDurationUnit type="int">1</tipAudioDurationUnit>
- <_gbTipPresentation type="bool">False</_gbTipPresentation>
- <tipUsePresentationStream type="bool">False</tipUsePresentationStream>
- <tipVideoClip type="str">Fire_avc.mp4</tipVideoClip>
- <tipAudioClip type="str">US_042.wav</tipAudioClip>
- <tipStartAfter type="int">1</tipStartAfter>
- <tipStartAfterUnit type="int">1</tipStartAfterUnit>
- <tipDuration type="int">1</tipDuration>
- <tipDurationUnit type="int">1</tipDurationUnit>
- <tipPresentationRotation type="int">0</tipPresentationRotation>
- <tipLegacyMode type="bool">False</tipLegacyMode>
- <_gbTipLegacy type="int">0</_gbTipLegacy>
- <tipLegacyClip type="str">Fire_avc.mp4</tipLegacyClip>
- <tipLegacyModeAudio type="bool">False</tipLegacyModeAudio>
- <_gbTipLegacyAudio type="int">0</_gbTipLegacyAudio>
- <tipLegacyClipAudio type="str">US_042.wav</tipLegacyClipAudio>
- <tipG722Legacy type="bool">False</tipG722Legacy>
- <tipAudioActivityMetric type="bool">False</tipAudioActivityMetric>
- <tipDinamicChannels type="bool">False</tipDinamicChannels>
- <tipVideoRefresh type="bool">False</tipVideoRefresh>
- <tipInbandSets type="bool">False</tipInbandSets>
- <tipArithmetingCoding type="bool">False</tipArithmetingCoding>
- <tipLTRP type="bool">False</tipLTRP>
- <tipGDR type="bool">False</tipGDR>
- <tipHighProfile type="bool">False</tipHighProfile>
- <tipUnrestrictedMedia type="bool">False</tipUnrestrictedMedia>
- <tipRtcpFeedback type="bool">True</tipRtcpFeedback>
- </tipSettings>
- <_gbTosVideo type="bool">False</_gbTosVideo>
- <enableTosVideo type="bool">False</enableTosVideo>
- <tosVideo type="int">1</tosVideo>
- <customTosVideo type="str">0x20</customTosVideo>
- <_gbCustomTosVideo type="bool">False</_gbCustomTosVideo>
- <tosValVideo type="int">32</tosValVideo>
- <useMosVideo type="bool">False</useMosVideo>
- <enableAcceptSSRCChanges type="bool">False</enableAcceptSSRCChanges>
- <ignoreHintTrack type="bool">False</ignoreHintTrack>
- <hintTrackType type="int">1</hintTrackType>
- <enablePACSI type="bool">True</enablePACSI>
- <useSingleNALUnit type="bool">False</useSingleNALUnit>
- <_gbH323AdvancedSettings type="bool">False</_gbH323AdvancedSettings>
- <useH323AdvancedSettings type="bool">False</useH323AdvancedSettings>
- <_gbUseH323AdvancedSettings type="bool">False</_gbUseH323AdvancedSettings>
- <rtpmap type="str"></rtpmap>
- <fmtp type="str"></fmtp>
- <isMP4 type="bool">False</isMP4>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">hintTrackType</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">videoMaxSessions</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">useSingleNALUnit</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enableVideo</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">useConference</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">customTosVideo</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tipSettings</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">playTypeVideo</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">rotationScheme</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_gbUseH323AdvancedSettings</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">isMP4</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">confVideoDuration</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tosValVideo</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enablePACSI</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_videoFormat</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">confDuration</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tosVideo</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">_gbUseTelepresence</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">enableVideoOWD</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enableTosVideo</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">fmtp</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">videoType</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">confDurationUnit</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">videoDurationUnit</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">_gbUseConference</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">_gbH323AdvancedSettings</item>
- <item ref="4"/>
- </item>
- <item type="tuple">
- <item type="str">_gbTosVideo</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">_gbCustomTosVideo</item>
- <item ref="4"/>
- </item>
- <item type="tuple">
- <item type="str">ignoreHintTrack</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enableAcceptSSRCChanges</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">videoDuration</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">useH323AdvancedSettings</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">videoClip</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">confVideoDurationUnit</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">rtpmap</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_gbEnableVideo</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">btnTelepresence</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">useMosVideo</item>
- <item ref="1"/>
- </item>
- </_dict>
- </state>
- </videoSettings>
- <videoConfSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_VideoConfSettings">
- <rotationScheme type="int">0</rotationScheme>
- <_gbRotationScheme type="int">0</_gbRotationScheme>
- <confVideoDuration type="int">0</confVideoDuration>
- <confVideoDurationUnit type="int">0</confVideoDurationUnit>
- <confDuration type="int">0</confDuration>
- <confDurationUnit type="int">0</confDurationUnit>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">rotationScheme</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">confDuration</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">confVideoDurationUnit</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">confDurationUnit</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_gbRotationScheme</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">confVideoDuration</item>
- <item ref="1"/>
- </item>
- </_dict>
- </state>
- </videoConfSettings>
- <videoTelepresenceSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_VideoTelepresenceSettings">
- <tipEndpointType type="int">0</tipEndpointType>
- <tipResolution type="int">0</tipResolution>
- <tipVersion type="int">0</tipVersion>
- <tipSyntheticPayload type="bool">False</tipSyntheticPayload>
- <tipMoreClips type="bool">False</tipMoreClips>
- <_gbTipMoreClips type="int">0</_gbTipMoreClips>
- <tipVideoClip2 type="str">Fire_avc.mp4</tipVideoClip2>
- <tipRotationScheme type="int">0</tipRotationScheme>
- <tipConfDuration type="int">0</tipConfDuration>
- <tipConfDurationUnit type="int">0</tipConfDurationUnit>
- <tipAudioDuration type="int">0</tipAudioDuration>
- <tipAudioDurationUnit type="int">0</tipAudioDurationUnit>
- <_gbTipPresentation type="bool">False</_gbTipPresentation>
- <tipUsePresentationStream type="bool">False</tipUsePresentationStream>
- <tipVideoClip type="str">Fire_avc.mp4</tipVideoClip>
- <tipAudioClip type="str">US_042.wav</tipAudioClip>
- <tipStartAfter type="int">0</tipStartAfter>
- <tipStartAfterUnit type="int">0</tipStartAfterUnit>
- <tipDuration type="int">0</tipDuration>
- <tipDurationUnit type="int">0</tipDurationUnit>
- <tipPresentationRotation type="int">0</tipPresentationRotation>
- <tipLegacyMode type="bool">False</tipLegacyMode>
- <_gbTipLegacy type="int">0</_gbTipLegacy>
- <tipLegacyClip type="str">Fire_avc.mp4</tipLegacyClip>
- <tipLegacyModeAudio type="bool">False</tipLegacyModeAudio>
- <_gbTipLegacyAudio type="int">0</_gbTipLegacyAudio>
- <tipLegacyClipAudio type="str">US_042.wav</tipLegacyClipAudio>
- <tipG722Legacy type="bool">False</tipG722Legacy>
- <tipAudioActivityMetric type="bool">False</tipAudioActivityMetric>
- <tipDinamicChannels type="bool">False</tipDinamicChannels>
- <tipVideoRefresh type="bool">False</tipVideoRefresh>
- <tipInbandSets type="bool">False</tipInbandSets>
- <tipArithmetingCoding type="bool">False</tipArithmetingCoding>
- <tipLTRP type="bool">False</tipLTRP>
- <tipGDR type="bool">False</tipGDR>
- <tipHighProfile type="bool">False</tipHighProfile>
- <tipUnrestrictedMedia type="bool">False</tipUnrestrictedMedia>
- <tipRtcpFeedback type="bool">True</tipRtcpFeedback>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">tipDuration</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tipRotationScheme</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tipLegacyMode</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_tipLegacyClip</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tipVideoClip</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tipVideoRefresh</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tipUsePresentationStream</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tipGDR</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tipStartAfterUnit</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tipArithmetingCoding</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_gbTipLegacyAudio</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">tipConfDuration</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tipConfDurationUnit</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tipG722Legacy</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tipLegacyClipAudio</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tipLegacyClip</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tipMoreClips</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tipDurationUnit</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tipInbandSets</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tipSyntheticPayload</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_tipVideoClip2</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tipAudioDurationUnit</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tipResolution</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_tipVideoClip</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_tipLegacyClipAudio</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tipAudioDuration</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tipLegacyModeAudio</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_gbTipPresentation</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">tipHighProfile</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tipRtcpFeedback</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tipVideoClip2</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_gbTipMoreClips</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">tipVersion</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tipDinamicChannels</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tipEndpointType</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_gbTipLegacy</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">tipLTRP</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tipStartAfter</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_tipAudioClip</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tipPresentationRotation</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tipAudioClip</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tipAudioActivityMetric</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tipUnrestrictedMedia</item>
- <item ref="1"/>
- </item>
- </_dict>
- </state>
- </videoTelepresenceSettings>
- <textSettings ver="[1, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TextSettings">
- <enableText type="bool">False</enableText>
- <enableTextOWD type="bool">False</enableTextOWD>
- <_gbEnableText type="bool">False</_gbEnableText>
- <textClip type="str">The quick brown fox jumps over the lazy dog</textClip>
- <textFormat type="str">Format: t140, Max duration: 42300 ms</textFormat>
- <textChpsMin type="float">1.0</textChpsMin>
- <textChpsMax type="float">1.0</textChpsMax>
- <textBufferTime type="int">300</textBufferTime>
- <textRedundancyLevel type="int">0</textRedundancyLevel>
- <textPlayType type="int">0</textPlayType>
- <textDuration type="int">5</textDuration>
- <textDurationUnit type="int">1</textDurationUnit>
- <_gbTosText type="bool">False</_gbTosText>
- <enableTosText type="bool">False</enableTosText>
- <tosText type="int">1</tosText>
- <customTosText type="str">0x20</customTosText>
- <_gbCustomTosText type="bool">False</_gbCustomTosText>
- <tosValText type="int">32</tosValText>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">tosValText</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_gbEnableText</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">textClip</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">customTosText</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">textChpsMin</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">textRedundancyLevel</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">textChpsMax</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">textBufferTime</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">textDuration</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">enableTextOWD</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_gbTosText</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">enableText</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">textPlayType</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_gbCustomTosText</item>
- <item ref="4"/>
- </item>
- <item type="tuple">
- <item type="str">enableTosText</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">textFormat</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">textDurationUnit</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">tosText</item>
- <item ref="3"/>
- </item>
- </_dict>
- </state>
- </textSettings>
- <t38Settings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_T38Settings">
- <enableT38 type="bool">False</enableT38>
- <_gbEnableT38 type="bool">False</_gbEnableT38>
- <_gbEnableT38_2 type="bool">False</_gbEnableT38_2>
- <faxImage type="str">Ixia2Pages.tif</faxImage>
- <_faxFormat type="str">Format: TIFF, Img size: 1660 x 2291, Size: 140402 bytes</_faxFormat>
- <t38TransportType type="int">1</t38TransportType>
- <t38Port type="str">40000</t38Port>
- <t38UdpEncapsulation type="int">0</t38UdpEncapsulation>
- <_gbT38UdpEncapsulation type="bool">False</_gbT38UdpEncapsulation>
- <t38PayloadType type="int">102</t38PayloadType>
- <useFaxVersion type="bool">True</useFaxVersion>
- <faxVersion type="int">0</faxVersion>
- <useT38MaxBitrate type="bool">True</useT38MaxBitrate>
- <t38MaxBitrate type="int">5</t38MaxBitrate>
- <useT38RateMgmt type="bool">True</useT38RateMgmt>
- <t38RateMgmt type="int">0</t38RateMgmt>
- <useT38FillBitRemoval type="bool">False</useT38FillBitRemoval>
- <t38FillBitRemoval type="int">0</t38FillBitRemoval>
- <t38TranscodingMMR type="bool">False</t38TranscodingMMR>
- <t38TranscodingJBIG type="bool">False</t38TranscodingJBIG>
- <_gbUdpOptions type="bool">False</_gbUdpOptions>
- <useErrorRecoverySchema type="bool">True</useErrorRecoverySchema>
- <errorRecoverySchema type="int">0</errorRecoverySchema>
- <useT38MaxDatagramSize type="bool">True</useT38MaxDatagramSize>
- <t38MaxDatagramSize type="int">256</t38MaxDatagramSize>
- <useT38MaxBufferSize type="bool">False</useT38MaxBufferSize>
- <t38MaxBufferSize type="int">200</t38MaxBufferSize>
- <imagesList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_T38Settings_imagesList" itemtype="ixConfig"/>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">t38TranscodingMMR</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">t38UdpEncapsulation</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">useT38MaxBitrate</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">t38RateMgmt</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">t38TranscodingJBIG</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enableT38</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">t38TransportType</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_gbEnableT38_2</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">_gbEnableT38</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">t38Port</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">t38FillBitRemoval</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">faxVersion</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">useT38FillBitRemoval</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">useT38RateMgmt</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">faxImage</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">useT38MaxBufferSize</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">errorRecoverySchema</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">t38MaxDatagramSize</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">t38MaxBufferSize</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">_faxFormat</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">t38PayloadType</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">useT38MaxDatagramSize</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">t38MaxBitrate</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">useFaxVersion</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_gbUdpOptions</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_gbT38UdpEncapsulation</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">imagesList</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">useErrorRecoverySchema</item>
- <item ref="1"/>
- </item>
- </_dict>
- </state>
- </t38Settings>
- <t30Parameters ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_T30Parameters">
- <t30StationId type="str">5551[000-]</t30StationId>
- <t30SendCoding type="int">0</t30SendCoding>
- <t30SendDataRate type="int">5</t30SendDataRate>
- <t30SendPageSize type="int">0</t30SendPageSize>
- <t30SendMSLT type="int">0</t30SendMSLT>
- <t30SendProtocol type="int">1</t30SendProtocol>
- <t30SendResolution type="int">0</t30SendResolution>
- <sendCNG type="int">1</sendCNG>
- <t30ReceiveCoding type="int">2</t30ReceiveCoding>
- <t30ReceivePageSize type="int">2</t30ReceivePageSize>
- <t30ReceiveMSLT type="int">0</t30ReceiveMSLT>
- <t30ReceiveProtocol type="int">1</t30ReceiveProtocol>
- <t30ReceiveR8x3 type="bool">True</t30ReceiveR8x3>
- <t30ReceiveR8x7 type="bool">True</t30ReceiveR8x7>
- <t30ReceiveR8x15 type="bool">True</t30ReceiveR8x15>
- <t30Receive200x200 type="bool">True</t30Receive200x200>
- <t30ReceiveModulations type="int">3</t30ReceiveModulations>
- <sendCedBeforeDIS type="int">1</sendCedBeforeDIS>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">t30SendResolution</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">sendCedBeforeDIS</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">t30ReceiveR8x7</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">t30SendPageSize</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">t30ReceiveR8x3</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">t30SendCoding</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">t30ReceiveProtocol</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">sendCNG</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">t30SendProtocol</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">t30ReceiveMSLT</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">t30SendMSLT</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">t30SendDataRate</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">t30ReceivePageSize</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">t30ReceiveModulations</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">t30ReceiveR8x15</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">t30StationId</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">t30ReceiveCoding</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">t30Receive200x200</item>
- <item ref="1"/>
- </item>
- </_dict>
- </state>
- </t30Parameters>
- <msrpSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_MSRPSettings">
- <enableMSRP type="bool">False</enableMSRP>
- <_gbEnableMSRP type="bool">False</_gbEnableMSRP>
- <msrpPort type="str">2855</msrpPort>
- <domainType type="int">0</domainType>
- <localDomain type="str">alice[00-99].example.com</localDomain>
- <relays ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_MSRPSettings_relays" itemtype="ixConfig"/>
- <relaysCount type="int">0</relaysCount>
- <firstRelayIpEnabled type="bool">False</firstRelayIpEnabled>
- <firstRelayIp type="str">10.10.10.1</firstRelayIp>
- <firstRelayIsIPv4 type="bool">True</firstRelayIsIPv4>
- <msrpRelayPort type="int">2855</msrpRelayPort>
- <enableMSRPTos type="bool">False</enableMSRPTos>
- <msrpTos type="int">0</msrpTos>
- <customMSRPTos type="str">0x00</customMSRPTos>
- <tosMSRPVal type="int">0</tosMSRPVal>
- <automaticMSRPAuth type="bool">True</automaticMSRPAuth>
- <msrpReuseTCP type="bool">True</msrpReuseTCP>
- <msrpSendEmptyMsg type="bool">False</msrpSendEmptyMsg>
- <msrpTransactionTimeout type="int">30000</msrpTransactionTimeout>
- <msrpFirstChunkTimeout type="int">60000</msrpFirstChunkTimeout>
- <msrpInterChunkTimeout type="int">30000</msrpInterChunkTimeout>
- <msrpSessionTimeout type="int">70000</msrpSessionTimeout>
- <msrpGuiFiles ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_MSRPSettings_msrpGuiFiles" itemtype="ixConfig"/>
- <files ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_MSRPSettings_files" itemtype="ixConfig"/>
- <filesCount type="int">0</filesCount>
- <advSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_MSRPAdvancedSettings">
- <closeTCPConnectionAfterBye type="bool">False</closeTCPConnectionAfterBye>
- </advSettings>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">customMSRPTos</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">filesCount</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">firstRelayIpEnabled</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">automaticMSRPAuth</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">msrpSendEmptyMsg</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">msrpTransactionTimeout</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">msrpInterChunkTimeout</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tosMSRPVal</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enableMSRP</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">localDomain</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">relaysCount</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">domainType</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">firstRelayIp</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">advSettings</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">files</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">msrpFirstChunkTimeout</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">firstRelayIsIPv4</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">msrpPort</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_gbMSRPCustomTos</item>
- <item ref="4"/>
- </item>
- <item type="tuple">
- <item type="str">msrpSessionTimeout</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_gbEnableMSRP</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">enableMSRPTos</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">msrpReuseTCP</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">msrpGuiFiles</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">msrpTos</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">relays</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">msrpRelayPort</item>
- <item ref="3"/>
- </item>
- </_dict>
- </state>
- </msrpSettings>
- <_tempFile ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_FileRecord">
- <synthetic type="int">0</synthetic>
- <_typeStr type="str"></_typeStr>
- <name type="str"></name>
- <nameSynthetic type="str"></nameSynthetic>
- <fileClientPath type="str"></fileClientPath>
- <filePcpuPath type="str"></filePcpuPath>
- <_bFileSize type="int">20</_bFileSize>
- <_msrpSizeCombo type="int">2</_msrpSizeCombo>
- <size type="int">0</size>
- <btnMSRPFileBrowse type="int">0</btnMSRPFileBrowse>
- <type type="str">application/octet-stream</type>
- <fileHash type="str"></fileHash>
- </_tempFile>
- <_tempAdvSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_MSRPAdvancedSettings">
- <closeTCPConnectionAfterBye type="bool">False</closeTCPConnectionAfterBye>
- </_tempAdvSettings>
- <phoneBookInputLabel ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_PhoneBookInputLabel">
- <label type="str">5</label>
- </phoneBookInputLabel>
- <akaConfigurationInputLabel ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_AKAConfigurationInputLabel">
- <configurationLabel type="str"></configurationLabel>
- </akaConfigurationInputLabel>
- <phoneBook ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_PhoneBook">
- <fromFile type="int">0</fromFile>
- <pattern type="str">201004[0000-]</pattern>
- <filePath type="str"></filePath>
- <_PN1 type="bool">False</_PN1>
- <_bTelGrp type="bool">False</_bTelGrp>
- <ckTelURIBook type="bool">False</ckTelURIBook>
- <_bkTelURIparams type="str">phone-context=example.com</_bkTelURIparams>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">phoneBookList</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">filePath</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">pattern</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">ckTelURIBook</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_bkTelURIparams</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">_PN1</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_bTelGrp</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">fromFile</item>
- <item ref="1"/>
- </item>
- </_dict>
- </state>
- </phoneBook>
- <akaConfiguration ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_AKAConfiguration"/>
- <milenageConfiguration ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_MilenageConfiguration"/>
- <msgBox ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_MsgBox">
- <msg1 type="str"></msg1>
- <msg2 type="str"></msg2>
- </msgBox>
- <editCloudRule ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_EditCloudRule">
- <_gbStep1 type="bool">False</_gbStep1>
- <requestList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_EditCloudRule_requestList" itemtype="ixConfig">
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">ANY</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">INVITE</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">ACK</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">BYE</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">CANCEL</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">OPTIONS</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">REGISTER</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">NOTIFY</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">SUBSCRIBE</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">REFER</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">MESSAGE</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">PRACK</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">INFO</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">UPDATE</str>
- </item>
- </requestList>
- <reqList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_EditCloudRule_reqList" itemtype="ixConfig"/>
- <_gbStep2 type="bool">False</_gbStep2>
- <what type="int">2</what>
- <reqLine type="int">1</reqLine>
- <headerTypeList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_EditCloudRule_headerTypeList" itemtype="ixConfig">
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">To</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">From</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">Contact</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">Also</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">Authorization</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">Call-ID</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">Content-Length</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">Content-Type</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">CSeq</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">Event</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">Proxy-Authenticate</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">Proxy-Authorization</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">RAck</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">Record-Route</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">Refer-To</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">Referred-By</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">Replaces</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">Route</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">RSeq</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">Subscription-State</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">Via</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">WWW-Authenticate</str>
- </item>
- </headerTypeList>
- <headerType type="str">To</headerType>
- <compactForm type="str">t</compactForm>
- <occurFrom type="str">1</occurFrom>
- <occurTo type="str">1</occurTo>
- <whatExtract type="int">3</whatExtract>
- <extractHeaderName type="bool">False</extractHeaderName>
- <paramName type="str"></paramName>
- <revHeaderOrder type="bool">False</revHeaderOrder>
- <keepHeaderCrlf type="bool">False</keepHeaderCrlf>
- <_gbStep3 type="bool">False</_gbStep3>
- <usePosition type="int">0</usePosition>
- <beginAfter type="bool">False</beginAfter>
- <afterStr type="str">&lt;</afterStr>
- <afterOccur type="str">1</afterOccur>
- <endBefore type="bool">False</endBefore>
- <endStr type="str">&gt;</endStr>
- <endOccur type="str">last</endOccur>
- <positionFrom type="str">1</positionFrom>
- <positionTo type="str">last</positionTo>
- <_gbStep4 type="bool">False</_gbStep4>
- <formulaSource type="int">0</formulaSource>
- <formula type="str"></formula>
- <phoneBookPath type="str"></phoneBookPath>
- <phoneBookDodPath type="str"></phoneBookDodPath>
- <btnPBBrowse type="int">0</btnPBBrowse>
- </editCloudRule>
- <cloudRules ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CloudRules">
- <rulesList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_CloudRules_rulesList" itemtype="ixConfig"/>
- <cloudPhoneBooksAbsolutePath type="str">C:\Users\asordo\Documents\__Customers\Orange\OPNFV2_Lannion</cloudPhoneBooksAbsolutePath>
- </cloudRules>
- <cloudServers ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_VoIP_cloudServers" itemtype="ixConfig"/>
- <transferAddress ver="[1, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TransferAddress">
- <symTransferStr type="str">None</symTransferStr>
- <overridePhoneNo type="bool">False</overridePhoneNo>
- <_useTPb type="int">0</_useTPb>
- <_tBp type="str">&lt;None&gt;</_tBp>
- <_tBpPrv type="str"></_tBpPrv>
- <_tPhone type="str">150[00000000-]</_tPhone>
- <tPhoneType type="int">0</tPhoneType>
- <tPhone type="str">150[00000000-]</tPhone>
- <_tTelGrp type="bool">False</_tTelGrp>
- <_ckTTelURIParams type="bool">False</_ckTTelURIParams>
- <_tTelURIparams type="str">phone-context=example.com</_tTelURIparams>
- <transTelPar type="str"></transTelPar>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">_tBpPrv</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">overridePhoneNo</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_tTelGrp</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_useTPb</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">tPhone</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">transTelPar</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_tPhone</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_ckTTelURIParams</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">symTransferStr</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tPhoneType</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_tTelURIparams</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">_tBp</item>
- <item ref="3"/>
- </item>
- </_dict>
- </state>
- </transferAddress>
- <editContact ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_EditContact">
- <useDomainName type="int">0</useDomainName>
- <domainName type="str">mysipdomain.ixiacom.com</domainName>
- <_useEPb type="int">0</_useEPb>
- <_eBp type="str">&lt;None&gt;</_eBp>
- <_eBpPrv type="str"></_eBpPrv>
- <_ePhone type="str">160[00000000-]</_ePhone>
- <ePhoneType type="int">0</ePhoneType>
- <ePhone type="str">160[00000000-]</ePhone>
- <_eTelGrp type="bool">False</_eTelGrp>
- <_ckETelURI type="bool">False</_ckETelURI>
- <_eTelURIparams type="str">phone-context=example.com</_eTelURIparams>
- <editTelPar type="str"></editTelPar>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">_useEPb</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_eBpPrv</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">domainName</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">_eBp</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">_ePhone</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_eTelGrp</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">ePhoneType</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_eTelURIparams</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">useDomainName</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">editTelPar</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">ePhone</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_ckETelURI</item>
- <item ref="1"/>
- </item>
- </_dict>
- </state>
- </editContact>
- <dialPlan ver="[1, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_DialPlan">
- <sourceIPs type="str"></sourceIPs>
- <_useSPb type="int">0</_useSPb>
- <_sBp type="str">&lt;None&gt;</_sBp>
- <_sBpPrv type="str"></_sBpPrv>
- <_sPhone type="str">{{pncalled}}</_sPhone>
- <srcPhoneType type="int">0</srcPhoneType>
- <srcPhone type="str">{{pncalled}}</srcPhone>
- <_sTelGrp type="bool">False</_sTelGrp>
- <_ckSTelURIParams type="bool">False</_ckSTelURIParams>
- <_sTelURIparams type="str">phone-context=example.com</_sTelURIparams>
- <srcTelPar type="str"></srcTelPar>
- <_sTelGrp1 type="bool">False</_sTelGrp1>
- <_dTelGrp1 type="bool">False</_dTelGrp1>
- <symDestStr type="str">None</symDestStr>
- <ovrDestPhone type="bool">False</ovrDestPhone>
- <_useDPb type="int">0</_useDPb>
- <_dBp type="str">&lt;None&gt;</_dBp>
- <_dBpPrv type="str"></_dBpPrv>
- <_dPhone type="str">170[00000000-]</_dPhone>
- <destPhoneType type="int">0</destPhoneType>
- <destPhone type="str">170[00000000-]</destPhone>
- <_dTelGrp type="bool">False</_dTelGrp>
- <_ckDTelURIParams type="bool">False</_ckDTelURIParams>
- <_dTelURIparams type="str">phone-context=example.com</_dTelURIparams>
- <destTelPar type="str"></destTelPar>
- <enableEmergencyCalls type="bool">False</enableEmergencyCalls>
- <useAnonymous type="bool">False</useAnonymous>
- <makeEmergencyReg type="bool">False</makeEmergencyReg>
- <emergencyService type="str">sos</emergencyService>
- <emergencyServiceList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_DialPlan_emergencyServiceList" itemtype="ixConfig">
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">sos</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">sos.ambulance</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">sos.fire</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">sos.police</str>
- </item>
- </emergencyServiceList>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">_useSPb</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_dTelGrp1</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">sourceIPs</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enableEmergencyCalls</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_sPhone</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_dBpPrv</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">destPhoneType</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">destTelPar</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">useAnonymous</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_dTelGrp</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">symDestStr</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_gbEmergencyDest</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">_sBp</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">makeEmergencyReg</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">destPhone</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">srcTelPar</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_gbEmergencySource</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">_ckSTelURIParams</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_dTelURIparams</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">_dBp</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">ovrDestPhone</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_sTelGrp1</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">emergencyServiceList</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_dPhone</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">srcPhone</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_gbEmergency</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_sTelURIparams</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">_UseSrv1</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">srcPhoneType</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_sBpPrv</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_sTelGrp</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">emergencyService</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_useDPb</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">_ckDTelURIParams</item>
- <item ref="1"/>
- </item>
- </_dict>
- </state>
- </dialPlan>
- <signalingSettings ver="[1, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_SignalingSettings">
- <enableSIP type="bool">True</enableSIP>
- <port type="str">{{sipportcalled}}</port>
- <tcpWriteImmediate type="bool">False</tcpWriteImmediate>
- <fqdn type="bool">False</fqdn>
- <realm type="str"></realm>
- <user type="str">{{pncalled}}@{{domainname}}</user>
- <passwd type="str">{{authpassword}}</passwd>
- <akaConfCombo type="str">&lt;None&gt;</akaConfCombo>
- <akaConfComboSelIndex type="int">0</akaConfComboSelIndex>
- <akaSharedSecretType type="int">0</akaSharedSecretType>
- <akaOperatorVariantType type="int">0</akaOperatorVariantType>
- <akaSharedSecretSequence type="str">ixia</akaSharedSecretSequence>
- <akaAbsolutePath type="str">C:\Users\asordo\Documents\__Customers\Orange\OPNFV2_Lannion</akaAbsolutePath>
- <akaOperatorVariantSequence type="str">ixia</akaOperatorVariantSequence>
- <akaSharedSecretSource type="int">0</akaSharedSecretSource>
- <akaOperatorVariantSource type="int">0</akaOperatorVariantSource>
- <akaExportComplete type="int">0</akaExportComplete>
- <akaUseOPasOPC type="bool">False</akaUseOPasOPC>
- <milenageConfCombo type="str">&lt;Default&gt;</milenageConfCombo>
- <milenage_c1 type="str">00000000000000000000000000000000</milenage_c1>
- <milenage_c2 type="str">00000000000000000000000000000001</milenage_c2>
- <milenage_c3 type="str">00000000000000000000000000000002</milenage_c3>
- <milenage_c4 type="str">00000000000000000000000000000004</milenage_c4>
- <milenage_c5 type="str">00000000000000000000000000000008</milenage_c5>
- <milenage_r1 type="int">64</milenage_r1>
- <milenage_r2 type="int">0</milenage_r2>
- <milenage_r3 type="int">32</milenage_r3>
- <milenage_r4 type="int">64</milenage_r4>
- <milenage_r5 type="int">96</milenage_r5>
- <enableTos type="bool">False</enableTos>
- <tos type="int">0</tos>
- <customSipTos type="str">0x00</customSipTos>
- <tosVal type="int">0</tosVal>
- <ovrTrans type="bool">False</ovrTrans>
- <ovrTransOption type="int">0</ovrTransOption>
- <useServer type="bool">True</useServer>
- <srvAddr type="str">{{iplistims}}</srvAddr>
- <srvPort type="str">5060</srvPort>
- <srvDomain type="str">{{domainname}}</srvDomain>
- <outboundProxy type="bool">False</outboundProxy>
- <useDnsSrv type="bool">False</useDnsSrv>
- <registrarSrv type="bool">True</registrarSrv>
- <autoRegister type="bool">True</autoRegister>
- <overrideRegistrar type="bool">False</overrideRegistrar>
- <overrideRegistrarAddress type="str">IP:PORT</overrideRegistrarAddress>
- <ovrContact type="bool">False</ovrContact>
- <ovrDest type="bool">True</ovrDest>
- <ovrDestHostPort type="str">{{domainname}}</ovrDestHostPort>
- <nUdpMaxSize type="int">2048</nUdpMaxSize>
- <enableSigComp type="bool">False</enableSigComp>
- <telURISource type="bool">False</telURISource>
- <telURIDest type="bool">False</telURIDest>
- <securityMechanismValList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_SignalingSettings_securityMechanismValList" itemtype="ixConfig">
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_SecurityMechanismVal">
- <checked type="bool">False</checked>
- <mechanism type="str">ipsec-3gpp</mechanism>
- <algorithm type="int">0</algorithm>
- <algorithmStr type="str">hmac-sha-1-96</algorithmStr>
- <protocol type="int">0</protocol>
- <protocolStr type="str">esp</protocolStr>
- <mode type="int">0</mode>
- <modeStr type="str">trans</modeStr>
- <encrypt_algorithm type="int">0</encrypt_algorithm>
- <encrypt_algorithmStr type="str">aes-cbc</encrypt_algorithmStr>
- <spi_start_idx type="int">255</spi_start_idx>
- <port_c type="str">[3000-4000]</port_c>
- <port_s type="str">4060</port_s>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">protocol</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">encrypt_algorithmStr</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">algorithm</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">modeStr</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">protocolStr</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">mechanism</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">algorithmStr</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">mode</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">port_s</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">port_c</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">spi_start_idx</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">encrypt_algorithm</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">checked</item>
- <item ref="1"/>
- </item>
- </_dict>
- </state>
- </item>
- </securityMechanismValList>
- <useIPSecDoubleSPIPatch type="bool">False</useIPSecDoubleSPIPatch>
- <enablePeriodicDNSQueries type="bool">False</enablePeriodicDNSQueries>
- <DNSTimeoutValue type="int">60</DNSTimeoutValue>
- <skipDeleteDNSRecordsAtLoopEnd type="bool">False</skipDeleteDNSRecordsAtLoopEnd>
- <enableVoLTE type="bool">False</enableVoLTE>
- <mediaBearerType type="int">0</mediaBearerType>
- <enableCCDedicatedBearer type="bool">True</enableCCDedicatedBearer>
- <volte_grbox type="bool">False</volte_grbox>
- <_enableAutoHeaders type="bool">False</_enableAutoHeaders>
- <_btnAutoHeaders type="bool">False</_btnAutoHeaders>
- <dontEndMediaOnBye type="bool">False</dontEndMediaOnBye>
- <closeTCPConnectionsOnRampdown type="bool">False</closeTCPConnectionsOnRampdown>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">_gbSrvSettings</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">akaSharedSecretType</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_btnAutoHeaders</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">tcpWriteImmediate</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">ovrDest</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_enableAutoHeaders</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enableSIP</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">fqdn</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">akaSharedSecretSource</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">milenageConfCombo</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">milenage_c3</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">milenage_c2</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">milenage_c5</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">milenage_c4</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">akaConfCombo</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_UseSrv1</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">akaOperatorVariantType</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">overrideRegistrar</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">port</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">milenage_r2</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">registrarSrv</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">milenage_r4</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">milenage_r5</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_gbRetransmissions</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">milenage_r3</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">milenage_r1</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tos</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">user</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">akaOperatorVariantSource</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">telURISource</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">useServer</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">nUdpMaxSize</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">retransmit1xx</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">srvDomain</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_btnEditContact1</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">telURIDest</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">ovrTimeout</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enablePeriodicDNSQueries</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">useIPSecDoubleSPIPatch</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">securityMechanismValList</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">skipDeleteDNSRecordsAtLoopEnd</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">overrideRegistrarAddress</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">enableTos</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">srvAddr</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">ovrDestHostPort</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">DNSTimeoutValue</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">tosVal</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">passwd</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">T2</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">autoRegister</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">T1</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enableSigComp</item>
- <item ref="2"/>
- </item>
- <item type="tuple">
- <item type="str">akaOperatorVariantSequence</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enableVoLTE</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">retransmitACK</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">akaSharedSecretSequence</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">volte_grbox</item>
- <item ref="2"/>
- </item>
- <item type="tuple">
- <item type="str">customSipTos</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">dontEndMediaOnBye</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">realm</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">akaExportComplete</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">mediaBearerType</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_gbPeriodicDNSQuery</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">enableRetransmissions</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">milenage_c1</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">akaUseOPasOPC</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_ovrDest1</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">outboundProxy</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">ignoreRetransmissions</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">closeTCPConnectionsOnRampdown</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">ovrContact</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">akaAbsolutePath</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">serverAddresses</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enableCCDedicatedBearer</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">akaConfComboSelIndex</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_gbCustomTos</item>
- <item ref="4"/>
- </item>
- <item type="tuple">
- <item type="str">ovrTrans</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">useDnsSrv</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">ovrTransOption</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">_enableSIP2</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_enableSIP1</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">srvPort</item>
- <item ref="1"/>
- </item>
- </_dict>
- </state>
- </signalingSettings>
- <timerSettings ver="[2, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TimerSettings">
- <enableTimers type="bool">True</enableTimers>
- <expirationValList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_TimerSettings_expirationValList" itemtype="ixConfig">
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_ExpirationVal">
- <checked type="bool">True</checked>
- <message type="str">REGISTER</message>
- <msgPart type="int">0</msgPart>
- <msgPartStr type="str">Expires Header(s)</msgPartStr>
- <value type="int">3600</value>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">message</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">msgPart</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">checked</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">value</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">msgPartStr</item>
- <item ref="1"/>
- </item>
- </_dict>
- </state>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_ExpirationVal">
- <checked type="bool">True</checked>
- <message type="str">INVITE</message>
- <msgPart type="int">2</msgPart>
- <msgPartStr type="str">Session-Expire(s)</msgPartStr>
- <value type="int">90</value>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">message</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">msgPart</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">checked</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">value</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">msgPartStr</item>
- <item ref="1"/>
- </item>
- </_dict>
- </state>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_ExpirationVal">
- <checked type="bool">True</checked>
- <message type="str">UPDATE</message>
- <msgPart type="int">2</msgPart>
- <msgPartStr type="str">Session-Expire(s)</msgPartStr>
- <value type="int">90</value>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">message</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">msgPart</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">checked</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">value</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">msgPartStr</item>
- <item ref="1"/>
- </item>
- </_dict>
- </state>
- </item>
- </expirationValList>
- <sessionRefreshType type="int">1</sessionRefreshType>
- <refreshAfterSecs type="int">3000</refreshAfterSecs>
- <refreshAfterPercent type="int">50</refreshAfterPercent>
- <refreshInSecs type="int">32</refreshInSecs>
- <enableRetransmissions type="bool">False</enableRetransmissions>
- <T1 type="int">500</T1>
- <T2 type="int">4000</T2>
- <ignoreRetransmissions type="bool">True</ignoreRetransmissions>
- <retransmitACK type="bool">True</retransmitACK>
- <stopActiveRetr type="bool">True</stopActiveRetr>
- <retransmit1xx type="bool">False</retransmit1xx>
- <ovrTimeout type="bool">False</ovrTimeout>
- <minInterReregister type="int">0</minInterReregister>
- <autoEndCall2 type="bool">False</autoEndCall2>
- <enableAutoPRACK type="bool">False</enableAutoPRACK>
- <rprSendNegotiatedSDP type="bool">False</rprSendNegotiatedSDP>
- <rprTimeUntilNextRPR type="int">150</rprTimeUntilNextRPR>
- <rprScenarioHasPRACK type="bool">False</rprScenarioHasPRACK>
- <auto4xx type="bool">False</auto4xx>
- <auto4xxAbort type="bool">False</auto4xxAbort>
- <autoProcedureList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_TimerSettings_autoProcedureList" itemtype="ixConfig"/>
- <autoProceduresCount type="int">0</autoProceduresCount>
- <procListChanged type="bool">True</procListChanged>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">btnRefreshProcList</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">autoEndCall</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">ignoreRetransmissions</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">minInterReregister</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">autoEndCall2</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enableTimers</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">refreshInSecs</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">retransmit1xx</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">_gbEnableTimers</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">ovrTimeout</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">sessionRefreshType</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">auto4xx</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">retransmitACK</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">procListChanged</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">T2</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">autoProcedureList</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_gbAutoPRACK</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">T1</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">refreshAfterPercent</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enableAutoPRACK</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">stopActiveRetr</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">enableRetransmissions</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">rprTimeUntilNextRPR</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">rprScenarioHasPRACK</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">expirationValList</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">refreshAfterSecs</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">autoProceduresCount</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">auto4xxAbort</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">rprSendNegotiatedSDP</item>
- <item ref="1"/>
- </item>
- </_dict>
- </state>
- </timerSettings>
- <advancedSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_AdvancedSettings">
- <useCloud type="bool">False</useCloud>
- <_useCloud1 type="bool">False</_useCloud1>
- <cloud type="str">&lt;None&gt;</cloud>
- <serverRules ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_AdvancedSettings_serverRules" itemtype="ixConfig"/>
- <enableVirtualIPs type="bool">False</enableVirtualIPs>
- <virtualIPTable ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_AdvancedSettings_virtualIPTable" itemtype="ixConfig"/>
- <ovrCloudRules type="bool">False</ovrCloudRules>
- <_ovrCloudRules1 type="bool">False</_ovrCloudRules1>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">_gbVirtualIPs</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">useCloud</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">ovrCloudRules</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_ovrCloudRules1</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">cloud</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">enableVirtualIPs</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">virtualIPTable</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">serverRules</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_useCloud1</item>
- <item ref="3"/>
- </item>
- </_dict>
- </state>
- </advancedSettings>
- <tlsSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsSettings">
- <enableTLS type="bool">False</enableTLS>
- <enableDTLS type="bool">False</enableDTLS>
- <enableTLS_MSRP type="bool">False</enableTLS_MSRP>
- <enableTLS_HTTP type="bool">False</enableTLS_HTTP>
- <_enableTLS1 type="bool">False</_enableTLS1>
- <_enableTLS2 type="bool">False</_enableTLS2>
- <_enableTLS3 type="bool">False</_enableTLS3>
- <tlsPort type="str">5061</tlsPort>
- <tlsProtocol type="int">3</tlsProtocol>
- <tlsSessionRefresh type="bool">False</tlsSessionRefresh>
- <_tlsSessionRefresh type="bool">False</_tlsSessionRefresh>
- <tlsRefreshInterval type="int">3600</tlsRefreshInterval>
- <tlsAuthClient type="int">0</tlsAuthClient>
- <tlsReuseConnection type="bool">False</tlsReuseConnection>
- <_tlsReuseConnection type="bool">False</_tlsReuseConnection>
- <ignoreSubjectAltName type="bool">False</ignoreSubjectAltName>
- <tlsMutual type="bool">False</tlsMutual>
- <_gbTlsMutual type="bool">False</_gbTlsMutual>
- <tlsCyphers ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_TlsSettings_tlsCyphers" itemtype="ixConfig">
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers">
- <enabled type="bool">True</enabled>
- <name type="str">ECDHE-ECDSA-AES128-GCM-SHA256</name>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">enabled</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">name</item>
- <item ref="3"/>
- </item>
- </_dict>
- </state>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers">
- <enabled type="bool">True</enabled>
- <name type="str">ECDHE-ECDSA-AES256-GCM-SHA384</name>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">enabled</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">name</item>
- <item ref="3"/>
- </item>
- </_dict>
- </state>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers">
- <enabled type="bool">True</enabled>
- <name type="str">ECDHE-RSA-AES128-GCM-SHA256</name>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">enabled</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">name</item>
- <item ref="3"/>
- </item>
- </_dict>
- </state>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers">
- <enabled type="bool">True</enabled>
- <name type="str">ECDHE-ECDSA-AES256-SHA</name>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">enabled</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">name</item>
- <item ref="3"/>
- </item>
- </_dict>
- </state>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers">
- <enabled type="bool">True</enabled>
- <name type="str">ECDHE-ECDSA-AES128-SHA</name>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">enabled</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">name</item>
- <item ref="3"/>
- </item>
- </_dict>
- </state>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers">
- <enabled type="bool">True</enabled>
- <name type="str">ECDHE-RSA-AES128-SHA</name>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">enabled</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">name</item>
- <item ref="3"/>
- </item>
- </_dict>
- </state>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers">
- <enabled type="bool">True</enabled>
- <name type="str">AES128-SHA</name>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">enabled</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">name</item>
- <item ref="3"/>
- </item>
- </_dict>
- </state>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers">
- <enabled type="bool">True</enabled>
- <name type="str">AES256-SHA</name>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">enabled</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">name</item>
- <item ref="3"/>
- </item>
- </_dict>
- </state>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers">
- <enabled type="bool">False</enabled>
- <name type="str">ECDHE-ECDSA-AES256-SHA384</name>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">enabled</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">name</item>
- <item ref="3"/>
- </item>
- </_dict>
- </state>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers">
- <enabled type="bool">False</enabled>
- <name type="str">ECDHE-ECDSA-AES128-SHA256</name>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">enabled</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">name</item>
- <item ref="3"/>
- </item>
- </_dict>
- </state>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers">
- <enabled type="bool">False</enabled>
- <name type="str">ECDHE-RSA-AES256-GCM-SHA384</name>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">enabled</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">name</item>
- <item ref="3"/>
- </item>
- </_dict>
- </state>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers">
- <enabled type="bool">False</enabled>
- <name type="str">ECDHE-RSA-AES128-SHA256</name>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">enabled</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">name</item>
- <item ref="3"/>
- </item>
- </_dict>
- </state>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers">
- <enabled type="bool">False</enabled>
- <name type="str">ECDHE-RSA-AES256-SHA384</name>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">enabled</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">name</item>
- <item ref="3"/>
- </item>
- </_dict>
- </state>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers">
- <enabled type="bool">False</enabled>
- <name type="str">DES-CBC-SHA</name>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">enabled</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">name</item>
- <item ref="3"/>
- </item>
- </_dict>
- </state>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers">
- <enabled type="bool">False</enabled>
- <name type="str">DES-CBC3-SHA</name>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">enabled</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">name</item>
- <item ref="3"/>
- </item>
- </_dict>
- </state>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers">
- <enabled type="bool">False</enabled>
- <name type="str">EXP-DES-CBC-SHA</name>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">enabled</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">name</item>
- <item ref="3"/>
- </item>
- </_dict>
- </state>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers">
- <enabled type="bool">False</enabled>
- <name type="str">EXP-RC2-CBC-MD5</name>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">enabled</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">name</item>
- <item ref="3"/>
- </item>
- </_dict>
- </state>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers">
- <enabled type="bool">False</enabled>
- <name type="str">EXP-RC4-MD5</name>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">enabled</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">name</item>
- <item ref="3"/>
- </item>
- </_dict>
- </state>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers">
- <enabled type="bool">False</enabled>
- <name type="str">EXP1024-DES-CBC-SHA</name>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">enabled</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">name</item>
- <item ref="3"/>
- </item>
- </_dict>
- </state>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers">
- <enabled type="bool">False</enabled>
- <name type="str">EXP1024-RC4-SHA</name>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">enabled</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">name</item>
- <item ref="3"/>
- </item>
- </_dict>
- </state>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers">
- <enabled type="bool">False</enabled>
- <name type="str">IDEA-CBC-SHA</name>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">enabled</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">name</item>
- <item ref="3"/>
- </item>
- </_dict>
- </state>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers">
- <enabled type="bool">False</enabled>
- <name type="str">NULL-MD5</name>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">enabled</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">name</item>
- <item ref="3"/>
- </item>
- </_dict>
- </state>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers">
- <enabled type="bool">False</enabled>
- <name type="str">NULL-SHA</name>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">enabled</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">name</item>
- <item ref="3"/>
- </item>
- </_dict>
- </state>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers">
- <enabled type="bool">False</enabled>
- <name type="str">RC4-MD5</name>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">enabled</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">name</item>
- <item ref="3"/>
- </item>
- </_dict>
- </state>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers">
- <enabled type="bool">False</enabled>
- <name type="str">RC4-SHA</name>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">enabled</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">name</item>
- <item ref="3"/>
- </item>
- </_dict>
- </state>
- </item>
- </tlsCyphers>
- <tlsCertificatesPath type="str">C:\Program Files (x86)\Ixia\IxLoad\8.20-EA\aptixia\data\SSL_Certificates</tlsCertificatesPath>
- <tlsPrivateKeyCertificate type="str">Unsecured_RSA_key_1024.pem</tlsPrivateKeyCertificate>
- <tlsPublicKeyCertificate type="str">Unsecured_RSA_cert_1024.pem</tlsPublicKeyCertificate>
- <tlsKeyType type="int">0</tlsKeyType>
- <tlsCertType type="int">0</tlsCertType>
- <tlsPassword type="str"></tlsPassword>
- <sipScheme type="int">0</sipScheme>
- <tlsTransportType type="int">0</tlsTransportType>
- <tlsDisableUdpAndTcp type="bool">True</tlsDisableUdpAndTcp>
- <tlsEnableTcpKeepAlive type="bool">False</tlsEnableTcpKeepAlive>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">tlsCertType</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tlsPassword</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tlsPort</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">ignoreSubjectAltName</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tlsPrivateKeyCertificate</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tlsTransportType</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enableTLS_HTTP</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tlsCyphers</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tlsProtocol</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tlsKeyType</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_tlsSessionRefresh</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">tlsCertificatesPath</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tlsEnableTcpKeepAlive</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_gbTlsMutual</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">tlsPublicKeyCertificate</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_enableCert</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">enableTLS</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tlsAuthClient</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tlsMutual</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_enableTLS4</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">_enableTLS1</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">_enableTLS2</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">_enableTLS3</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">enableDTLS</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enableTLS_MSRP</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tlsReuseConnection</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tlsRefreshInterval</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tlsSessionRefresh</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tlsDisableUdpAndTcp</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">sipScheme</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_tlsReuseConnection</item>
- <item ref="3"/>
- </item>
- </_dict>
- </state>
- </tlsSettings>
- <dtlsOptions ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_DtlsOptions">
- <dtlsRetry type="int">200</dtlsRetry>
- <dtlsTimeout type="int">30000</dtlsTimeout>
- <dtlsSessionTicket type="bool">False</dtlsSessionTicket>
- </dtlsOptions>
- <iceOptions ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_IceOptions">
- <iceRetryCount type="int">6</iceRetryCount>
- <iceInitialRetry type="int">100</iceInitialRetry>
- <iceTimeout type="int">30000</iceTimeout>
- </iceOptions>
- <otherSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_OtherSettings">
- <VOIP_Var0 type="str"></VOIP_Var0>
- <VOIP_Var1 type="str"></VOIP_Var1>
- <VOIP_Var2 type="str"></VOIP_Var2>
- <VOIP_Var3 type="str"></VOIP_Var3>
- <VOIP_Var4 type="str"></VOIP_Var4>
- <VOIP_IPAddress0 type="str"></VOIP_IPAddress0>
- <VOIP_IPAddress1 type="str"></VOIP_IPAddress1>
- <VOIP_IPAddress2 type="str"></VOIP_IPAddress2>
- <VOIP_IPAddress3 type="str"></VOIP_IPAddress3>
- <VOIP_IPAddress4 type="str"></VOIP_IPAddress4>
- <ipPreference type="int">0</ipPreference>
- <bUseHardcoded type="bool">False</bUseHardcoded>
- <_gbHardcodedForDemo type="bool">False</_gbHardcodedForDemo>
- <_gbStunSettings type="bool">False</_gbStunSettings>
- <bUseStun type="bool">False</bUseStun>
- <stunAddr type="str">127.0.0.1</stunAddr>
- <stunPort type="str">3478</stunPort>
- <bUseIce type="bool">False</bUseIce>
- <bIceLite type="bool">False</bIceLite>
- <_gbSRVCCSettings type="bool">False</_gbSRVCCSettings>
- <bUseSRVCC type="bool">False</bUseSRVCC>
- <mobilityPath type="str"></mobilityPath>
- <ddgGroupboxSRVCC type="bool">False</ddgGroupboxSRVCC>
- <PCO_Groupbox type="bool">False</PCO_Groupbox>
- <bUsePCO type="bool">False</bUsePCO>
- <_gbPCO type="bool">False</_gbPCO>
- <PCO_List type="str"></PCO_List>
- <useBHCA type="bool">False</useBHCA>
- <loadVariablesFromCsv type="bool">False</loadVariablesFromCsv>
- <pathForCsvWithVariables type="str"></pathForCsvWithVariables>
- <absolutePathForCsvWithVariables type="str"></absolutePathForCsvWithVariables>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">_gbIceSettings</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">_gbPCO</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">VOIP_IPAddress4</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">VOIP_IPAddress1</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">VOIP_IPAddress0</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">VOIP_IPAddress3</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">VOIP_IPAddress2</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">bUseIce</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">mobilityPath</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">VOIP_Var0</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_gbStunSettings</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">PCO_List</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_gbSRVCCSettings</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">absolutePathForCsvWithVariables</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">bIceLite</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">PCO_Groupbox</item>
- <item ref="2"/>
- </item>
- <item type="tuple">
- <item type="str">bUseHardcoded</item>
- <item ref="2"/>
- </item>
- <item type="tuple">
- <item type="str">bUseSRVCC</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">useBHCA</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">ipPreference</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">btnBrowseForVariableCsv</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">bUsePCO</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">stunPort</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">bUseStun</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">stunAddr</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">ddgGroupboxSRVCC</item>
- <item ref="2"/>
- </item>
- <item type="tuple">
- <item type="str">_gbHardcodedForDemo</item>
- <item ref="2"/>
- </item>
- <item type="tuple">
- <item type="str">pathForCsvWithVariables</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">DodPathForCsvWithVariables</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_varCsvGroupBox</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">VOIP_Var1</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">loadVariablesFromCsv</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">VOIP_Var3</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">VOIP_Var2</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">VOIP_Var4</item>
- <item ref="1"/>
- </item>
- </_dict>
- </state>
- </otherSettings>
- <smsSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_SMSSettings">
- <enableSMS type="bool">False</enableSMS>
- <requestURI type="str">sc.home1.net</requestURI>
- <enableTelURI type="bool">False</enableTelURI>
- <telURI type="str">phone-context=example</telURI>
- <smscPhoneNo type="str">61814712345</smscPhoneNo>
- <smscTypeOfNo type="int">0</smscTypeOfNo>
- <smscNumberingPlan type="int">0</smscNumberingPlan>
- <enableSMOrigOverrideDest type="bool">False</enableSMOrigOverrideDest>
- <btnSMOrigEdit type="bool">False</btnSMOrigEdit>
- <enableSMOrigReqStatusReport type="bool">False</enableSMOrigReqStatusReport>
- <enableSMOrigReplyPath type="bool">False</enableSMOrigReplyPath>
- <smsAddressOriginator ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_SMSAddressInfo">
- <phoneType type="bool">False</phoneType>
- <phoneValue type="str">160[00000000-]</phoneValue>
- <comboPhoneBookEntry type="str">&lt;None&gt;</comboPhoneBookEntry>
- </smsAddressOriginator>
- <smOrigTypeOfNo type="int">0</smOrigTypeOfNo>
- <smOrigNumberingPlan type="int">0</smOrigNumberingPlan>
- <enableSMRecipOverrideSrc type="bool">False</enableSMRecipOverrideSrc>
- <btnSMRecipEdit type="bool">False</btnSMRecipEdit>
- <enableSMRecipReqStatusReport type="bool">False</enableSMRecipReqStatusReport>
- <enableSMRecipReplyPath type="bool">False</enableSMRecipReplyPath>
- <smsAddressRecipient ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_SMSAddressInfo">
- <phoneType type="bool">False</phoneType>
- <phoneValue type="str">160[00000000-]</phoneValue>
- <comboPhoneBookEntry type="str">&lt;None&gt;</comboPhoneBookEntry>
- </smsAddressRecipient>
- <smRecipTypeOfNo type="int">0</smRecipTypeOfNo>
- <smRecipNumberingPlan type="int">0</smRecipNumberingPlan>
- <depActivities ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_SMSSettings_depActivities" itemtype="ixConfig"/>
- <useFilesFromActivity type="bool">False</useFilesFromActivity>
- <verifyUserInfo type="bool">False</verifyUserInfo>
- <smsImportFilesActivity type="str">None</smsImportFilesActivity>
- <smsActivityForFiles type="int">0</smsActivityForFiles>
- <pcpuCommonPath type="str"></pcpuCommonPath>
- <smsFiles ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_SMSSettings_smsFiles" itemtype="ixConfig"/>
- <smsFilesCount type="int">0</smsFilesCount>
- <grBoxSMServiceCenter type="bool">False</grBoxSMServiceCenter>
- <grBoxSMOriginator type="bool">False</grBoxSMOriginator>
- <grBoxSMRecipient type="bool">False</grBoxSMRecipient>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">smOrigNumberingPlan</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">smsFiles</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">enableSMS</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enableSMOrigReplyPath</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">smsFilesCount</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">btnSMRecipEdit</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">enableSMOrigReqStatusReport</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">grBoxSMRecipient</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">enableSMRecipOverrideSrc</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">grBoxSMOriginator</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">smsAddressOriginator</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">telURI</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">depActivities</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">pcpuCommonPath</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">smOrigTypeOfNo</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">smRecipTypeOfNo</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">requestURI</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">smsFilesBackup</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">smsAddressRecipient</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enableTelURI</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">useFilesFromActivity</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">smRecipNumberingPlan</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">smscPhoneNo</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">smsImportFilesActivity</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">enableSMRecipReplyPath</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">btnSMOrigEdit</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">smscNumberingPlan</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">duringLoadFromBackup</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enableSMRecipReqStatusReport</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">grBoxSMServiceCenter</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">verifyUserInfo</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">smscTypeOfNo</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enableSMOrigOverrideDest</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">smsActivityForFiles</item>
- <item ref="1"/>
- </item>
- </_dict>
- </state>
- </smsSettings>
- <smsFilesAdd ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_SMSFilesAdd">
- <loadedFileType type="int">0</loadedFileType>
- <fileName type="str"></fileName>
- <ixSmsFileName type="str"></ixSmsFileName>
- <ixSmsFilePath type="str"></ixSmsFilePath>
- <segmentOrder type="str"></segmentOrder>
- <totalTpudSize type="str"></totalTpudSize>
- <segmentNo type="str">0</segmentNo>
- <comboCoding type="int">0</comboCoding>
- <comboRefNo type="int">0</comboRefNo>
- <contentViewEdit type="str"></contentViewEdit>
- <contentViewShow type="str"></contentViewShow>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">contentViewShow</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">ixSmsFilePath</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">contentViewEdit</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">segmentOrder</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">comboRefNo</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">loadedFileType</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">btnSmsLoadFiles</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">ixSmsFileName</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">btnSmsSaveAs</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">fileName</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">segmentNo</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">totalTpudSize</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">comboCoding</item>
- <item ref="3"/>
- </item>
- </_dict>
- </state>
- </smsFilesAdd>
- <smsAddressOriginator ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_SMSAddress">
- <radioBtnPhoneNo type="int">0</radioBtnPhoneNo>
- <comboPhoneBook type="str">&lt;None&gt;</comboPhoneBook>
- <phoneBookPreview type="str"></phoneBookPreview>
- <userPattern type="str">160[00000000-]</userPattern>
- <ePhoneType type="int">0</ePhoneType>
- <ePhone type="str">160[00000000-]</ePhone>
- <fakeEnableTelURI type="bool">False</fakeEnableTelURI>
- <fakeTelURI type="str"></fakeTelURI>
- <fakeTelToPort type="str"></fakeTelToPort>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">userPattern</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">phoneBookPreview</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">ePhoneType</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">ePhone</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">fakeEnableTelURI</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">comboPhoneBook</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">fakeTelToPort</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">fakeTelURI</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">radioBtnPhoneNo</item>
- <item ref="1"/>
- </item>
- </_dict>
- </state>
- </smsAddressOriginator>
- <smsAddressRecipient ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_SMSAddress">
- <radioBtnPhoneNo type="int">0</radioBtnPhoneNo>
- <comboPhoneBook type="str">&lt;None&gt;</comboPhoneBook>
- <phoneBookPreview type="str"></phoneBookPreview>
- <userPattern type="str">160[00000000-]</userPattern>
- <ePhoneType type="int">0</ePhoneType>
- <ePhone type="str">160[00000000-]</ePhone>
- <fakeEnableTelURI type="bool">False</fakeEnableTelURI>
- <fakeTelURI type="str"></fakeTelURI>
- <fakeTelToPort type="str"></fakeTelToPort>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">userPattern</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">phoneBookPreview</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">ePhoneType</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">ePhone</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">fakeEnableTelURI</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">comboPhoneBook</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">fakeTelToPort</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">fakeTelURI</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">radioBtnPhoneNo</item>
- <item ref="1"/>
- </item>
- </_dict>
- </state>
- </smsAddressRecipient>
- <compatibility ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_Compatibility">
- <hasRtpChMapRules type="bool">True</hasRtpChMapRules>
- </compatibility>
- <editAutoHeaderRule ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_EditAutoHeaderRule">
- <defaultMessagesList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_EditAutoHeaderRule_defaultMessagesList" itemtype="ixConfig">
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">INVITE</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">ACK</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">BYE</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">CANCEL</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">OPTIONS</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">REGISTER</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">NOTIFY</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">SUBSCRIBE</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">REFER</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">MESSAGE</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">PRACK</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">INFO</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">UPDATE</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">100 (Trying)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">180 (Ringing)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">181 (Call Is Being Forwarded)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">182 (Queued)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">183 (Session Progress)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">200 (OK)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">202 (Accepted)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">300 (Multiple Choices)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">301 (Moved Permanently)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">302 (Moved Temporarily)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">305 (Use Proxy)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">380 (Alternative Service)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">400 (Bad Request)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">401 (Unauthorized)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">402 (Payment Required)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">403 (Forbidden)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">404 (Not Found)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">405 (Method Not Allowed)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">406 (Not Acceptable)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">407 (Proxy Authentication Required)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">408 (Request Timeout)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">410 (Gone)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">413 (Request Entity Too Large)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">414 (Request-URI Too Large)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">415 (Unsupported Media Type)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">416 (Unsupported URI Scheme)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">420 (Bad Extension)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">421 (Extension Required)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">423 (Interval Too Brief)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">480 (Temporarily not available)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">481 (Call Leg/Transaction Does Not Exist)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">482 (Loop Detected)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">483 (Too Many Hops)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">484 (Address Incomplete)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">485 (Ambiguous)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">486 (Busy Here)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">487 (Request Terminated)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">488 (Not Acceptable Here)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">491 (Request Pending)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">493 (Undecipherable)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">500 (Internal Server Error)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">501 (Not Implemented)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">502 (Bad Gateway)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">503 (Service Unavailable)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">504 (Server Time-out)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">505 (SIP Version not supported)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">513 (Message Too Large)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">600 (Busy Everywhere)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">603 (Decline)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">604 (Does not exist anywhere)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">606 (Not Acceptable)</str>
- </item>
- </defaultMessagesList>
- <messagesList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_EditAutoHeaderRule_messagesList" itemtype="ixConfig"/>
- <autoHeaderTypeList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_EditAutoHeaderRule_autoHeaderTypeList" itemtype="ixConfig">
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">Request-Uri</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">Via</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">From</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">To</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">Call-ID</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">CSeq</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">Contact</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">Content-Length</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">Route</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">Record-Route</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">Authorization</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">Proxy-Authorization</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">Referred-By</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">Replaces</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">Event</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">RAck</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">RSeq</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">Refer-To</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">Subscription-State</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">WWW-Authenticate</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">Also</str>
- </item>
- </autoHeaderTypeList>
- <autoHeaderType type="str">To</autoHeaderType>
- <option type="int">0</option>
- <appendToUri type="bool">False</appendToUri>
- <headerValue type="str"></headerValue>
- <parsedHeader ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_EditAutoHeaderRule_parsedHeader" itemtype="ixConfig"/>
- <valid type="bool">True</valid>
- </editAutoHeaderRule>
- <autoHeadersSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_AutoHeadersSettings">
- <enableAutoHeaders type="bool">False</enableAutoHeaders>
- <tableRules ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_AutoHeadersSettings_tableRules" itemtype="ixConfig"/>
- <reqAutoHeadRules ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_AutoHeadersSettings_reqAutoHeadRules" itemtype="ixConfig"/>
- <respAutoHeadRules ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_AutoHeadersSettings_respAutoHeadRules" itemtype="ixConfig"/>
- </autoHeadersSettings>
- <sipAdvSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_SipAdvancedSettings">
- <overrideTCPLocalPort type="bool">False</overrideTCPLocalPort>
- <tcpLocalPortStart type="int">40000</tcpLocalPortStart>
- <tcpLocalPortEnd type="int">60000</tcpLocalPortEnd>
- <tcpLocalPortStep type="int">1</tcpLocalPortStep>
- <closeNonsecureTcpConnectionsEnable type="bool">False</closeNonsecureTcpConnectionsEnable>
- <closeIdleTcpConnectionsEnable type="bool">False</closeIdleTcpConnectionsEnable>
- <tcpIdlePeriod type="int">10</tcpIdlePeriod>
- <donotCloseTCPInsideCallEnable type="bool">False</donotCloseTCPInsideCallEnable>
- <recordingServerEnable type="bool">False</recordingServerEnable>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">tcpIdlePeriod</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tcpEndPortLabel</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">tcpIdlePeriodLabel</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">donotCloseTCPInsideCallEnable</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tcpPortStepLabel</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">tcpLocalPortStep</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">tcpLocalPortEnd</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">tcpStartPortLabel</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">tcpLocalPortStart</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">closeIdleTcpConnectionsEnable</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">recordingServerEnable</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">overrideTCPLocalPort</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">closeNonsecureTcpConnectionsEnable</item>
- <item ref="1"/>
- </item>
- </_dict>
- </state>
- </sipAdvSettings>
- </pm>
- <objectID type="int">1</objectID>
- <_apiUniqueId type="int">16522</_apiUniqueId>
- <uniqueID type="int">43</uniqueID>
- <commandIdCounter type="int">3</commandIdCounter>
- <networkPluginSettings ver="[0]" type="ixNetworkActivityPluginSupport">
- <serializedNetworkSettingsMap ver="[0, [0, [0]]]" type="ixOrderedDict">
- <_dict type="list"/>
- </serializedNetworkSettingsMap>
- <protocolName type="str">VoIP</protocolName>
- </networkPluginSettings>
- </item>
- </agentList>
- </traffic>
- <network ver="[17, [1, [6, [1, [0, [0]]]]]]" type="ixNetworkGroup">
- <resourceSyncTimeStamp type="NoneType">None</resourceSyncTimeStamp>
- <name type="str">VM2</name>
- <role type="str">Both</role>
- <networkType type="str">none</networkType>
- <aggregation type="int">0</aggregation>
- <lineSpeed type="str">Default</lineSpeed>
- <cpuAggregation type="bool">False</cpuAggregation>
- <chassisChain ref="6"/>
- <cardType type="str">Ixia Virtual Load Module</cardType>
- <activePortList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="ixNetworkPortListSequenceContainer" itemtype="ixConfig"/>
- <portList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" oid="13" type="ixNetworkPortListSequenceContainer" itemtype="ixConfig">
- <item ver="[3, [1, [1, [0, [0]]]]]" type="ixPort">
- <chassisId type="int">1</chassisId>
- <cardId type="int">2</cardId>
- <portId type="int">1</portId>
- <enableCapture type="bool">False</enableCapture>
- <cardType type="str">Ixia Virtual Load Module</cardType>
- <portPersistentSetting ver="[0, [1, [0, [0]]]]" type="ixPortPersistentSetting">
- <viewFilter type="NoneType">None</viewFilter>
- </portPersistentSetting>
- <analyzerPartialCapture type="str">False;8192</analyzerPartialCapture>
- <name type="str"></name>
- <afmPort type="NoneType">None</afmPort>
- </item>
- </portList>
- <comment type="str"></comment>
- <networkRangeList ver="[0, [2, [0, [3, [0, [0, [0], [0]], [0]]]]]]" type="ixNetworkRangeListSequenceContainer" itemtype="ixNetworkRange">
- <item ver="[13, [1, [1, [1, [0, [0]]]]]]" oid="7" type="ixNetworkRange">
- <_smRangeObjectId type="str">c69dae97-f1c2-4505-aedb-3f9ca3f4d02a</_smRangeObjectId>
- <name type="str">Network Range IP-R2 in VM2 ({{ipcard2}}+1)</name>
- <rangeGroup ver="[3, [0, [1, [0, [0]]]]]" oid="8" type="ixIpDistributionGroup">
- <name type="str">DistGroup1</name>
- <ipDistributionMethod type="str">consecutiveIps</ipDistributionMethod>
- <objectID type="int">0</objectID>
- <_apiUniqueId type="int">16512</_apiUniqueId>
- <_networkRangeList ver="[0, [3, [0, [0, [0], [0]], [0]]]]" type="ixWeakrefSequenceContainer" itemtype="ixBasicNetworkRange">
- <item ref="7"/>
- </_networkRangeList>
- <_rangeGroupObjectId type="str">de9d629b-e0dc-41f5-99cb-5aa8a808ceee</_rangeGroupObjectId>
- <_smPluginObjectId type="str">e53ae54e-ab21-4997-b532-e9bd58210050</_smPluginObjectId>
- </rangeGroup>
- <enableStats type="bool">False</enableStats>
- </item>
- </networkRangeList>
- <layerPlugins type="NoneType">None</layerPlugins>
- <stack type="NoneType">None</stack>
- <rangeGroupList ver="[1, [0, [0, [3, [0, [0, [0], [0]], [0]]]]]]" type="ixIpDistributionGroupList" itemtype="ixIpDistributionGroup">
- <item ref="8"/>
- </rangeGroupList>
- <dynamicControlPlaneSetting type="int">0</dynamicControlPlaneSetting>
- <linkLayerOptions type="int">0</linkLayerOptions>
- <ipSourcePortFrom type="int">1024</ipSourcePortFrom>
- <ipSourcePortTo type="int">65535</ipSourcePortTo>
- <emulatedRouterGateway type="str">0.0.0.0</emulatedRouterGateway>
- <emulatedRouterSubnet type="str">255.255.0.0</emulatedRouterSubnet>
- <emulatedRouterGatewayIPv6 type="str">::</emulatedRouterGatewayIPv6>
- <emulatedRouterSubnetIPv6 type="str">FFFF:FFFF:FFFF:FFFF:FFFF:FFFF::0</emulatedRouterSubnetIPv6>
- <emulatedRouterIpAddressPool ver="[3, [0, [0, [0], [0]], [0]]]" type="ixConfigSequenceContainer" itemtype="ixEmulatedRouterIpAddressRange"/>
- <macMappingMode type="int">0</macMappingMode>
- <arpSettings ver="[0, [1, [0, [0]]]]" type="ixArpSettings">
- <gratuitousArp type="bool">True</gratuitousArp>
- <processGratArp type="bool">False</processGratArp>
- </arpSettings>
- <dnsParameters ver="[1, [1, [0, [0]]]]" type="ixDns">
- <enable type="int">0</enable>
- <cacheTimeout type="int">30000</cacheTimeout>
- <serverList ver="[3, [0, [0, [0], [0]], [0]]]" type="ixConfigSequenceContainer" itemtype="_ixDnsServerItem"/>
- <suffixList ver="[3, [0, [0, [0], [0]], [0]]]" type="ixConfigSequenceContainer" itemtype="_ixDnsSuffixItem"/>
- </dnsParameters>
- <tcpParameters ver="[0, [1, [0, [0]]]]" type="ixTcpParameters">
- <tcpParametersFull ver="[4, [1, [0, [0]]]]" oid="9" type="ixTcpParametersFull">
- <enableCongestionNotification type="bool">False</enableCongestionNotification>
- <enableTimeStamp type="bool">True</enableTimeStamp>
- <timeWaitRecycle type="bool">True</timeWaitRecycle>
- <timeWaitReuse type="bool">False</timeWaitReuse>
- <enableTxBwLimit type="bool">False</enableTxBwLimit>
- <txBwLimitUnit type="int">0</txBwLimitUnit>
- <txBwLimit type="int">1024</txBwLimit>
- <enableRxBwLimit type="bool">False</enableRxBwLimit>
- <rxBwLimitUnit type="int">0</rxBwLimitUnit>
- <rxBwLimit type="int">1024</rxBwLimit>
- <finTimeout type="int">60</finTimeout>
- <keepAliveInterval type="int">75</keepAliveInterval>
- <keepAliveProbes type="int">9</keepAliveProbes>
- <keepAliveTime type="int">7200</keepAliveTime>
- <synRetries type="int">5</synRetries>
- <synAckRetries type="int">5</synAckRetries>
- <retransmitRetries type="int">5</retransmitRetries>
- <transmitBuffer type="int">4096</transmitBuffer>
- <receiveBuffer type="int">4096</receiveBuffer>
- <tcpSack type="bool">True</tcpSack>
- <windowScaling type="bool">False</windowScaling>
- <rtoMin type="int">200</rtoMin>
- <rtoMax type="int">120000</rtoMax>
- </tcpParametersFull>
- <tcpParametersFull ref="9"/>
- </tcpParameters>
- <impairment ver="[5, [1, [0, [0]]]]" type="ixImpairment">
- <enable type="bool">False</enable>
- <addDelay type="bool">False</addDelay>
- <addReorder type="bool">False</addReorder>
- <addDrop type="bool">False</addDrop>
- <addDuplicate type="bool">False</addDuplicate>
- <randomizeSeed type="bool">False</randomizeSeed>
- <delay type="int">1</delay>
- <reorder type="int">1</reorder>
- <reorderLength type="int">1</reorderLength>
- <sourcePort type="int">0</sourcePort>
- <destinationPort type="int">0</destinationPort>
- <drop type="int">1</drop>
- <duplicate type="int">1</duplicate>
- <jitter type="int">0</jitter>
- <gap type="int">1</gap>
- <destinationIp type="str">any</destinationIp>
- <typeOfService type="str">any</typeOfService>
- <protocol type="str">any</protocol>
- <addFragmentation type="bool">False</addFragmentation>
- <fragmentationType type="str">FragmentationPercent</fragmentationType>
- <fragmentPercent type="int">50</fragmentPercent>
- <mtu type="int">1000</mtu>
- <fragmentSequenceSkip type="int">1</fragmentSequenceSkip>
- <fragmentSequenceLength type="int">1</fragmentSequenceLength>
- <_seed type="int">1</_seed>
- </impairment>
- <_portGroupId type="str">b1fbd381-b769-4ec1-8715-299508ecb458</_portGroupId>
- <_smExternalLinks ver="[0, [1, [0, [0]]]]" type="_smExternalLinkersMap">
- <externalLinks type="dict"/>
- </_smExternalLinks>
- <smVersion type="int">1</smVersion>
- </network>
- <activityParameters ver="[2, [0, [0, [3, [0, [0, [0], [0]], [0]]]]]]" type="ixActivityParametersList" itemtype="ixActivityParameters">
- <item ver="[0, [19, [1, [1, [0, [0]]]]]]" oid="25" type="ixActivity">
- <agent ref="10"/>
- <protocolAndType type="str">VoIP Peer</protocolAndType>
- <name type="str">CALLED</name>
- <enable type="bool">True</enable>
- <timeline ver="[2, [1, [1, [0, [0]]]]]" oid="11" type="ixTimeline">
- <name type="str">Timeline2</name>
- <iterationTime type="int">2014</iterationTime>
- <totalTime type="int">2014</totalTime>
- <iterations type="int">1</iterations>
- <standbyTime type="int">0</standbyTime>
- <offlineTime type="int">0</offlineTime>
- <sustainTime type="int">4953</sustainTime>
- <rampUpType type="int">0</rampUpType>
- <rampUpValue type="int">{{activecalls}}</rampUpValue>
- <rampUpInterval type="int">1</rampUpInterval>
- <rampUpTime type="int">1</rampUpTime>
- <rampDownTime type="int">20</rampDownTime>
- <rampDownValue type="int">0</rampDownValue>
- <timelineType type="int">1</timelineType>
- <advancedIteration ver="[0, [1, [0, [0]]]]" type="ixAdvancedIteration">
- <segmentList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="ixTimelineSegmentList" itemtype="ixTimelineSegment">
- <item ver="[2, [0, [1, [0, [0]]]]]" type="ixLinearTimeSegment">
- <name type="str">Linear Segment 1</name>
- <noiseAmplitudeScale type="int">0</noiseAmplitudeScale>
- <segmentType type="int">1</segmentType>
- <startObjectiveScale type="float">0.0</startObjectiveScale>
- <endObjectiveScale type="float">1.0</endObjectiveScale>
- <duration type="int">1</duration>
- <objectID type="int">0</objectID>
- </item>
- <item ver="[2, [0, [1, [0, [0]]]]]" type="ixLinearTimeSegment">
- <name type="str">Linear Segment 2</name>
- <noiseAmplitudeScale type="int">0</noiseAmplitudeScale>
- <segmentType type="int">1</segmentType>
- <startObjectiveScale type="float">1.0</startObjectiveScale>
- <endObjectiveScale type="float">1.0</endObjectiveScale>
- <duration type="int">{{testduration}}</duration>
- <objectID type="int">4</objectID>
- </item>
- </segmentList>
- <maxscale type="int">20</maxscale>
- </advancedIteration>
- <objectID type="int">5</objectID>
- </timeline>
- <customParameters ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_ixCustomActivityParameters">
- <enableDbgLog type="bool">False</enableDbgLog>
- <dbgLogChannels type="str">1-5</dbgLogChannels>
- <bhcaType type="int">0</bhcaType>
- <talkTime type="int">10000</talkTime>
- <channelsNo type="int">1</channelsNo>
- <callSetupTime type="int">500</callSetupTime>
- <callTeardownTime type="int">500</callTeardownTime>
- <interCallDuration type="int">4000</interCallDuration>
- <bhcaObjectiveValue type="int">80000</bhcaObjectiveValue>
- <cpsOverwriteValueChecked type="int">0</cpsOverwriteValueChecked>
- <cpsTotalChannelsChecked type="int">0</cpsTotalChannelsChecked>
- <cpsOverwriteValue type="int">18</cpsOverwriteValue>
- <cpsType type="int">0</cpsType>
- <cpsTalkTime type="int">30000</cpsTalkTime>
- <cpsChannelsNo type="int">16750</cpsChannelsNo>
- <cpsTotalChannelsNo type="int">33500</cpsTotalChannelsNo>
- <cpsOverheadTime type="int">1500</cpsOverheadTime>
- <cpsInterCallDuration type="int">2000</cpsInterCallDuration>
- <cpsObjectiveValue type="int">100</cpsObjectiveValue>
- <cpsRegisterTime type="int">40</cpsRegisterTime>
- <cpsSplitTimeline type="int">0</cpsSplitTimeline>
- <lpsType type="int">0</lpsType>
- <lpsTalkTime type="int">800</lpsTalkTime>
- <lpsChannelsNo type="int">2150</lpsChannelsNo>
- <lpsOverheadTime type="int">1500</lpsOverheadTime>
- <lpsInterLoopDuration type="int">2000</lpsInterLoopDuration>
- <lpsObjectiveValue type="int">100</lpsObjectiveValue>
- <lpsActiveChannel type="int">0</lpsActiveChannel>
- <activeUsersTalkTime type="int">30000</activeUsersTalkTime>
- <activeUsersNo type="int">{{activecalls}}</activeUsersNo>
- <activeUsersChannel type="int">0</activeUsersChannel>
- <activeUsersObjectiveValue type="int">100</activeUsersObjectiveValue>
- </customParameters>
- <role type="str">Peer</role>
- <activeRole type="str">Both</activeRole>
- <objectivePercent type="float">100.0</objectivePercent>
- <objectiveType type="str">concurrentConnections</objectiveType>
- <objectiveValue type="int">{{activecalls}}</objectiveValue>
- <userObjectiveType type="str">activeUsers</userObjectiveType>
- <userObjectiveValue type="long">{{activecalls}}</userObjectiveValue>
- <constraintType type="str">SimulatedUserConstraint</constraintType>
- <constraintValue type="int">{{activecalls}}</constraintValue>
- <timerGranularity type="int">100</timerGranularity>
- <enableConstraint type="bool">True</enableConstraint>
- <secondaryConstraintType type="str">SimulatedUserConstraint</secondaryConstraintType>
- <secondaryConstraintValue type="int">100</secondaryConstraintValue>
- <secondaryEnableConstraint type="bool">False</secondaryEnableConstraint>
- <portMapPolicy type="str">protocolSpecific</portMapPolicy>
- <concurrentObjectiveBehavior type="int">1</concurrentObjectiveBehavior>
- <cpsObjectiveBehavior type="int">0</cpsObjectiveBehavior>
- <userIpMapping type="str">1:1</userIpMapping>
- <destinationIpMapping type="str">Consecutive</destinationIpMapping>
- <playlists ver="[1, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="ixPlaylistList" itemtype="ixPlaylist"/>
- <objectID type="int">1</objectID>
- <_apiUniqueId type="int">16585</_apiUniqueId>
- <resourceGuid type="str">58ff41761a9072107c63efca</resourceGuid>
- <_objectiveValue type="int">{{activecalls}}</_objectiveValue>
- <timelineScale type="tuple">
- <item type="float">1.0</item>
- </timelineScale>
- </item>
- </activityParameters>
- <timeline ref="11"/>
- <communityCapture ver="[0, [1, [0, [0]]]]" type="ixViewCommunityCapture">
- <captureViewOptions ref="12"/>
- <filter ver="[0, [1, [0, [0]]]]" type="ixViewFilter">
- <filterString type="str"></filterString>
- </filter>
- <portList ref="13"/>
- <enable type="bool">False</enable>
- <_apiUniqueId type="int">16521</_apiUniqueId>
- </communityCapture>
- <payload type="NoneType">None</payload>
- <activityIpWiring ver="[0, [1, [0, [0]]]]" oid="14" type="ixRangeAgentEndpointWiring">
- <rangeAgentConnections type="list"/>
- <_apiUniqueId type="int">16509</_apiUniqueId>
- <rangeAgentDict ver="[0, [0, [0]]]" type="ixOrderedDict">
- <_dict type="list">
- <item type="tuple">
- <item ref="7"/>
- <item ver="[0, [1, [0, [0]]]]" type="ixRangeAgentWiring">
- <range ref="7"/>
- <agentEndpointConnections type="list"/>
- <agentConnectionsDict ver="[0, [0, [0]]]" type="ixOrderedDict">
- <_dict type="list">
- <item type="tuple">
- <item ref="10"/>
- <item ver="[0, [1, [0, [0]]]]" type="ixAgentEndpointWiring">
- <agent ref="10"/>
- <endpoints type="list"/>
- <endpointsDict ver="[0, [0, [0]]]" type="ixOrderedDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">SIP</item>
- <item ver="[0, [1, [0, [0]]]]" type="ixEndpoint">
- <endpointName type="str">SIP</endpointName>
- <isAvailable type="bool">True</isAvailable>
- </item>
- </item>
- <item type="tuple">
- <item type="str">RTP</item>
- <item ver="[0, [1, [0, [0]]]]" type="ixEndpoint">
- <endpointName type="str">RTP</endpointName>
- <isAvailable type="bool">True</isAvailable>
- </item>
- </item>
- <item type="tuple">
- <item type="str">T38</item>
- <item ver="[0, [1, [0, [0]]]]" type="ixEndpoint">
- <endpointName type="str">T38</endpointName>
- <isAvailable type="bool">True</isAvailable>
- </item>
- </item>
- <item type="tuple">
- <item type="str">MSRP</item>
- <item ver="[0, [1, [0, [0]]]]" type="ixEndpoint">
- <endpointName type="str">MSRP</endpointName>
- <isAvailable type="bool">True</isAvailable>
- </item>
- </item>
- </_dict>
- </endpointsDict>
- </item>
- </item>
- </_dict>
- </agentConnectionsDict>
- </item>
- </item>
- </_dict>
- </rangeAgentDict>
- </activityIpWiring>
- <tcpAccelerationAllowedFlag type="bool">True</tcpAccelerationAllowedFlag>
- <iterations type="int">1</iterations>
- <standbyTime type="int">0</standbyTime>
- <offlineTime type="int">0</offlineTime>
- <sustainTime type="int">20</sustainTime>
- <iterationTime type="int">60</iterationTime>
- <totalTime type="int">1</totalTime>
- <portMapPolicy type="str">mixedMap</portMapPolicy>
- <objectiveType type="str">n/a</objectiveType>
- <objectiveValue type="int">-1</objectiveValue>
- <rampUpType type="int">-1</rampUpType>
- <rampUpValue type="int">-1</rampUpValue>
- <rampUpInterval type="int">-1</rampUpInterval>
- <rampUpTime type="int">0</rampUpTime>
- <rampDownTime type="int">10</rampDownTime>
- <userObjectiveType type="str">n/a</userObjectiveType>
- <userObjectiveValue type="int">-1</userObjectiveValue>
- <totalUserObjectiveValue type="long">0</totalUserObjectiveValue>
- <objectID type="int">1</objectID>
- <_apiUniqueId type="int">16508</_apiUniqueId>
- <isVisible type="bool">True</isVisible>
- <activityIpWiring ref="14"/>
- <_portOperationModesAllowed type="dict">
- <item>
- <key type="int">0</key>
- <value type="bool">True</value>
- </item>
- <item>
- <key type="int">1</key>
- <value type="bool">True</value>
- </item>
- <item>
- <key type="int">2</key>
- <value type="bool">False</value>
- </item>
- <item>
- <key type="int">3</key>
- <value type="bool">True</value>
- </item>
- <item>
- <key type="int">4</key>
- <value type="bool">True</value>
- </item>
- <item>
- <key type="int">6</key>
- <value type="bool">True</value>
- </item>
- <item>
- <key type="int">8</key>
- <value type="bool">True</value>
- </item>
- </_portOperationModesAllowed>
- <_tcpAccelerationAllowed type="dict">
- <item>
- <key type="int">0</key>
- <value type="bool">True</value>
- </item>
- <item>
- <key type="int">1</key>
- <value type="bool">True</value>
- </item>
- </_tcpAccelerationAllowed>
- </destinationCommunity>
- <destinationAgentName type="str">CALLED</destinationAgentName>
- <portRangeList type="NoneType">None</portRangeList>
- <count type="int">1</count>
- </item>
- </destinations>
- <flowPercentage type="float">100.0</flowPercentage>
- <uniqueID type="int">39</uniqueID>
- <pm ver="[0, [1, [0.1, [1, [0, [0]]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyMap_VoIP">
- <szPluginVersion type="str">4.10</szPluginVersion>
- <ceCommands ver="[1, [0, [0, [3, [0, [0, [0], [0]], [0]]]], [0, [0, [3, [0, [0, [0], [0]], [0]]]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_VoIP_ceCommands" itemtype="ixConfig">
- <item ver="[0, [0, [0, [0.1, [1, [0, [0]]]], [0, [1, [0, [0]]]]], [0, [0, [1, [0, [0]]]]]], [0, [0, [0, [0, [1, [0, [0]]]]]]]]" type="#Pdk.ixPdkCommands$ixPropertyCommandStart">
- <commandId type="int">-2</commandId>
- <commandType type="str">START</commandType>
- <cmdName type="str">Start</cmdName>
- <outputList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="ixCommandOutputList" itemtype="ixCommandOutput">
- <item ver="[1, [1, [0, [0]]]]" type="ixCommandOutput">
- <name type="str">Output1</name>
- <outputType type="int">0</outputType>
- <destCmdId type="int">3</destCmdId>
- <objectID type="int">0</objectID>
- <destinationCommandIdx type="int">2</destinationCommandIdx>
- </item>
- </outputList>
- </item>
- <item ver="[0, [0, [0, [0.1, [1, [0, [0]]]], [0, [1, [0, [0]]]]], [0, [0, [1, [0, [0]]]]]], [0, [0, [0, [0, [1, [0, [0]]]]]]]]" type="#Pdk.ixPdkCommands$ixPropertyCommandStop">
- <commandId type="int">-3</commandId>
- <commandType type="str">STOP</commandType>
- <cmdName type="str">Stop</cmdName>
- <outputList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="ixCommandOutputList" itemtype="ixCommandOutput"/>
- </item>
- <item ver="[0, [0, [0, [0.1, [1, [0, [0]]]], [0, [1, [0, [0]]]]], [0, [0, [1, [0, [0]]]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_Procedure">
- <commandId type="int">3</commandId>
- <commandType type="str">Procedure</commandType>
- <cmdName type="str">SIP MakeCall (#1)</cmdName>
- <outputList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="ixCommandOutputList" itemtype="ixCommandOutput">
- <item ver="[1, [1, [0, [0]]]]" type="ixCommandOutput">
- <name type="str">OK</name>
- <outputType type="int">0</outputType>
- <destCmdId type="int">16</destCmdId>
- <objectID type="int">1</objectID>
- <destinationCommandIdx type="int">4</destinationCommandIdx>
- </item>
- <item ver="[1, [1, [0, [0]]]]" type="ixCommandOutput">
- <name type="str">Error</name>
- <outputType type="int">1</outputType>
- <destCmdId type="int">-3</destCmdId>
- <objectID type="int">2</objectID>
- <destinationCommandIdx type="int">1</destinationCommandIdx>
- </item>
- </outputList>
- </item>
- <item ver="[0, [0, [0, [0.1, [1, [0, [0]]]], [0, [1, [0, [0]]]]], [0, [0, [1, [0, [0]]]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_Procedure">
- <commandId type="int">10</commandId>
- <commandType type="str">Procedure</commandType>
- <cmdName type="str">SIP EndCall Initiate (#2)</cmdName>
- <outputList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="ixCommandOutputList" itemtype="ixCommandOutput">
- <item ver="[1, [1, [0, [0]]]]" type="ixCommandOutput">
- <name type="str">OK</name>
- <outputType type="int">0</outputType>
- <destCmdId type="int">-3</destCmdId>
- <objectID type="int">1</objectID>
- <destinationCommandIdx type="int">1</destinationCommandIdx>
- </item>
- <item ver="[1, [1, [0, [0]]]]" type="ixCommandOutput">
- <name type="str">Error</name>
- <outputType type="int">1</outputType>
- <destCmdId type="int">-3</destCmdId>
- <objectID type="int">2</objectID>
- <destinationCommandIdx type="int">1</destinationCommandIdx>
- </item>
- </outputList>
- </item>
- <item ver="[0, [1, [0, [0, [0.1, [1, [0, [0]]]], [0, [1, [0, [0]]]]], [0, [0, [1, [0, [0]]]]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CommandEx">
- <commandId type="int">16</commandId>
- <commandType type="str">CommandEx</commandType>
- <cmdName type="str">Voice Session (#1)</cmdName>
- <outputList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="ixCommandOutputList" itemtype="ixCommandOutput">
- <item ver="[1, [1, [0, [0]]]]" type="ixCommandOutput">
- <name type="str">OK</name>
- <outputType type="int">0</outputType>
- <destCmdId type="int">10</destCmdId>
- <objectID type="int">1</objectID>
- <destinationCommandIdx type="int">3</destinationCommandIdx>
- </item>
- <item ver="[1, [1, [0, [0]]]]" type="ixCommandOutput">
- <name type="str">Error</name>
- <outputType type="int">1</outputType>
- <destCmdId type="int">10</destCmdId>
- <objectID type="int">2</objectID>
- <destinationCommandIdx type="int">3</destinationCommandIdx>
- </item>
- </outputList>
- <cmdType type="str">RTPVoiceSession</cmdType>
- </item>
- </ceCommands>
- <activityLink ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_ActivityLinkInfo">
- <name type="str">VoiceLink1</name>
- <activitiesCount type="int">2</activitiesCount>
- </activityLink>
- <triggers ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TriggerConfig">
- <triggersInCount type="int">4</triggersInCount>
- <triggersOutCount type="int">4</triggersOutCount>
- </triggers>
- <globalSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_GlobalSettings">
- <globalExecStg ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_GlobalExecSettings">
- <setAborted type="bool">False</setAborted>
- <setAllFailed type="bool">False</setAllFailed>
- <trigTimeout type="int">600000</trigTimeout>
- <notAbortOnTimeout type="bool">False</notAbortOnTimeout>
- <limitErrors type="bool">False</limitErrors>
- <maxErrors type="int">1</maxErrors>
- <limitArrayVarSize type="bool">False</limitArrayVarSize>
- <maxArrayVarSize type="int">10</maxArrayVarSize>
- </globalExecStg>
- <globalSIPStg ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_GlobalSIPSettings">
- <disableTCP type="bool">False</disableTCP>
- <prefQOP type="int">0</prefQOP>
- <warnAsError type="bool">False</warnAsError>
- <limitQueueSize type="bool">True</limitQueueSize>
- <maxChannelsInQueue type="int">25</maxChannelsInQueue>
- <enableSIPLogging type="bool">False</enableSIPLogging>
- <limitSIPLoggingChannels type="bool">False</limitSIPLoggingChannels>
- <maxSIPLoggingChannels type="int">10</maxSIPLoggingChannels>
- <minSIPLoggingChannels type="int">0</minSIPLoggingChannels>
- <voipPeerLogSettings type="int">0</voipPeerLogSettings>
- <voipPeerLogExpForChannels type="str"></voipPeerLogExpForChannels>
- <abortLoopOnTriggerTimeout type="bool">False</abortLoopOnTriggerTimeout>
- </globalSIPStg>
- <globalRTPStg ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_GlobalRTPSettings">
- <transmMode type="int">0</transmMode>
- <playMode type="int">0</playMode>
- <repeatCount type="int">1</repeatCount>
- <repeatTime type="int">1000</repeatTime>
- <timeUnit type="int">0</timeUnit>
- <volume type="int">-20</volume>
- <playModePathConf type="int">0</playModePathConf>
- <repeatCountPathConf type="int">0</repeatCountPathConf>
- <repeatTimePathConf type="int">10</repeatTimePathConf>
- <timeUnitPathConf type="int">0</timeUnitPathConf>
- <toneDurationPathConf type="int">200</toneDurationPathConf>
- <interToneDelayPathConf type="int">200</interToneDelayPathConf>
- <toneAmplitudePathConf type="int">-10</toneAmplitudePathConf>
- <firstToneTimeoutPathConf type="int">4000</firstToneTimeoutPathConf>
- <interToneTimeoutPathConf type="int">2000</interToneTimeoutPathConf>
- <qovTalkExtraSilence type="int">500</qovTalkExtraSilence>
- <qovListenExtraDuration type="int">2000</qovListenExtraDuration>
- <downloadRTPCSV type="bool">True</downloadRTPCSV>
- <waitQoVScore type="bool">False</waitQoVScore>
- </globalRTPStg>
- <globalSTUNStg ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_GlobalSTUNSettings">
- <keepAliveInterval type="int">15</keepAliveInterval>
- </globalSTUNStg>
- <globalSKINNYStg ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_GlobalSKINNYSettings">
- <softKeyCount type="int">25</softKeyCount>
- <receiveVideo type="bool">False</receiveVideo>
- <transmitVideo type="bool">False</transmitVideo>
- </globalSKINNYStg>
- <globalT38Stg ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_GlobalT38Settings">
- <t30Log type="bool">False</t30Log>
- <t38Log type="bool">False</t38Log>
- <receivedImageLog type="bool">False</receivedImageLog>
- <logType type="int">0</logType>
- <logBegin type="int">1</logBegin>
- <logEnd type="int">10</logEnd>
- <channelRange type="str">[00-10]</channelRange>
- </globalT38Stg>
- </globalSettings>
- <info ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_Info">
- <userChannelsNo type="int">45638</userChannelsNo>
- <portInstances type="int">3</portInstances>
- <portInstanceIdx type="int">1</portInstanceIdx>
- <objectiveType type="str">activeUsers</objectiveType>
- <objectiveValue type="int">1000</objectiveValue>
- <maxAllowedObjective type="long">9223372036854775807</maxAllowedObjective>
- <firstSignalingFnID type="int">8</firstSignalingFnID>
- <enableRTPDest type="bool">False</enableRTPDest>
- <rtpPortDest type="str"></rtpPortDest>
- <rtpObjectiveValue type="int">32000</rtpObjectiveValue>
- <hasRtpFunction type="bool">False</hasRtpFunction>
- <hasVideoFunction type="bool">False</hasVideoFunction>
- <hasT38Function type="bool">False</hasT38Function>
- <hasMSRPFunction type="bool">False</hasMSRPFunction>
- <src ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_ActivityInfo">
- <name type="str">CALLING</name>
- <portCount type="int">1</portCount>
- <portCountRtp type="int">1</portCountRtp>
- <portCountT38 type="int">1</portCountT38>
- <portCountMSRP type="int">1</portCountMSRP>
- <ipRangeCount type="int">1</ipRangeCount>
- <ipCount type="int">1</ipCount>
- <ipRule type="int">0</ipRule>
- <ipRuleCh type="int">1</ipRuleCh>
- <port type="str">{{sipportcalling}}</port>
- <portRule type="int">0</portRule>
- <portRuleCh type="int">1</portRuleCh>
- <phone type="str">{{pncalling}}</phone>
- <aliases type="int">1</aliases>
- <phoneType type="int">0</phoneType>
- <phoneRule type="int">1</phoneRule>
- <phoneCount type="int">0</phoneCount>
- <telPar type="str"></telPar>
- <ipRangeCountRtp type="int">1</ipRangeCountRtp>
- <ipCountRtp type="int">1</ipCountRtp>
- <ipRuleRtp type="int">0</ipRuleRtp>
- <ipRuleChRtp type="int">1</ipRuleChRtp>
- <portRtp type="str">[10000-65535,4]</portRtp>
- <portT38 type="str">40000</portT38>
- <portMSRP type="str">2855</portMSRP>
- <portRuleRtp type="int">1</portRuleRtp>
- <portRuleChRtp type="int">1</portRuleChRtp>
- <ipRangeCountT38 type="int">1</ipRangeCountT38>
- <ipCountT38 type="int">1</ipCountT38>
- <ipRangeCountMSRP type="int">1</ipRangeCountMSRP>
- <ipCountMSRP type="int">1</ipCountMSRP>
- <symType type="int">1</symType>
- <enableTLS type="bool">False</enableTLS>
- <enableDTLS type="bool">False</enableDTLS>
- <enableTLS_MSRP type="bool">False</enableTLS_MSRP>
- <enableTLS_HTTP type="bool">False</enableTLS_HTTP>
- <tlsPort type="str">5061</tlsPort>
- <tlsDisableUdpAndTcp type="bool">True</tlsDisableUdpAndTcp>
- <nodeCount type="int">1</nodeCount>
- <coreCount type="int">2</coreCount>
- <nicCount type="int">1</nicCount>
- <gtpEnabled type="bool">False</gtpEnabled>
- <dcpEnabled type="bool">False</dcpEnabled>
- <rangeType type="int">0</rangeType>
- <calActivityID type="int">1</calActivityID>
- <layerName type="str">aptixia-T.03440c56.4e1a.4def.8406.ec64db91d4c1-L2EthernetPlugin-166a11b6.4d30.40ea.b9e1.ac4fb44f112b-161.105.231.12;1;1default</layerName>
- </src>
- <dest ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_ActivityInfo">
- <name type="str"></name>
- <portCount type="int">1</portCount>
- <portCountRtp type="int">1</portCountRtp>
- <portCountT38 type="int">1</portCountT38>
- <portCountMSRP type="int">1</portCountMSRP>
- <ipRangeCount type="int">0</ipRangeCount>
- <ipCount type="int">0</ipCount>
- <ipRule type="int">0</ipRule>
- <ipRuleCh type="int">0</ipRuleCh>
- <port type="str"></port>
- <portRule type="int">0</portRule>
- <portRuleCh type="int">0</portRuleCh>
- <phone type="str"></phone>
- <aliases type="int">1</aliases>
- <phoneType type="int">0</phoneType>
- <phoneRule type="int">0</phoneRule>
- <phoneCount type="int">0</phoneCount>
- <telPar type="str"></telPar>
- <ipRangeCountRtp type="int">0</ipRangeCountRtp>
- <ipCountRtp type="int">0</ipCountRtp>
- <ipRuleRtp type="int">0</ipRuleRtp>
- <ipRuleChRtp type="int">0</ipRuleChRtp>
- <portRtp type="str"></portRtp>
- <portT38 type="str"></portT38>
- <portMSRP type="str">2855</portMSRP>
- <portRuleRtp type="int">0</portRuleRtp>
- <portRuleChRtp type="int">0</portRuleChRtp>
- <ipRangeCountT38 type="int">0</ipRangeCountT38>
- <ipCountT38 type="int">0</ipCountT38>
- <ipRangeCountMSRP type="int">1</ipRangeCountMSRP>
- <ipCountMSRP type="int">1</ipCountMSRP>
- <symType type="int">1</symType>
- <enableTLS type="bool">False</enableTLS>
- <enableDTLS type="bool">False</enableDTLS>
- <enableTLS_MSRP type="bool">False</enableTLS_MSRP>
- <enableTLS_HTTP type="bool">False</enableTLS_HTTP>
- <tlsPort type="str"></tlsPort>
- <tlsDisableUdpAndTcp type="bool">False</tlsDisableUdpAndTcp>
- <nodeCount type="int">1</nodeCount>
- <coreCount type="int">2</coreCount>
- <nicCount type="int">1</nicCount>
- <gtpEnabled type="bool">False</gtpEnabled>
- <dcpEnabled type="bool">False</dcpEnabled>
- <rangeType type="int">0</rangeType>
- <calActivityID type="int">0</calActivityID>
- <layerName type="str"></layerName>
- </dest>
- <useServerDest type="bool">False</useServerDest>
- <srvDomainDest type="str"></srvDomainDest>
- <srvAddrDest type="str"></srvAddrDest>
- <srvPortDest type="str">5060</srvPortDest>
- <cloudServerDest ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CloudServer">
- <name type="str"></name>
- <ipAddr type="str"></ipAddr>
- <rangeType type="str"></rangeType>
- <ipType type="str"></ipType>
- <port type="int">0</port>
- <attachedInfo type="str"></attachedInfo>
- <firstIp type="str"></firstIp>
- <netMask type="str"></netMask>
- <ipCount type="str"></ipCount>
- <ipStep type="str"></ipStep>
- </cloudServerDest>
- <transfer ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_ActivityInfo">
- <name type="str"></name>
- <portCount type="int">0</portCount>
- <portCountRtp type="int">0</portCountRtp>
- <portCountT38 type="int">0</portCountT38>
- <portCountMSRP type="int">0</portCountMSRP>
- <ipRangeCount type="int">0</ipRangeCount>
- <ipCount type="int">0</ipCount>
- <ipRule type="int">0</ipRule>
- <ipRuleCh type="int">0</ipRuleCh>
- <port type="str"></port>
- <portRule type="int">0</portRule>
- <portRuleCh type="int">0</portRuleCh>
- <phone type="str"></phone>
- <aliases type="int">0</aliases>
- <phoneType type="int">0</phoneType>
- <phoneRule type="int">0</phoneRule>
- <phoneCount type="int">0</phoneCount>
- <telPar type="str"></telPar>
- <ipRangeCountRtp type="int">0</ipRangeCountRtp>
- <ipCountRtp type="int">0</ipCountRtp>
- <ipRuleRtp type="int">0</ipRuleRtp>
- <ipRuleChRtp type="int">0</ipRuleChRtp>
- <portRtp type="str"></portRtp>
- <portT38 type="str"></portT38>
- <portMSRP type="str"></portMSRP>
- <portRuleRtp type="int">0</portRuleRtp>
- <portRuleChRtp type="int">0</portRuleChRtp>
- <ipRangeCountT38 type="int">0</ipRangeCountT38>
- <ipCountT38 type="int">0</ipCountT38>
- <ipRangeCountMSRP type="int">0</ipRangeCountMSRP>
- <ipCountMSRP type="int">0</ipCountMSRP>
- <symType type="int">0</symType>
- <enableTLS type="bool">False</enableTLS>
- <enableDTLS type="bool">False</enableDTLS>
- <enableTLS_MSRP type="bool">False</enableTLS_MSRP>
- <enableTLS_HTTP type="bool">False</enableTLS_HTTP>
- <tlsPort type="str"></tlsPort>
- <tlsDisableUdpAndTcp type="bool">False</tlsDisableUdpAndTcp>
- <nodeCount type="int">0</nodeCount>
- <coreCount type="int">1</coreCount>
- <nicCount type="int">1</nicCount>
- <gtpEnabled type="bool">False</gtpEnabled>
- <dcpEnabled type="bool">False</dcpEnabled>
- <rangeType type="int">0</rangeType>
- <calActivityID type="int">0</calActivityID>
- <layerName type="str"></layerName>
- </transfer>
- <useServerTransfer type="bool">False</useServerTransfer>
- <registrarSrvTransfer type="bool">False</registrarSrvTransfer>
- <srvAddrTransfer type="str"></srvAddrTransfer>
- <srvPortTransfer type="str">5060</srvPortTransfer>
- <cloudServerTransfer ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CloudServer">
- <name type="str"></name>
- <ipAddr type="str"></ipAddr>
- <rangeType type="str"></rangeType>
- <ipType type="str"></ipType>
- <port type="int">0</port>
- <attachedInfo type="str"></attachedInfo>
- <firstIp type="str"></firstIp>
- <netMask type="str"></netMask>
- <ipCount type="str"></ipCount>
- <ipStep type="str"></ipStep>
- </cloudServerTransfer>
- </info>
- <scenarioSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_ScenarioSettings">
- <scenarioFile type="str">.\SIPCall.tst</scenarioFile>
- <activeScenarioChannel type="int">0</activeScenarioChannel>
- <funcsCount type="int">17</funcsCount>
- <isModified type="int">68</isModified>
- <activityID type="int">6</activityID>
- <exportToRM type="int">0</exportToRM>
- </scenarioSettings>
- <executionSettings ver="[1, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_ExecutionSettings">
- <loopMode type="int">0</loopMode>
- <loopCount type="int">1</loopCount>
- <loopPreDelay type="int">0</loopPreDelay>
- <loopMidDelay type="int">0</loopMidDelay>
- <gracefulRampDown type="bool">True</gracefulRampDown>
- <rampdownSleep type="bool">False</rampdownSleep>
- <aliases type="int">1</aliases>
- <ipRule type="int">0</ipRule>
- <ipRuleCh type="int">1</ipRuleCh>
- <portRule type="int">0</portRule>
- <portRuleCh type="int">1</portRuleCh>
- <phoneRule type="int">1</phoneRule>
- <multipleUsersPerIO type="bool">True</multipleUsersPerIO>
- <rtpIpRule type="int">0</rtpIpRule>
- <rtpIpRuleCh type="int">1</rtpIpRuleCh>
- <rtpPortRule type="int">1</rtpPortRule>
- <rtpPortRuleCh type="int">1</rtpPortRuleCh>
- <dl_BUG type="bool">True</dl_BUG>
- <dl_TRACE type="bool">False</dl_TRACE>
- <dl_L_INFO type="bool">True</dl_L_INFO>
- <dl_L_ADV type="bool">False</dl_L_ADV>
- <dl_L_VRB type="bool">False</dl_L_VRB>
- <dl_T_IO type="bool">False</dl_T_IO>
- <dl_T_INFO type="bool">False</dl_T_INFO>
- <dl_T_ADV type="bool">False</dl_T_ADV>
- <dl_T_VRB type="bool">False</dl_T_VRB>
- <dl_TG_ADV type="bool">False</dl_TG_ADV>
- <dl_TG_VRB type="bool">False</dl_TG_VRB>
- <dl_Q_ADV type="bool">False</dl_Q_ADV>
- <dl_Q_VRB type="bool">False</dl_Q_VRB>
- <dl_S_FSM type="bool">False</dl_S_FSM>
- <dl_S_SER type="bool">False</dl_S_SER>
- <dl_S_SUA type="bool">False</dl_S_SUA>
- <dl_S_WAIT type="bool">False</dl_S_WAIT>
- <dl_S_SEND type="bool">False</dl_S_SEND>
- <dl_S_INFO type="bool">False</dl_S_INFO>
- <dl_S_ADV type="bool">False</dl_S_ADV>
- <dl_S_VRB type="bool">False</dl_S_VRB>
- <dl_R_DD type="bool">False</dl_R_DD>
- <dl_R_VRB type="bool">False</dl_R_VRB>
- <dl_R_PAR type="bool">False</dl_R_PAR>
- <dl_EE_VRB type="bool">False</dl_EE_VRB>
- <dl_EE_DD type="bool">False</dl_EE_DD>
- <dl_FLOW type="bool">False</dl_FLOW>
- <dl_M_IO type="bool">False</dl_M_IO>
- <dl_SDP_DD type="bool">False</dl_SDP_DD>
- <dl_1 type="bool">False</dl_1>
- <dl_2 type="bool">False</dl_2>
- <dl_3 type="bool">False</dl_3>
- <log_level type="int">9</log_level>
- <log_in_memory type="int">1</log_in_memory>
- <rtp_log_in_file type="int">1</rtp_log_in_file>
- <log_filesize type="int">32</log_filesize>
- <_gbDebugLogs type="bool">False</_gbDebugLogs>
- <ccExportProfile type="bool">False</ccExportProfile>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">_ipRule1</item>
- <item ref="2"/>
- </item>
- <item type="tuple">
- <item type="str">dl_S_ADV</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">loopMidDelay</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">dl_T_IO</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">dl_T_INFO</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">dl_S_SEND</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_rtpIpRule1</item>
- <item ref="2"/>
- </item>
- <item type="tuple">
- <item type="str">_estimatedBacklog</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">loopPreDelay</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">dl_S_VRB</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">dl_TG_ADV</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">log_filesize</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">rtp_log_in_file</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">dl_T_VRB</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">aliases</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">dl_Q_ADV</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">multipleUsersPerIO</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">log_level</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">rtpIpRule</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">dl_1</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">dl_3</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">dl_2</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">rampdownSleep</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_portRule1</item>
- <item ref="2"/>
- </item>
- <item type="tuple">
- <item type="str">dl_S_SER</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">dl_R_VRB</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">dl_L_ADV</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">dl_Q_VRB</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">portRuleCh</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">dl_S_INFO</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">rtpPortRule</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">dl_M_IO</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">dl_EE_DD</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">rtpIpRuleCh</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">dl_S_FSM</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">loopMode</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">gracefulRampDown</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">dl_FLOW</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">dl_BUG</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">dl_S_SUA</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">ipRule</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">ipRuleCh</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">phoneRule</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_rtpPortRule1</item>
- <item ref="2"/>
- </item>
- <item type="tuple">
- <item type="str">dl_R_PAR</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">loopCount</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">dl_S_WAIT</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">dl_SDP_DD</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">dl_TRACE</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_gbDebugLogs</item>
- <item ref="2"/>
- </item>
- <item type="tuple">
- <item type="str">rtpPortRuleCh</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">dl_TG_VRB</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">portRule</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">dl_L_INFO</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">dl_EE_VRB</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">dl_R_DD</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">dl_T_ADV</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">ccExportProfile</item>
- <item ref="2"/>
- </item>
- <item type="tuple">
- <item type="str">log_in_memory</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">dl_L_VRB</item>
- <item ref="1"/>
- </item>
- </_dict>
- </state>
- </executionSettings>
- <customActivityLinkSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_ixCustomActivityParameters">
- <enableDbgLog type="bool">False</enableDbgLog>
- <dbgLogChannels type="str">1-5</dbgLogChannels>
- <bhcaType type="int">0</bhcaType>
- <talkTime type="int">10000</talkTime>
- <channelsNo type="int">1</channelsNo>
- <callSetupTime type="int">500</callSetupTime>
- <callTeardownTime type="int">500</callTeardownTime>
- <interCallDuration type="int">4000</interCallDuration>
- <bhcaObjectiveValue type="int">1</bhcaObjectiveValue>
- <cpsOverwriteValueChecked type="int">0</cpsOverwriteValueChecked>
- <cpsTotalChannelsChecked type="int">0</cpsTotalChannelsChecked>
- <cpsOverwriteValue type="int">18</cpsOverwriteValue>
- <cpsType type="int">0</cpsType>
- <cpsTalkTime type="int">30000</cpsTalkTime>
- <cpsChannelsNo type="int">16750</cpsChannelsNo>
- <cpsTotalChannelsNo type="int">33500</cpsTotalChannelsNo>
- <cpsOverheadTime type="int">1500</cpsOverheadTime>
- <cpsInterCallDuration type="int">2000</cpsInterCallDuration>
- <cpsObjectiveValue type="int">500</cpsObjectiveValue>
- <cpsRegisterTime type="int">40</cpsRegisterTime>
- <cpsSplitTimeline type="int">0</cpsSplitTimeline>
- <lpsType type="int">0</lpsType>
- <lpsTalkTime type="int">800</lpsTalkTime>
- <lpsChannelsNo type="int">2150</lpsChannelsNo>
- <lpsOverheadTime type="int">1500</lpsOverheadTime>
- <lpsInterLoopDuration type="int">2000</lpsInterLoopDuration>
- <lpsObjectiveValue type="int">500</lpsObjectiveValue>
- <lpsActiveChannel type="int">0</lpsActiveChannel>
- <activeUsersTalkTime type="int">30000</activeUsersTalkTime>
- <activeUsersNo type="int">{{activecalls}}</activeUsersNo>
- <activeUsersChannel type="int">0</activeUsersChannel>
- <activeUsersObjectiveValue type="int">{{activecalls}}</activeUsersObjectiveValue>
- </customActivityLinkSettings>
- <rtpWaveFiles ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_RTPWaveFiles">
- <wavesCount type="int">1</wavesCount>
- </rtpWaveFiles>
- <rtpTones ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_RTPTones">
- <usedTonesCount type="int">0</usedTonesCount>
- <customTonesCount type="int">35</customTonesCount>
- <seqCustTonesCount type="int">0</seqCustTonesCount>
- </rtpTones>
- <codecCustomPopup ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CodecCustomPopup">
- <captureFile type="str">Default.cap</captureFile>
- <parseRTPPort type="bool">False</parseRTPPort>
- <parseSSRC type="bool">False</parseSSRC>
- <rtpPort type="int">10000</rtpPort>
- <ssrc type="str">0x8078C5D3</ssrc>
- </codecCustomPopup>
- <codecCustomPropDlg ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CodecCustomPropDlg"/>
- <codecSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CodecSettings">
- <codecs ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_CodecSettings_codecs" itemtype="ixConfig">
- <item ver="[0, [0, [0.1, [1, [0, [0]]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CodecG711u">
- <dPayloadIn type="int">0</dPayloadIn>
- <dPayloadOut type="int">0</dPayloadOut>
- <frameSize type="int">160</frameSize>
- </item>
- <item ver="[0, [0, [0.1, [1, [0, [0]]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CodecG711a">
- <dPayloadIn type="int">8</dPayloadIn>
- <dPayloadOut type="int">8</dPayloadOut>
- <frameSize type="int">160</frameSize>
- </item>
- </codecs>
- <codecs_number type="int">2</codecs_number>
- <_gbVideoCodecs type="bool">False</_gbVideoCodecs>
- <videoPayloadType type="int">96</videoPayloadType>
- <_gbDataCodecs type="bool">False</_gbDataCodecs>
- <dataCodecs ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_CodecSettings_dataCodecs" itemtype="ixConfig">
- <item ver="[0, [0, [0.1, [1, [0, [0]]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_Rtp2833Events">
- <dPayloadType type="int">100</dPayloadType>
- </item>
- <item ver="[0, [0, [0.1, [1, [0, [0]]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_Rtp2833Tones">
- <dPayloadType type="int">101</dPayloadType>
- </item>
- </dataCodecs>
- <crtCustomCodecIndex type="int">-1</crtCustomCodecIndex>
- </codecSettings>
- <rtpSettings ver="[7, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_RTPSettings">
- <rtpPort type="str">[10000-65535,4]</rtpPort>
- <enableAdvStatCalc type="bool">False</enableAdvStatCalc>
- <enableRTCP type="bool">False</enableRTCP>
- <enableRTCPMux type="bool">False</enableRTCPMux>
- <chEnableHwAcc type="bool">False</chEnableHwAcc>
- <chDisableHwAcc type="bool">False</chDisableHwAcc>
- <enableHwAcc type="bool">False</enableHwAcc>
- <enableIxStack type="bool">False</enableIxStack>
- <enableNBExec type="bool">False</enableNBExec>
- <enablePerStream type="bool">False</enablePerStream>
- <enableMDI type="bool">False</enableMDI>
- <enableRTP type="bool">False</enableRTP>
- <enableMediaSDPParams type="bool">False</enableMediaSDPParams>
- <audioB_option type="bool">False</audioB_option>
- <audioB_value type="str">AS:48</audioB_value>
- <audioRR_option type="bool">False</audioRR_option>
- <audioRR_value type="str">800</audioRR_value>
- <audioRS_option type="bool">False</audioRS_option>
- <audioRS_value type="str">800</audioRS_value>
- <videoB_option type="bool">False</videoB_option>
- <videoB_value type="str">AS:384</videoB_value>
- <videoRR_option type="bool">False</videoRR_option>
- <videoRR_value type="str">6400</videoRR_value>
- <videoRS_option type="bool">False</videoRS_option>
- <videoRS_value type="str">6400</videoRS_value>
- <textB_option type="bool">False</textB_option>
- <textB_value type="str">AS:48</textB_value>
- <textRR_option type="bool">False</textRR_option>
- <textRR_value type="str">800</textRR_value>
- <textRS_option type="bool">False</textRS_option>
- <textRS_value type="str">800</textRS_value>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">videoRR_value</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">_gbVideoSDPParams</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">textRS_value</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">jitMs</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_gbAudioSDPParams</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">ixnamSupported</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">dedicatedCoreRange</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enableRTP</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">rtpTosVal</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">channelTypeQoV</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enableMediaSDPParams</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_gbTextSDPParams</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">activityIdQoV</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">rtpPort</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">audioRS_option</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">useJitComp</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">dedicatedCoreRangeLength</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">audioB_option</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">audioB_value</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">portIPsQoV</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">audioRS_value</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">enableHwAcc</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">chEnableHwAcc</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">channelsQoVPerZionPort</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">videoRR_option</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">rtpTos</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enableRTCPMux</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">textRR_option</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">silenceMode</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_gbMediaSDPParams</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">textB_option</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enableQoV</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">jitCMs</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">valueQoV</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enableRTCP</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">maxMosStreams</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enableMDI</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enableIxStack</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enableOWD</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">unitsQoV</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">serviceEnabledQoV</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">chDisableHwAcc</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">customTosGroupBox</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">audioRR_option</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enablePerStream</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">limitMos</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">useMos</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">textRR_value</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">customTos</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">videoB_value</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">mosInterval</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enableAdvStatCalc</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">useJitter</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">useSilence</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">metricsQoV</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">videoRS_option</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">videoRS_value</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">jitCMaxDrop</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">audioRR_value</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">textB_value</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">enableTosRtp</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">videoB_option</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">activityNameQoV</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">textRS_option</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enableNBExec</item>
- <item ref="1"/>
- </item>
- </_dict>
- </state>
- </rtpSettings>
- <rtcpSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_RTCPSettings">
- <rtcpIgnoreSSRC type="bool">False</rtcpIgnoreSSRC>
- <rtcpCNAMEType type="int">0</rtcpCNAMEType>
- <hasSDESName type="bool">False</hasSDESName>
- <hasSDESTool type="bool">False</hasSDESTool>
- <rtcpSDESTool type="str">IxLoad</rtcpSDESTool>
- <rtcpReceiverTimer type="int">2000</rtcpReceiverTimer>
- <rtcpSenderTimer type="int">2000</rtcpSenderTimer>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">rtcpSDESTool</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">rtcpSenderTimer</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">rtcpCNAMEType</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">hasSDESTool</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">rtcpReceiverTimer</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">rtcpIgnoreSSRC</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">hasSDESName</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enableRTCPMux2</item>
- <item ref="1"/>
- </item>
- </_dict>
- </state>
- </rtcpSettings>
- <audioSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_AudioSettings">
- <enableAudio type="bool">False</enableAudio>
- <_gbEnableAudio type="bool">False</_gbEnableAudio>
- <enableAudioOWD type="bool">False</enableAudioOWD>
- <useJitter type="bool">False</useJitter>
- <_JB1 type="bool">False</_JB1>
- <jitMs type="int">20</jitMs>
- <useJitComp type="bool">False</useJitComp>
- <jitCMs type="int">1000</jitCMs>
- <jitCMaxDrop type="int">7</jitCMaxDrop>
- <dodName type="str">rtp_esmad-asordo-l_2170</dodName>
- <useMos type="bool">False</useMos>
- <useSilence type="bool">False</useSilence>
- <silenceMode type="int">1</silenceMode>
- <enableTosRtp type="bool">False</enableTosRtp>
- <rtpTos type="int">1</rtpTos>
- <customTosGroupBox type="bool">False</customTosGroupBox>
- <customTos type="str">0x20</customTos>
- <rtpTosVal type="int">32</rtpTosVal>
- <_COV1 type="bool">False</_COV1>
- <useQoV type="bool">False</useQoV>
- <qovAnalize type="int">5</qovAnalize>
- <qovSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_QoVSettings">
- <activityIdQoV type="int">0</activityIdQoV>
- <enableQoV type="bool">False</enableQoV>
- <_gbEnableQoV type="bool">False</_gbEnableQoV>
- <serviceEnabledQoV type="bool">False</serviceEnabledQoV>
- <activityNameQoV type="str"></activityNameQoV>
- <portIPsQoV type="str"></portIPsQoV>
- <unitsQoV type="int">0</unitsQoV>
- <valueQoV type="int">100</valueQoV>
- <channelTypeQoV type="int">0</channelTypeQoV>
- <metricsQoV type="int">0</metricsQoV>
- <channelsQoVPerZionPort type="int">0</channelsQoVPerZionPort>
- <radioBtnQoVASR type="int">0</radioBtnQoVASR>
- <languageASR type="str">English(US)</languageASR>
- </qovSettings>
- <activityIdQoV type="int">0</activityIdQoV>
- <enableQoV type="bool">False</enableQoV>
- <_gbEnableQoV type="bool">False</_gbEnableQoV>
- <serviceEnabledQoV type="bool">False</serviceEnabledQoV>
- <activityNameQoV type="str"></activityNameQoV>
- <portIPsQoV type="str"></portIPsQoV>
- <unitsQoV type="int">0</unitsQoV>
- <valueQoV type="int">100</valueQoV>
- <channelTypeQoV type="int">0</channelTypeQoV>
- <metricsQoV type="int">0</metricsQoV>
- <channelsQoVPerZionPort type="int">0</channelsQoVPerZionPort>
- <radioBtnQoVASR type="int">0</radioBtnQoVASR>
- <languageASR type="str">English(US)</languageASR>
- <audioClip type="str">US_042.wav</audioClip>
- <_audioFormat type="str">Format: PCM, Duration: 32785 ms, Size: 524556 bytes</_audioFormat>
- <outputLevel type="int">-20</outputLevel>
- <_gbOutputLevel type="bool">False</_gbOutputLevel>
- <playTypeAudio type="int">0</playTypeAudio>
- <audioDuration type="int">10</audioDuration>
- <audioDurationUnit type="int">1</audioDurationUnit>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">_gbEnableQoV</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">channelTypeQoV</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">pesqPolqa</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enablePTT</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enableP56</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">qovAnalize</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">channelsQoVPerZionPort</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_COV1</item>
- <item ref="4"/>
- </item>
- <item type="tuple">
- <item type="str">useTelchemy</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">activityIdQoV</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">rtpTosVal</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">useJitComp</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">audioDuration</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">_JB1</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">enableAudio</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enableTosRtp</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">portIPsQoV</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_gbQoVMetrics</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">dodName</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">jitMs</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">_gbASRLanguage</item>
- <item ref="2"/>
- </item>
- <item type="tuple">
- <item type="str">rtpTos</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">radioBtnQoVASR</item>
- <item ref="2"/>
- </item>
- <item type="tuple">
- <item type="str">silenceMode</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">playTypeAudio</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">useQoV</item>
- <item ref="2"/>
- </item>
- <item type="tuple">
- <item type="str">activityNameQoV</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enableQoV</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">jitCMs</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">valueQoV</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_gbOutputLevel</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">unitsQoV</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">serviceEnabledQoV</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">audioClip</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">languageASR</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">customTosGroupBox</item>
- <item ref="2"/>
- </item>
- <item type="tuple">
- <item type="str">audioDurationUnit</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">useMos</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">customTos</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">qovSettings</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">useJitter</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">useSilence</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">metricsQoV</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">jitCMaxDrop</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">channelsQoV</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enableAudioOWD</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_audioFormat</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_gbEnableAudio</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">outputLevel</item>
- <item ref="1"/>
- </item>
- </_dict>
- </state>
- </audioSettings>
- <editTos ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_EditTos">
- <bits012 type="int">0</bits012>
- <minDelay type="bool">False</minDelay>
- <maxThroughput type="bool">False</maxThroughput>
- <maxReliability type="bool">False</maxReliability>
- <_gbBtnTosBit7_0 type="bool">False</_gbBtnTosBit7_0>
- <_gbBtnTosBit7_1 type="bool">False</_gbBtnTosBit7_1>
- <_gbBtnTosBit6_0 type="bool">False</_gbBtnTosBit6_0>
- <_gbBtnTosBit6_1 type="bool">False</_gbBtnTosBit6_1>
- <_gbBtnTosBit5_0 type="bool">False</_gbBtnTosBit5_0>
- <_gbBtnTosBit5_1 type="bool">False</_gbBtnTosBit5_1>
- <_gbBtnTosBit4_0 type="bool">False</_gbBtnTosBit4_0>
- <_gbBtnTosBit4_1 type="bool">False</_gbBtnTosBit4_1>
- <_gbBtnTosBit3_0 type="bool">False</_gbBtnTosBit3_0>
- <_gbBtnTosBit3_1 type="bool">False</_gbBtnTosBit3_1>
- <_gbBtnTosBit2_0 type="bool">False</_gbBtnTosBit2_0>
- <_gbBtnTosBit2_1 type="bool">False</_gbBtnTosBit2_1>
- <_gbDisabledBtns type="bool">False</_gbDisabledBtns>
- </editTos>
- <srtpSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_SRTPSettings">
- <bEnableSRTP type="bool">False</bEnableSRTP>
- <bEnableVideoSRTP type="bool">False</bEnableVideoSRTP>
- <bEnableTextSRTP type="bool">False</bEnableTextSRTP>
- <bDisableSRTCPEncryption type="bool">False</bDisableSRTCPEncryption>
- <bDisableSRTPEncryption type="bool">False</bDisableSRTPEncryption>
- <bDisableSRTPAuthentication type="bool">False</bDisableSRTPAuthentication>
- <bDisableValidations type="bool">False</bDisableValidations>
- <bAllowOnlySecureStreams type="bool">False</bAllowOnlySecureStreams>
- <bIncludeMKI type="bool">False</bIncludeMKI>
- <bEnablePreencryption type="bool">False</bEnablePreencryption>
- <bDisableMasterSalt type="bool">False</bDisableMasterSalt>
- <bStaticMasterKeySalt type="bool">False</bStaticMasterKeySalt>
- <_masterKeySelection type="int">0</_masterKeySelection>
- <staticSingleKeySalt type="str"></staticSingleKeySalt>
- <staticKeyFile type="str"></staticKeyFile>
- <_enableSRTP type="bool">False</_enableSRTP>
- <_useStaticKey type="bool">False</_useStaticKey>
- <_singleMasterKeyGrp type="bool">False</_singleMasterKeyGrp>
- <_multipleMasterKeysGrp type="bool">False</_multipleMasterKeysGrp>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">bEnableSRTP</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_singleMasterKeyGrp</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">bDisableSRTPEncryption</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">bDisableSRTPAuthentication</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">bDisableValidations</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_useStaticKey</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">bEnablePreencryption</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">staticSingleKeySalt</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_enableSRTP</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">bStaticMasterKeySalt</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">staticKeyFile</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">bDisableMasterSalt</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_multipleMasterKeysGrp</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">bAllowOnlySecureStreams</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">bDisableSRTCPEncryption</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">bEnableVideoSRTP</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">bIncludeMKI</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">bEnableTextSRTP</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_masterKeySelection</item>
- <item ref="1"/>
- </item>
- </_dict>
- </state>
- </srtpSettings>
- <videoClips ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_VideoClips">
- <videoClipsInfo ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_VideoClips_videoClipsInfo" itemtype="ixConfig"/>
- <videoClipsInfoLength type="int">0</videoClipsInfoLength>
- <H323MaxProfile type="int">0</H323MaxProfile>
- <H323MaxLevel type="int">0</H323MaxLevel>
- <H323MaxBitRate type="int">0</H323MaxBitRate>
- <H323Packetization type="int">0</H323Packetization>
- <MaxProfileIdc type="int">66</MaxProfileIdc>
- <MaxProfileIop type="int">0</MaxProfileIop>
- <MaxLevel type="int">1</MaxLevel>
- </videoClips>
- <advancedVideo ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_AdvancedVideoSettings">
- <enableCustomMaxMBPS type="bool">False</enableCustomMaxMBPS>
- <customMaxMBPS type="int">0</customMaxMBPS>
- <enableCustomMaxFS type="bool">False</enableCustomMaxFS>
- <customMaxFS type="int">0</customMaxFS>
- <enableCustomMaxDPB type="bool">False</enableCustomMaxDPB>
- <customMaxDPB type="int">0</customMaxDPB>
- <enableCustomMaxBRandCPB type="bool">False</enableCustomMaxBRandCPB>
- <customMaxBRandCPB type="int">0</customMaxBRandCPB>
- <enableMaxStaticMBPS type="bool">False</enableMaxStaticMBPS>
- <maxStaticMBPS type="int">0</maxStaticMBPS>
- <enableMaxRcmdNalUnitSize type="bool">False</enableMaxRcmdNalUnitSize>
- <maxRcmdNalUnitSize type="int">0</maxRcmdNalUnitSize>
- <enableMaxNalUnitSize type="bool">False</enableMaxNalUnitSize>
- <maxNalUnitSize type="int">0</maxNalUnitSize>
- </advancedVideo>
- <videoSettings ver="[1, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_VideoSettings">
- <enableVideo type="bool">False</enableVideo>
- <enableVideoOWD type="bool">False</enableVideoOWD>
- <videoMaxSessions type="int">1</videoMaxSessions>
- <_gbEnableVideo type="bool">False</_gbEnableVideo>
- <videoClip type="str">Fire_avc.mp4</videoClip>
- <_videoFormat type="str">Codec: H264, Duration: 12800 ms, Size: 2012176 bytes, Bitrate: 1225 kbps</_videoFormat>
- <playTypeVideo type="int">0</playTypeVideo>
- <videoDuration type="int">5</videoDuration>
- <videoDurationUnit type="int">1</videoDurationUnit>
- <useConference type="bool">False</useConference>
- <_gbUseConference type="bool">False</_gbUseConference>
- <rotationScheme type="int">0</rotationScheme>
- <confVideoDuration type="int">1</confVideoDuration>
- <confVideoDurationUnit type="int">1</confVideoDurationUnit>
- <confDuration type="int">1</confDuration>
- <confDurationUnit type="int">1</confDurationUnit>
- <btnTelepresence type="bool">False</btnTelepresence>
- <_gbUseTelepresence type="bool">False</_gbUseTelepresence>
- <tipSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_VideoTelepresenceSettings">
- <tipEndpointType type="int">1</tipEndpointType>
- <tipResolution type="int">1</tipResolution>
- <tipVersion type="int">1</tipVersion>
- <tipSyntheticPayload type="bool">False</tipSyntheticPayload>
- <tipMoreClips type="bool">False</tipMoreClips>
- <_gbTipMoreClips type="int">0</_gbTipMoreClips>
- <tipVideoClip2 type="str">Fire_avc.mp4</tipVideoClip2>
- <tipRotationScheme type="int">0</tipRotationScheme>
- <tipConfDuration type="int">1</tipConfDuration>
- <tipConfDurationUnit type="int">1</tipConfDurationUnit>
- <tipAudioDuration type="int">1</tipAudioDuration>
- <tipAudioDurationUnit type="int">1</tipAudioDurationUnit>
- <_gbTipPresentation type="bool">False</_gbTipPresentation>
- <tipUsePresentationStream type="bool">False</tipUsePresentationStream>
- <tipVideoClip type="str">Fire_avc.mp4</tipVideoClip>
- <tipAudioClip type="str">US_042.wav</tipAudioClip>
- <tipStartAfter type="int">1</tipStartAfter>
- <tipStartAfterUnit type="int">1</tipStartAfterUnit>
- <tipDuration type="int">1</tipDuration>
- <tipDurationUnit type="int">1</tipDurationUnit>
- <tipPresentationRotation type="int">0</tipPresentationRotation>
- <tipLegacyMode type="bool">False</tipLegacyMode>
- <_gbTipLegacy type="int">0</_gbTipLegacy>
- <tipLegacyClip type="str">Fire_avc.mp4</tipLegacyClip>
- <tipLegacyModeAudio type="bool">False</tipLegacyModeAudio>
- <_gbTipLegacyAudio type="int">0</_gbTipLegacyAudio>
- <tipLegacyClipAudio type="str">US_042.wav</tipLegacyClipAudio>
- <tipG722Legacy type="bool">False</tipG722Legacy>
- <tipAudioActivityMetric type="bool">False</tipAudioActivityMetric>
- <tipDinamicChannels type="bool">False</tipDinamicChannels>
- <tipVideoRefresh type="bool">False</tipVideoRefresh>
- <tipInbandSets type="bool">False</tipInbandSets>
- <tipArithmetingCoding type="bool">False</tipArithmetingCoding>
- <tipLTRP type="bool">False</tipLTRP>
- <tipGDR type="bool">False</tipGDR>
- <tipHighProfile type="bool">False</tipHighProfile>
- <tipUnrestrictedMedia type="bool">False</tipUnrestrictedMedia>
- <tipRtcpFeedback type="bool">True</tipRtcpFeedback>
- </tipSettings>
- <_gbTosVideo type="bool">False</_gbTosVideo>
- <enableTosVideo type="bool">False</enableTosVideo>
- <tosVideo type="int">1</tosVideo>
- <customTosVideo type="str">0x20</customTosVideo>
- <_gbCustomTosVideo type="bool">False</_gbCustomTosVideo>
- <tosValVideo type="int">32</tosValVideo>
- <useMosVideo type="bool">False</useMosVideo>
- <enableAcceptSSRCChanges type="bool">False</enableAcceptSSRCChanges>
- <ignoreHintTrack type="bool">False</ignoreHintTrack>
- <hintTrackType type="int">1</hintTrackType>
- <enablePACSI type="bool">True</enablePACSI>
- <useSingleNALUnit type="bool">False</useSingleNALUnit>
- <_gbH323AdvancedSettings type="bool">False</_gbH323AdvancedSettings>
- <useH323AdvancedSettings type="bool">False</useH323AdvancedSettings>
- <_gbUseH323AdvancedSettings type="bool">False</_gbUseH323AdvancedSettings>
- <rtpmap type="str"></rtpmap>
- <fmtp type="str"></fmtp>
- <isMP4 type="bool">False</isMP4>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">hintTrackType</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">videoMaxSessions</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">useSingleNALUnit</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enableVideo</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">useConference</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">customTosVideo</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tipSettings</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">playTypeVideo</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">rotationScheme</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_gbUseH323AdvancedSettings</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">isMP4</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">confVideoDuration</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tosValVideo</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enablePACSI</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_videoFormat</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">confDuration</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tosVideo</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">_gbUseTelepresence</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">enableVideoOWD</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enableTosVideo</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">fmtp</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">videoType</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">confDurationUnit</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">videoDurationUnit</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">_gbUseConference</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">_gbH323AdvancedSettings</item>
- <item ref="4"/>
- </item>
- <item type="tuple">
- <item type="str">_gbTosVideo</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">_gbCustomTosVideo</item>
- <item ref="4"/>
- </item>
- <item type="tuple">
- <item type="str">ignoreHintTrack</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enableAcceptSSRCChanges</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">videoDuration</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">useH323AdvancedSettings</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">videoClip</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">confVideoDurationUnit</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">rtpmap</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_gbEnableVideo</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">btnTelepresence</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">useMosVideo</item>
- <item ref="1"/>
- </item>
- </_dict>
- </state>
- </videoSettings>
- <videoConfSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_VideoConfSettings">
- <rotationScheme type="int">0</rotationScheme>
- <_gbRotationScheme type="int">0</_gbRotationScheme>
- <confVideoDuration type="int">0</confVideoDuration>
- <confVideoDurationUnit type="int">0</confVideoDurationUnit>
- <confDuration type="int">0</confDuration>
- <confDurationUnit type="int">0</confDurationUnit>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">rotationScheme</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">confDuration</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">confVideoDurationUnit</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">confDurationUnit</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_gbRotationScheme</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">confVideoDuration</item>
- <item ref="1"/>
- </item>
- </_dict>
- </state>
- </videoConfSettings>
- <videoTelepresenceSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_VideoTelepresenceSettings">
- <tipEndpointType type="int">0</tipEndpointType>
- <tipResolution type="int">0</tipResolution>
- <tipVersion type="int">0</tipVersion>
- <tipSyntheticPayload type="bool">False</tipSyntheticPayload>
- <tipMoreClips type="bool">False</tipMoreClips>
- <_gbTipMoreClips type="int">0</_gbTipMoreClips>
- <tipVideoClip2 type="str">Fire_avc.mp4</tipVideoClip2>
- <tipRotationScheme type="int">0</tipRotationScheme>
- <tipConfDuration type="int">0</tipConfDuration>
- <tipConfDurationUnit type="int">0</tipConfDurationUnit>
- <tipAudioDuration type="int">0</tipAudioDuration>
- <tipAudioDurationUnit type="int">0</tipAudioDurationUnit>
- <_gbTipPresentation type="bool">False</_gbTipPresentation>
- <tipUsePresentationStream type="bool">False</tipUsePresentationStream>
- <tipVideoClip type="str">Fire_avc.mp4</tipVideoClip>
- <tipAudioClip type="str">US_042.wav</tipAudioClip>
- <tipStartAfter type="int">0</tipStartAfter>
- <tipStartAfterUnit type="int">0</tipStartAfterUnit>
- <tipDuration type="int">0</tipDuration>
- <tipDurationUnit type="int">0</tipDurationUnit>
- <tipPresentationRotation type="int">0</tipPresentationRotation>
- <tipLegacyMode type="bool">False</tipLegacyMode>
- <_gbTipLegacy type="int">0</_gbTipLegacy>
- <tipLegacyClip type="str">Fire_avc.mp4</tipLegacyClip>
- <tipLegacyModeAudio type="bool">False</tipLegacyModeAudio>
- <_gbTipLegacyAudio type="int">0</_gbTipLegacyAudio>
- <tipLegacyClipAudio type="str">US_042.wav</tipLegacyClipAudio>
- <tipG722Legacy type="bool">False</tipG722Legacy>
- <tipAudioActivityMetric type="bool">False</tipAudioActivityMetric>
- <tipDinamicChannels type="bool">False</tipDinamicChannels>
- <tipVideoRefresh type="bool">False</tipVideoRefresh>
- <tipInbandSets type="bool">False</tipInbandSets>
- <tipArithmetingCoding type="bool">False</tipArithmetingCoding>
- <tipLTRP type="bool">False</tipLTRP>
- <tipGDR type="bool">False</tipGDR>
- <tipHighProfile type="bool">False</tipHighProfile>
- <tipUnrestrictedMedia type="bool">False</tipUnrestrictedMedia>
- <tipRtcpFeedback type="bool">True</tipRtcpFeedback>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">tipDuration</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tipRotationScheme</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tipLegacyMode</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_tipLegacyClip</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tipVideoClip</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tipVideoRefresh</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tipUsePresentationStream</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tipGDR</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tipStartAfterUnit</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tipArithmetingCoding</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_gbTipLegacyAudio</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">tipConfDuration</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tipConfDurationUnit</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tipG722Legacy</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tipLegacyClipAudio</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tipLegacyClip</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tipMoreClips</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tipDurationUnit</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tipInbandSets</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tipSyntheticPayload</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_tipVideoClip2</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tipAudioDurationUnit</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tipResolution</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_tipVideoClip</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_tipLegacyClipAudio</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tipAudioDuration</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tipLegacyModeAudio</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_gbTipPresentation</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">tipHighProfile</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tipRtcpFeedback</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tipVideoClip2</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_gbTipMoreClips</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">tipVersion</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tipDinamicChannels</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tipEndpointType</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_gbTipLegacy</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">tipLTRP</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tipStartAfter</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_tipAudioClip</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tipPresentationRotation</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tipAudioClip</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tipAudioActivityMetric</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tipUnrestrictedMedia</item>
- <item ref="1"/>
- </item>
- </_dict>
- </state>
- </videoTelepresenceSettings>
- <textSettings ver="[1, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TextSettings">
- <enableText type="bool">False</enableText>
- <enableTextOWD type="bool">False</enableTextOWD>
- <_gbEnableText type="bool">False</_gbEnableText>
- <textClip type="str">The quick brown fox jumps over the lazy dog</textClip>
- <textFormat type="str">Format: t140, Max duration: 42300 ms</textFormat>
- <textChpsMin type="float">1.0</textChpsMin>
- <textChpsMax type="float">1.0</textChpsMax>
- <textBufferTime type="int">300</textBufferTime>
- <textRedundancyLevel type="int">0</textRedundancyLevel>
- <textPlayType type="int">0</textPlayType>
- <textDuration type="int">5</textDuration>
- <textDurationUnit type="int">1</textDurationUnit>
- <_gbTosText type="bool">False</_gbTosText>
- <enableTosText type="bool">False</enableTosText>
- <tosText type="int">1</tosText>
- <customTosText type="str">0x20</customTosText>
- <_gbCustomTosText type="bool">False</_gbCustomTosText>
- <tosValText type="int">32</tosValText>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">tosValText</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_gbEnableText</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">textClip</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">customTosText</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">textChpsMin</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">textRedundancyLevel</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">textChpsMax</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">textBufferTime</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">textDuration</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">enableTextOWD</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_gbTosText</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">enableText</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">textPlayType</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_gbCustomTosText</item>
- <item ref="4"/>
- </item>
- <item type="tuple">
- <item type="str">enableTosText</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">textFormat</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">textDurationUnit</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">tosText</item>
- <item ref="3"/>
- </item>
- </_dict>
- </state>
- </textSettings>
- <t38Settings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_T38Settings">
- <enableT38 type="bool">False</enableT38>
- <_gbEnableT38 type="bool">False</_gbEnableT38>
- <_gbEnableT38_2 type="bool">False</_gbEnableT38_2>
- <faxImage type="str">Ixia2Pages.tif</faxImage>
- <_faxFormat type="str">Format: TIFF, Img size: 1660 x 2291, Size: 140402 bytes</_faxFormat>
- <t38TransportType type="int">1</t38TransportType>
- <t38Port type="str">40000</t38Port>
- <t38UdpEncapsulation type="int">0</t38UdpEncapsulation>
- <_gbT38UdpEncapsulation type="bool">False</_gbT38UdpEncapsulation>
- <t38PayloadType type="int">102</t38PayloadType>
- <useFaxVersion type="bool">True</useFaxVersion>
- <faxVersion type="int">0</faxVersion>
- <useT38MaxBitrate type="bool">True</useT38MaxBitrate>
- <t38MaxBitrate type="int">5</t38MaxBitrate>
- <useT38RateMgmt type="bool">True</useT38RateMgmt>
- <t38RateMgmt type="int">0</t38RateMgmt>
- <useT38FillBitRemoval type="bool">False</useT38FillBitRemoval>
- <t38FillBitRemoval type="int">0</t38FillBitRemoval>
- <t38TranscodingMMR type="bool">False</t38TranscodingMMR>
- <t38TranscodingJBIG type="bool">False</t38TranscodingJBIG>
- <_gbUdpOptions type="bool">False</_gbUdpOptions>
- <useErrorRecoverySchema type="bool">True</useErrorRecoverySchema>
- <errorRecoverySchema type="int">0</errorRecoverySchema>
- <useT38MaxDatagramSize type="bool">True</useT38MaxDatagramSize>
- <t38MaxDatagramSize type="int">256</t38MaxDatagramSize>
- <useT38MaxBufferSize type="bool">False</useT38MaxBufferSize>
- <t38MaxBufferSize type="int">200</t38MaxBufferSize>
- <imagesList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_T38Settings_imagesList" itemtype="ixConfig"/>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">t38TranscodingMMR</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">t38UdpEncapsulation</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">useT38MaxBitrate</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">t38RateMgmt</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">t38TranscodingJBIG</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enableT38</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">t38TransportType</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_gbEnableT38_2</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">_gbEnableT38</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">t38Port</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">t38FillBitRemoval</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">faxVersion</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">useT38FillBitRemoval</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">useT38RateMgmt</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">faxImage</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">useT38MaxBufferSize</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">errorRecoverySchema</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">t38MaxDatagramSize</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">t38MaxBufferSize</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">_faxFormat</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">t38PayloadType</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">useT38MaxDatagramSize</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">t38MaxBitrate</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">useFaxVersion</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_gbUdpOptions</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_gbT38UdpEncapsulation</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">imagesList</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">useErrorRecoverySchema</item>
- <item ref="1"/>
- </item>
- </_dict>
- </state>
- </t38Settings>
- <t30Parameters ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_T30Parameters">
- <t30StationId type="str">5551[000-]</t30StationId>
- <t30SendCoding type="int">0</t30SendCoding>
- <t30SendDataRate type="int">5</t30SendDataRate>
- <t30SendPageSize type="int">0</t30SendPageSize>
- <t30SendMSLT type="int">0</t30SendMSLT>
- <t30SendProtocol type="int">1</t30SendProtocol>
- <t30SendResolution type="int">0</t30SendResolution>
- <sendCNG type="int">1</sendCNG>
- <t30ReceiveCoding type="int">2</t30ReceiveCoding>
- <t30ReceivePageSize type="int">2</t30ReceivePageSize>
- <t30ReceiveMSLT type="int">0</t30ReceiveMSLT>
- <t30ReceiveProtocol type="int">1</t30ReceiveProtocol>
- <t30ReceiveR8x3 type="bool">True</t30ReceiveR8x3>
- <t30ReceiveR8x7 type="bool">True</t30ReceiveR8x7>
- <t30ReceiveR8x15 type="bool">True</t30ReceiveR8x15>
- <t30Receive200x200 type="bool">True</t30Receive200x200>
- <t30ReceiveModulations type="int">3</t30ReceiveModulations>
- <sendCedBeforeDIS type="int">1</sendCedBeforeDIS>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">t30SendResolution</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">sendCedBeforeDIS</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">t30ReceiveR8x7</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">t30SendPageSize</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">t30ReceiveR8x3</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">t30SendCoding</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">t30ReceiveProtocol</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">sendCNG</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">t30SendProtocol</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">t30ReceiveMSLT</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">t30SendMSLT</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">t30SendDataRate</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">t30ReceivePageSize</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">t30ReceiveModulations</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">t30ReceiveR8x15</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">t30StationId</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">t30ReceiveCoding</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">t30Receive200x200</item>
- <item ref="1"/>
- </item>
- </_dict>
- </state>
- </t30Parameters>
- <msrpSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_MSRPSettings">
- <enableMSRP type="bool">False</enableMSRP>
- <_gbEnableMSRP type="bool">False</_gbEnableMSRP>
- <msrpPort type="str">2855</msrpPort>
- <domainType type="int">0</domainType>
- <localDomain type="str">alice[00-99].example.com</localDomain>
- <relays ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_MSRPSettings_relays" itemtype="ixConfig"/>
- <relaysCount type="int">0</relaysCount>
- <firstRelayIpEnabled type="bool">False</firstRelayIpEnabled>
- <firstRelayIp type="str">10.10.10.1</firstRelayIp>
- <firstRelayIsIPv4 type="bool">True</firstRelayIsIPv4>
- <msrpRelayPort type="int">2855</msrpRelayPort>
- <enableMSRPTos type="bool">False</enableMSRPTos>
- <msrpTos type="int">0</msrpTos>
- <customMSRPTos type="str">0x00</customMSRPTos>
- <tosMSRPVal type="int">0</tosMSRPVal>
- <automaticMSRPAuth type="bool">True</automaticMSRPAuth>
- <msrpReuseTCP type="bool">True</msrpReuseTCP>
- <msrpSendEmptyMsg type="bool">False</msrpSendEmptyMsg>
- <msrpTransactionTimeout type="int">30000</msrpTransactionTimeout>
- <msrpFirstChunkTimeout type="int">60000</msrpFirstChunkTimeout>
- <msrpInterChunkTimeout type="int">30000</msrpInterChunkTimeout>
- <msrpSessionTimeout type="int">70000</msrpSessionTimeout>
- <msrpGuiFiles ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_MSRPSettings_msrpGuiFiles" itemtype="ixConfig"/>
- <files ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_MSRPSettings_files" itemtype="ixConfig"/>
- <filesCount type="int">0</filesCount>
- <advSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_MSRPAdvancedSettings">
- <closeTCPConnectionAfterBye type="bool">False</closeTCPConnectionAfterBye>
- </advSettings>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">customMSRPTos</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">filesCount</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">firstRelayIpEnabled</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">automaticMSRPAuth</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">msrpSendEmptyMsg</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">msrpTransactionTimeout</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">msrpInterChunkTimeout</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tosMSRPVal</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enableMSRP</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">localDomain</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">relaysCount</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">domainType</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">firstRelayIp</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">advSettings</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">files</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">msrpFirstChunkTimeout</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">firstRelayIsIPv4</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">msrpPort</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_gbMSRPCustomTos</item>
- <item ref="4"/>
- </item>
- <item type="tuple">
- <item type="str">msrpSessionTimeout</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_gbEnableMSRP</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">enableMSRPTos</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">msrpReuseTCP</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">msrpGuiFiles</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">msrpTos</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">relays</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">msrpRelayPort</item>
- <item ref="3"/>
- </item>
- </_dict>
- </state>
- </msrpSettings>
- <_tempFile ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_FileRecord">
- <synthetic type="int">0</synthetic>
- <_typeStr type="str"></_typeStr>
- <name type="str"></name>
- <nameSynthetic type="str"></nameSynthetic>
- <fileClientPath type="str"></fileClientPath>
- <filePcpuPath type="str"></filePcpuPath>
- <_bFileSize type="int">20</_bFileSize>
- <_msrpSizeCombo type="int">2</_msrpSizeCombo>
- <size type="int">0</size>
- <btnMSRPFileBrowse type="int">0</btnMSRPFileBrowse>
- <type type="str">application/octet-stream</type>
- <fileHash type="str"></fileHash>
- </_tempFile>
- <_tempAdvSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_MSRPAdvancedSettings">
- <closeTCPConnectionAfterBye type="bool">False</closeTCPConnectionAfterBye>
- </_tempAdvSettings>
- <phoneBookInputLabel ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_PhoneBookInputLabel">
- <label type="str">5</label>
- </phoneBookInputLabel>
- <akaConfigurationInputLabel ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_AKAConfigurationInputLabel">
- <configurationLabel type="str"></configurationLabel>
- </akaConfigurationInputLabel>
- <phoneBook ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_PhoneBook">
- <fromFile type="int">0</fromFile>
- <pattern type="str">201004[0000-]</pattern>
- <filePath type="str"></filePath>
- <_PN1 type="bool">False</_PN1>
- <_bTelGrp type="bool">False</_bTelGrp>
- <ckTelURIBook type="bool">False</ckTelURIBook>
- <_bkTelURIparams type="str">phone-context=example.com</_bkTelURIparams>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">phoneBookList</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">filePath</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">pattern</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">ckTelURIBook</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_bkTelURIparams</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">_PN1</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_bTelGrp</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">fromFile</item>
- <item ref="1"/>
- </item>
- </_dict>
- </state>
- </phoneBook>
- <akaConfiguration ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_AKAConfiguration"/>
- <milenageConfiguration ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_MilenageConfiguration"/>
- <msgBox ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_MsgBox">
- <msg1 type="str"></msg1>
- <msg2 type="str"></msg2>
- </msgBox>
- <editCloudRule ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_EditCloudRule">
- <_gbStep1 type="bool">False</_gbStep1>
- <requestList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_EditCloudRule_requestList" itemtype="ixConfig">
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">ANY</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">INVITE</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">ACK</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">BYE</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">CANCEL</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">OPTIONS</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">REGISTER</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">NOTIFY</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">SUBSCRIBE</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">REFER</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">MESSAGE</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">PRACK</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">INFO</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">UPDATE</str>
- </item>
- </requestList>
- <reqList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_EditCloudRule_reqList" itemtype="ixConfig"/>
- <_gbStep2 type="bool">False</_gbStep2>
- <what type="int">2</what>
- <reqLine type="int">1</reqLine>
- <headerTypeList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_EditCloudRule_headerTypeList" itemtype="ixConfig">
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">To</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">From</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">Contact</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">Also</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">Authorization</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">Call-ID</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">Content-Length</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">Content-Type</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">CSeq</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">Event</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">Proxy-Authenticate</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">Proxy-Authorization</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">RAck</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">Record-Route</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">Refer-To</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">Referred-By</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">Replaces</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">Route</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">RSeq</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">Subscription-State</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">Via</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">WWW-Authenticate</str>
- </item>
- </headerTypeList>
- <headerType type="str">To</headerType>
- <compactForm type="str">t</compactForm>
- <occurFrom type="str">1</occurFrom>
- <occurTo type="str">1</occurTo>
- <whatExtract type="int">3</whatExtract>
- <extractHeaderName type="bool">False</extractHeaderName>
- <paramName type="str"></paramName>
- <revHeaderOrder type="bool">False</revHeaderOrder>
- <keepHeaderCrlf type="bool">False</keepHeaderCrlf>
- <_gbStep3 type="bool">False</_gbStep3>
- <usePosition type="int">0</usePosition>
- <beginAfter type="bool">False</beginAfter>
- <afterStr type="str">&lt;</afterStr>
- <afterOccur type="str">1</afterOccur>
- <endBefore type="bool">False</endBefore>
- <endStr type="str">&gt;</endStr>
- <endOccur type="str">last</endOccur>
- <positionFrom type="str">1</positionFrom>
- <positionTo type="str">last</positionTo>
- <_gbStep4 type="bool">False</_gbStep4>
- <formulaSource type="int">0</formulaSource>
- <formula type="str"></formula>
- <phoneBookPath type="str"></phoneBookPath>
- <phoneBookDodPath type="str"></phoneBookDodPath>
- <btnPBBrowse type="int">0</btnPBBrowse>
- </editCloudRule>
- <cloudRules ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CloudRules">
- <rulesList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_CloudRules_rulesList" itemtype="ixConfig"/>
- <cloudPhoneBooksAbsolutePath type="str">C:\Users\asordo\Documents\__Customers\Orange\OPNFV2_Lannion</cloudPhoneBooksAbsolutePath>
- </cloudRules>
- <cloudServers ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_VoIP_cloudServers" itemtype="ixConfig"/>
- <transferAddress ver="[1, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TransferAddress">
- <symTransferStr type="str">None</symTransferStr>
- <overridePhoneNo type="bool">False</overridePhoneNo>
- <_useTPb type="int">0</_useTPb>
- <_tBp type="str">&lt;None&gt;</_tBp>
- <_tBpPrv type="str"></_tBpPrv>
- <_tPhone type="str">150[00000000-]</_tPhone>
- <tPhoneType type="int">0</tPhoneType>
- <tPhone type="str">150[00000000-]</tPhone>
- <_tTelGrp type="bool">False</_tTelGrp>
- <_ckTTelURIParams type="bool">False</_ckTTelURIParams>
- <_tTelURIparams type="str">phone-context=example.com</_tTelURIparams>
- <transTelPar type="str"></transTelPar>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">_tBpPrv</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">overridePhoneNo</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_tTelGrp</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_useTPb</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">tPhone</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">transTelPar</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_tPhone</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_ckTTelURIParams</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">symTransferStr</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tPhoneType</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_tTelURIparams</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">_tBp</item>
- <item ref="3"/>
- </item>
- </_dict>
- </state>
- </transferAddress>
- <editContact ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_EditContact">
- <useDomainName type="int">0</useDomainName>
- <domainName type="str">mysipdomain.ixiacom.com</domainName>
- <_useEPb type="int">0</_useEPb>
- <_eBp type="str">&lt;None&gt;</_eBp>
- <_eBpPrv type="str"></_eBpPrv>
- <_ePhone type="str">160[00000000-]</_ePhone>
- <ePhoneType type="int">0</ePhoneType>
- <ePhone type="str">160[00000000-]</ePhone>
- <_eTelGrp type="bool">False</_eTelGrp>
- <_ckETelURI type="bool">False</_ckETelURI>
- <_eTelURIparams type="str">phone-context=example.com</_eTelURIparams>
- <editTelPar type="str"></editTelPar>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">_useEPb</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_eBpPrv</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">domainName</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">_eBp</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">_ePhone</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_eTelGrp</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">ePhoneType</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_eTelURIparams</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">useDomainName</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">editTelPar</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">ePhone</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_ckETelURI</item>
- <item ref="1"/>
- </item>
- </_dict>
- </state>
- </editContact>
- <dialPlan ver="[1, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_DialPlan">
- <sourceIPs type="str"></sourceIPs>
- <_useSPb type="int">0</_useSPb>
- <_sBp type="str">&lt;None&gt;</_sBp>
- <_sBpPrv type="str"></_sBpPrv>
- <_sPhone type="str">{{pncalling}}</_sPhone>
- <srcPhoneType type="int">0</srcPhoneType>
- <srcPhone type="str">{{pncalling}}</srcPhone>
- <_sTelGrp type="bool">False</_sTelGrp>
- <_ckSTelURIParams type="bool">False</_ckSTelURIParams>
- <_sTelURIparams type="str">phone-context=example.com</_sTelURIparams>
- <srcTelPar type="str"></srcTelPar>
- <_sTelGrp1 type="bool">False</_sTelGrp1>
- <_dTelGrp1 type="bool">False</_dTelGrp1>
- <symDestStr type="str">VoIP2_CALLED:{{sipportcalled}}</symDestStr>
- <ovrDestPhone type="bool">True</ovrDestPhone>
- <_useDPb type="int">0</_useDPb>
- <_dBp type="str">&lt;None&gt;</_dBp>
- <_dBpPrv type="str"></_dBpPrv>
- <_dPhone type="str">{{pncalled}}</_dPhone>
- <destPhoneType type="int">0</destPhoneType>
- <destPhone type="str">{{pncalled}}</destPhone>
- <_dTelGrp type="bool">False</_dTelGrp>
- <_ckDTelURIParams type="bool">False</_ckDTelURIParams>
- <_dTelURIparams type="str">phone-context=example.com</_dTelURIparams>
- <destTelPar type="str"></destTelPar>
- <enableEmergencyCalls type="bool">False</enableEmergencyCalls>
- <useAnonymous type="bool">False</useAnonymous>
- <makeEmergencyReg type="bool">False</makeEmergencyReg>
- <emergencyService type="str">sos</emergencyService>
- <emergencyServiceList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_DialPlan_emergencyServiceList" itemtype="ixConfig">
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">sos</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">sos.ambulance</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">sos.fire</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">sos.police</str>
- </item>
- </emergencyServiceList>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">_useSPb</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_dTelGrp1</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">sourceIPs</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enableEmergencyCalls</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">_sPhone</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_dBpPrv</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">destPhoneType</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">destTelPar</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">useAnonymous</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_dTelGrp</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">symDestStr</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_gbEmergencyDest</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">_sBp</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">makeEmergencyReg</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">destPhone</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">srcTelPar</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_gbEmergencySource</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">_ckSTelURIParams</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_dTelURIparams</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">_dBp</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">ovrDestPhone</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_sTelGrp1</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">emergencyServiceList</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_dPhone</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">srcPhone</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_gbEmergency</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">_sTelURIparams</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">_UseSrv1</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">srcPhoneType</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_sBpPrv</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_sTelGrp</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">emergencyService</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_useDPb</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_ckDTelURIParams</item>
- <item ref="1"/>
- </item>
- </_dict>
- </state>
- </dialPlan>
- <signalingSettings ver="[1, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_SignalingSettings">
- <enableSIP type="bool">True</enableSIP>
- <port type="str">{{sipportcalling}}</port>
- <tcpWriteImmediate type="bool">False</tcpWriteImmediate>
- <fqdn type="bool">False</fqdn>
- <realm type="str"></realm>
- <user type="str">{{pncalling}}@{{domainname}}</user>
- <passwd type="str">{{authpassword}}</passwd>
- <akaConfCombo type="str">&lt;None&gt;</akaConfCombo>
- <akaConfComboSelIndex type="int">0</akaConfComboSelIndex>
- <akaSharedSecretType type="int">0</akaSharedSecretType>
- <akaOperatorVariantType type="int">0</akaOperatorVariantType>
- <akaSharedSecretSequence type="str">ixia</akaSharedSecretSequence>
- <akaAbsolutePath type="str">C:\Users\asordo\Documents\__Customers\Orange\OPNFV2_Lannion</akaAbsolutePath>
- <akaOperatorVariantSequence type="str">ixia</akaOperatorVariantSequence>
- <akaSharedSecretSource type="int">0</akaSharedSecretSource>
- <akaOperatorVariantSource type="int">0</akaOperatorVariantSource>
- <akaExportComplete type="int">0</akaExportComplete>
- <akaUseOPasOPC type="bool">False</akaUseOPasOPC>
- <milenageConfCombo type="str">&lt;Default&gt;</milenageConfCombo>
- <milenage_c1 type="str">00000000000000000000000000000000</milenage_c1>
- <milenage_c2 type="str">00000000000000000000000000000001</milenage_c2>
- <milenage_c3 type="str">00000000000000000000000000000002</milenage_c3>
- <milenage_c4 type="str">00000000000000000000000000000004</milenage_c4>
- <milenage_c5 type="str">00000000000000000000000000000008</milenage_c5>
- <milenage_r1 type="int">64</milenage_r1>
- <milenage_r2 type="int">0</milenage_r2>
- <milenage_r3 type="int">32</milenage_r3>
- <milenage_r4 type="int">64</milenage_r4>
- <milenage_r5 type="int">96</milenage_r5>
- <enableTos type="bool">False</enableTos>
- <tos type="int">0</tos>
- <customSipTos type="str">0x00</customSipTos>
- <tosVal type="int">0</tosVal>
- <ovrTrans type="bool">False</ovrTrans>
- <ovrTransOption type="int">0</ovrTransOption>
- <useServer type="bool">True</useServer>
- <srvAddr type="str">{{iplistims}}</srvAddr>
- <srvPort type="str">5060</srvPort>
- <srvDomain type="str">{{domainname}}</srvDomain>
- <outboundProxy type="bool">False</outboundProxy>
- <useDnsSrv type="bool">False</useDnsSrv>
- <registrarSrv type="bool">True</registrarSrv>
- <autoRegister type="bool">True</autoRegister>
- <overrideRegistrar type="bool">False</overrideRegistrar>
- <overrideRegistrarAddress type="str">IP:PORT</overrideRegistrarAddress>
- <ovrContact type="bool">False</ovrContact>
- <ovrDest type="bool">True</ovrDest>
- <ovrDestHostPort type="str">{{domainname}}</ovrDestHostPort>
- <nUdpMaxSize type="int">2048</nUdpMaxSize>
- <enableSigComp type="bool">False</enableSigComp>
- <telURISource type="bool">False</telURISource>
- <telURIDest type="bool">False</telURIDest>
- <securityMechanismValList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_SignalingSettings_securityMechanismValList" itemtype="ixConfig">
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_SecurityMechanismVal">
- <checked type="bool">False</checked>
- <mechanism type="str">ipsec-3gpp</mechanism>
- <algorithm type="int">0</algorithm>
- <algorithmStr type="str">hmac-sha-1-96</algorithmStr>
- <protocol type="int">0</protocol>
- <protocolStr type="str">esp</protocolStr>
- <mode type="int">0</mode>
- <modeStr type="str">trans</modeStr>
- <encrypt_algorithm type="int">0</encrypt_algorithm>
- <encrypt_algorithmStr type="str">aes-cbc</encrypt_algorithmStr>
- <spi_start_idx type="int">255</spi_start_idx>
- <port_c type="str">[3000-4000]</port_c>
- <port_s type="str">4060</port_s>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">protocol</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">encrypt_algorithmStr</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">algorithm</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">modeStr</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">protocolStr</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">mechanism</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">algorithmStr</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">mode</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">port_s</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">port_c</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">spi_start_idx</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">encrypt_algorithm</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">checked</item>
- <item ref="1"/>
- </item>
- </_dict>
- </state>
- </item>
- </securityMechanismValList>
- <useIPSecDoubleSPIPatch type="bool">False</useIPSecDoubleSPIPatch>
- <enablePeriodicDNSQueries type="bool">False</enablePeriodicDNSQueries>
- <DNSTimeoutValue type="int">60</DNSTimeoutValue>
- <skipDeleteDNSRecordsAtLoopEnd type="bool">False</skipDeleteDNSRecordsAtLoopEnd>
- <enableVoLTE type="bool">False</enableVoLTE>
- <mediaBearerType type="int">0</mediaBearerType>
- <enableCCDedicatedBearer type="bool">True</enableCCDedicatedBearer>
- <volte_grbox type="bool">False</volte_grbox>
- <_enableAutoHeaders type="bool">False</_enableAutoHeaders>
- <_btnAutoHeaders type="bool">False</_btnAutoHeaders>
- <dontEndMediaOnBye type="bool">False</dontEndMediaOnBye>
- <closeTCPConnectionsOnRampdown type="bool">False</closeTCPConnectionsOnRampdown>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">_gbSrvSettings</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">akaSharedSecretType</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_btnAutoHeaders</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">tcpWriteImmediate</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">ovrDest</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_enableAutoHeaders</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enableSIP</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">fqdn</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">akaSharedSecretSource</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">milenageConfCombo</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">milenage_c3</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">milenage_c2</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">milenage_c5</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">milenage_c4</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">akaConfCombo</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_UseSrv1</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">akaOperatorVariantType</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">overrideRegistrar</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">port</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">milenage_r2</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">registrarSrv</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">milenage_r4</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">milenage_r5</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_gbRetransmissions</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">milenage_r3</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">milenage_r1</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tos</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">user</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">akaOperatorVariantSource</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">telURISource</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">useServer</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">nUdpMaxSize</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">retransmit1xx</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">srvDomain</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_btnEditContact1</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">telURIDest</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">ovrTimeout</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enablePeriodicDNSQueries</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">useIPSecDoubleSPIPatch</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">securityMechanismValList</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">skipDeleteDNSRecordsAtLoopEnd</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">overrideRegistrarAddress</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">enableTos</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">srvAddr</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">ovrDestHostPort</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">DNSTimeoutValue</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">tosVal</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">passwd</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">T2</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">autoRegister</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">T1</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enableSigComp</item>
- <item ref="2"/>
- </item>
- <item type="tuple">
- <item type="str">akaOperatorVariantSequence</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enableVoLTE</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">retransmitACK</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">akaSharedSecretSequence</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">volte_grbox</item>
- <item ref="2"/>
- </item>
- <item type="tuple">
- <item type="str">customSipTos</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">dontEndMediaOnBye</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">realm</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">akaExportComplete</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">mediaBearerType</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_gbPeriodicDNSQuery</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">enableRetransmissions</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">milenage_c1</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">akaUseOPasOPC</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_ovrDest1</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">outboundProxy</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">ignoreRetransmissions</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">closeTCPConnectionsOnRampdown</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">ovrContact</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">akaAbsolutePath</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">serverAddresses</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enableCCDedicatedBearer</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">akaConfComboSelIndex</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_gbCustomTos</item>
- <item ref="4"/>
- </item>
- <item type="tuple">
- <item type="str">ovrTrans</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">useDnsSrv</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">ovrTransOption</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">_enableSIP2</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_enableSIP1</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">srvPort</item>
- <item ref="1"/>
- </item>
- </_dict>
- </state>
- </signalingSettings>
- <timerSettings ver="[2, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TimerSettings">
- <enableTimers type="bool">True</enableTimers>
- <expirationValList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_TimerSettings_expirationValList" itemtype="ixConfig">
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_ExpirationVal">
- <checked type="bool">True</checked>
- <message type="str">REGISTER</message>
- <msgPart type="int">0</msgPart>
- <msgPartStr type="str">Expires Header(s)</msgPartStr>
- <value type="int">3600</value>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">message</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">msgPart</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">checked</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">value</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">msgPartStr</item>
- <item ref="1"/>
- </item>
- </_dict>
- </state>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_ExpirationVal">
- <checked type="bool">True</checked>
- <message type="str">INVITE</message>
- <msgPart type="int">2</msgPart>
- <msgPartStr type="str">Session-Expire(s)</msgPartStr>
- <value type="int">90</value>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">message</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">msgPart</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">checked</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">value</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">msgPartStr</item>
- <item ref="1"/>
- </item>
- </_dict>
- </state>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_ExpirationVal">
- <checked type="bool">True</checked>
- <message type="str">UPDATE</message>
- <msgPart type="int">2</msgPart>
- <msgPartStr type="str">Session-Expire(s)</msgPartStr>
- <value type="int">90</value>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">message</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">msgPart</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">checked</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">value</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">msgPartStr</item>
- <item ref="1"/>
- </item>
- </_dict>
- </state>
- </item>
- </expirationValList>
- <sessionRefreshType type="int">1</sessionRefreshType>
- <refreshAfterSecs type="int">3000</refreshAfterSecs>
- <refreshAfterPercent type="int">50</refreshAfterPercent>
- <refreshInSecs type="int">32</refreshInSecs>
- <enableRetransmissions type="bool">False</enableRetransmissions>
- <T1 type="int">500</T1>
- <T2 type="int">4000</T2>
- <ignoreRetransmissions type="bool">True</ignoreRetransmissions>
- <retransmitACK type="bool">True</retransmitACK>
- <stopActiveRetr type="bool">True</stopActiveRetr>
- <retransmit1xx type="bool">False</retransmit1xx>
- <ovrTimeout type="bool">False</ovrTimeout>
- <minInterReregister type="int">0</minInterReregister>
- <autoEndCall2 type="bool">False</autoEndCall2>
- <enableAutoPRACK type="bool">False</enableAutoPRACK>
- <rprSendNegotiatedSDP type="bool">False</rprSendNegotiatedSDP>
- <rprTimeUntilNextRPR type="int">150</rprTimeUntilNextRPR>
- <rprScenarioHasPRACK type="bool">False</rprScenarioHasPRACK>
- <auto4xx type="bool">False</auto4xx>
- <auto4xxAbort type="bool">False</auto4xxAbort>
- <autoProcedureList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_TimerSettings_autoProcedureList" itemtype="ixConfig"/>
- <autoProceduresCount type="int">0</autoProceduresCount>
- <procListChanged type="bool">True</procListChanged>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">btnRefreshProcList</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">autoEndCall</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">ignoreRetransmissions</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">minInterReregister</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">autoEndCall2</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enableTimers</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">refreshInSecs</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">retransmit1xx</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">_gbEnableTimers</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">ovrTimeout</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">sessionRefreshType</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">auto4xx</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">retransmitACK</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">procListChanged</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">T2</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">autoProcedureList</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_gbAutoPRACK</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">T1</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">refreshAfterPercent</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enableAutoPRACK</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">stopActiveRetr</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">enableRetransmissions</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">rprTimeUntilNextRPR</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">rprScenarioHasPRACK</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">expirationValList</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">refreshAfterSecs</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">autoProceduresCount</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">auto4xxAbort</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">rprSendNegotiatedSDP</item>
- <item ref="1"/>
- </item>
- </_dict>
- </state>
- </timerSettings>
- <advancedSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_AdvancedSettings">
- <useCloud type="bool">False</useCloud>
- <_useCloud1 type="bool">False</_useCloud1>
- <cloud type="str">&lt;None&gt;</cloud>
- <serverRules ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_AdvancedSettings_serverRules" itemtype="ixConfig"/>
- <enableVirtualIPs type="bool">False</enableVirtualIPs>
- <virtualIPTable ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_AdvancedSettings_virtualIPTable" itemtype="ixConfig"/>
- <ovrCloudRules type="bool">False</ovrCloudRules>
- <_ovrCloudRules1 type="bool">False</_ovrCloudRules1>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">_gbVirtualIPs</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">useCloud</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">ovrCloudRules</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_ovrCloudRules1</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">cloud</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">enableVirtualIPs</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">virtualIPTable</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">serverRules</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_useCloud1</item>
- <item ref="3"/>
- </item>
- </_dict>
- </state>
- </advancedSettings>
- <tlsSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsSettings">
- <enableTLS type="bool">False</enableTLS>
- <enableDTLS type="bool">False</enableDTLS>
- <enableTLS_MSRP type="bool">False</enableTLS_MSRP>
- <enableTLS_HTTP type="bool">False</enableTLS_HTTP>
- <_enableTLS1 type="bool">False</_enableTLS1>
- <_enableTLS2 type="bool">False</_enableTLS2>
- <_enableTLS3 type="bool">False</_enableTLS3>
- <tlsPort type="str">5061</tlsPort>
- <tlsProtocol type="int">3</tlsProtocol>
- <tlsSessionRefresh type="bool">False</tlsSessionRefresh>
- <_tlsSessionRefresh type="bool">False</_tlsSessionRefresh>
- <tlsRefreshInterval type="int">3600</tlsRefreshInterval>
- <tlsAuthClient type="int">0</tlsAuthClient>
- <tlsReuseConnection type="bool">False</tlsReuseConnection>
- <_tlsReuseConnection type="bool">False</_tlsReuseConnection>
- <ignoreSubjectAltName type="bool">False</ignoreSubjectAltName>
- <tlsMutual type="bool">False</tlsMutual>
- <_gbTlsMutual type="bool">False</_gbTlsMutual>
- <tlsCyphers ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_TlsSettings_tlsCyphers" itemtype="ixConfig">
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers">
- <enabled type="bool">True</enabled>
- <name type="str">ECDHE-ECDSA-AES128-GCM-SHA256</name>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">enabled</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">name</item>
- <item ref="3"/>
- </item>
- </_dict>
- </state>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers">
- <enabled type="bool">True</enabled>
- <name type="str">ECDHE-ECDSA-AES256-GCM-SHA384</name>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">enabled</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">name</item>
- <item ref="3"/>
- </item>
- </_dict>
- </state>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers">
- <enabled type="bool">True</enabled>
- <name type="str">ECDHE-RSA-AES128-GCM-SHA256</name>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">enabled</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">name</item>
- <item ref="3"/>
- </item>
- </_dict>
- </state>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers">
- <enabled type="bool">True</enabled>
- <name type="str">ECDHE-ECDSA-AES256-SHA</name>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">enabled</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">name</item>
- <item ref="3"/>
- </item>
- </_dict>
- </state>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers">
- <enabled type="bool">True</enabled>
- <name type="str">ECDHE-ECDSA-AES128-SHA</name>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">enabled</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">name</item>
- <item ref="3"/>
- </item>
- </_dict>
- </state>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers">
- <enabled type="bool">True</enabled>
- <name type="str">ECDHE-RSA-AES128-SHA</name>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">enabled</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">name</item>
- <item ref="3"/>
- </item>
- </_dict>
- </state>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers">
- <enabled type="bool">True</enabled>
- <name type="str">AES128-SHA</name>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">enabled</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">name</item>
- <item ref="3"/>
- </item>
- </_dict>
- </state>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers">
- <enabled type="bool">True</enabled>
- <name type="str">AES256-SHA</name>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">enabled</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">name</item>
- <item ref="3"/>
- </item>
- </_dict>
- </state>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers">
- <enabled type="bool">False</enabled>
- <name type="str">ECDHE-ECDSA-AES256-SHA384</name>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">enabled</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">name</item>
- <item ref="3"/>
- </item>
- </_dict>
- </state>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers">
- <enabled type="bool">False</enabled>
- <name type="str">ECDHE-ECDSA-AES128-SHA256</name>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">enabled</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">name</item>
- <item ref="3"/>
- </item>
- </_dict>
- </state>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers">
- <enabled type="bool">False</enabled>
- <name type="str">ECDHE-RSA-AES256-GCM-SHA384</name>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">enabled</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">name</item>
- <item ref="3"/>
- </item>
- </_dict>
- </state>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers">
- <enabled type="bool">False</enabled>
- <name type="str">ECDHE-RSA-AES128-SHA256</name>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">enabled</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">name</item>
- <item ref="3"/>
- </item>
- </_dict>
- </state>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers">
- <enabled type="bool">False</enabled>
- <name type="str">ECDHE-RSA-AES256-SHA384</name>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">enabled</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">name</item>
- <item ref="3"/>
- </item>
- </_dict>
- </state>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers">
- <enabled type="bool">False</enabled>
- <name type="str">DES-CBC-SHA</name>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">enabled</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">name</item>
- <item ref="3"/>
- </item>
- </_dict>
- </state>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers">
- <enabled type="bool">False</enabled>
- <name type="str">DES-CBC3-SHA</name>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">enabled</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">name</item>
- <item ref="3"/>
- </item>
- </_dict>
- </state>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers">
- <enabled type="bool">False</enabled>
- <name type="str">EXP-DES-CBC-SHA</name>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">enabled</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">name</item>
- <item ref="3"/>
- </item>
- </_dict>
- </state>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers">
- <enabled type="bool">False</enabled>
- <name type="str">EXP-RC2-CBC-MD5</name>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">enabled</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">name</item>
- <item ref="3"/>
- </item>
- </_dict>
- </state>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers">
- <enabled type="bool">False</enabled>
- <name type="str">EXP-RC4-MD5</name>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">enabled</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">name</item>
- <item ref="3"/>
- </item>
- </_dict>
- </state>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers">
- <enabled type="bool">False</enabled>
- <name type="str">EXP1024-DES-CBC-SHA</name>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">enabled</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">name</item>
- <item ref="3"/>
- </item>
- </_dict>
- </state>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers">
- <enabled type="bool">False</enabled>
- <name type="str">EXP1024-RC4-SHA</name>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">enabled</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">name</item>
- <item ref="3"/>
- </item>
- </_dict>
- </state>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers">
- <enabled type="bool">False</enabled>
- <name type="str">IDEA-CBC-SHA</name>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">enabled</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">name</item>
- <item ref="3"/>
- </item>
- </_dict>
- </state>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers">
- <enabled type="bool">False</enabled>
- <name type="str">NULL-MD5</name>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">enabled</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">name</item>
- <item ref="3"/>
- </item>
- </_dict>
- </state>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers">
- <enabled type="bool">False</enabled>
- <name type="str">NULL-SHA</name>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">enabled</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">name</item>
- <item ref="3"/>
- </item>
- </_dict>
- </state>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers">
- <enabled type="bool">False</enabled>
- <name type="str">RC4-MD5</name>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">enabled</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">name</item>
- <item ref="3"/>
- </item>
- </_dict>
- </state>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers">
- <enabled type="bool">False</enabled>
- <name type="str">RC4-SHA</name>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">enabled</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">name</item>
- <item ref="3"/>
- </item>
- </_dict>
- </state>
- </item>
- </tlsCyphers>
- <tlsCertificatesPath type="str">C:\Program Files (x86)\Ixia\IxLoad\8.20-EA\aptixia\data\SSL_Certificates</tlsCertificatesPath>
- <tlsPrivateKeyCertificate type="str">Unsecured_RSA_key_1024.pem</tlsPrivateKeyCertificate>
- <tlsPublicKeyCertificate type="str">Unsecured_RSA_cert_1024.pem</tlsPublicKeyCertificate>
- <tlsKeyType type="int">0</tlsKeyType>
- <tlsCertType type="int">0</tlsCertType>
- <tlsPassword type="str"></tlsPassword>
- <sipScheme type="int">0</sipScheme>
- <tlsTransportType type="int">0</tlsTransportType>
- <tlsDisableUdpAndTcp type="bool">True</tlsDisableUdpAndTcp>
- <tlsEnableTcpKeepAlive type="bool">False</tlsEnableTcpKeepAlive>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">tlsCertType</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tlsPassword</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tlsPort</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">ignoreSubjectAltName</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tlsPrivateKeyCertificate</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tlsTransportType</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enableTLS_HTTP</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tlsCyphers</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tlsProtocol</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tlsKeyType</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_tlsSessionRefresh</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">tlsCertificatesPath</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tlsEnableTcpKeepAlive</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_gbTlsMutual</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">tlsPublicKeyCertificate</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_enableCert</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">enableTLS</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tlsAuthClient</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tlsMutual</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_enableTLS4</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">_enableTLS1</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">_enableTLS2</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">_enableTLS3</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">enableDTLS</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enableTLS_MSRP</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tlsReuseConnection</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tlsRefreshInterval</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tlsSessionRefresh</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tlsDisableUdpAndTcp</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">sipScheme</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_tlsReuseConnection</item>
- <item ref="3"/>
- </item>
- </_dict>
- </state>
- </tlsSettings>
- <dtlsOptions ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_DtlsOptions">
- <dtlsRetry type="int">200</dtlsRetry>
- <dtlsTimeout type="int">30000</dtlsTimeout>
- <dtlsSessionTicket type="bool">False</dtlsSessionTicket>
- </dtlsOptions>
- <iceOptions ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_IceOptions">
- <iceRetryCount type="int">6</iceRetryCount>
- <iceInitialRetry type="int">100</iceInitialRetry>
- <iceTimeout type="int">30000</iceTimeout>
- </iceOptions>
- <otherSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_OtherSettings">
- <VOIP_Var0 type="str"></VOIP_Var0>
- <VOIP_Var1 type="str"></VOIP_Var1>
- <VOIP_Var2 type="str"></VOIP_Var2>
- <VOIP_Var3 type="str"></VOIP_Var3>
- <VOIP_Var4 type="str"></VOIP_Var4>
- <VOIP_IPAddress0 type="str"></VOIP_IPAddress0>
- <VOIP_IPAddress1 type="str"></VOIP_IPAddress1>
- <VOIP_IPAddress2 type="str"></VOIP_IPAddress2>
- <VOIP_IPAddress3 type="str"></VOIP_IPAddress3>
- <VOIP_IPAddress4 type="str"></VOIP_IPAddress4>
- <ipPreference type="int">0</ipPreference>
- <bUseHardcoded type="bool">False</bUseHardcoded>
- <_gbHardcodedForDemo type="bool">False</_gbHardcodedForDemo>
- <_gbStunSettings type="bool">False</_gbStunSettings>
- <bUseStun type="bool">False</bUseStun>
- <stunAddr type="str">127.0.0.1</stunAddr>
- <stunPort type="str">3478</stunPort>
- <bUseIce type="bool">False</bUseIce>
- <bIceLite type="bool">False</bIceLite>
- <_gbSRVCCSettings type="bool">False</_gbSRVCCSettings>
- <bUseSRVCC type="bool">False</bUseSRVCC>
- <mobilityPath type="str"></mobilityPath>
- <ddgGroupboxSRVCC type="bool">False</ddgGroupboxSRVCC>
- <PCO_Groupbox type="bool">False</PCO_Groupbox>
- <bUsePCO type="bool">False</bUsePCO>
- <_gbPCO type="bool">False</_gbPCO>
- <PCO_List type="str"></PCO_List>
- <useBHCA type="bool">False</useBHCA>
- <loadVariablesFromCsv type="bool">False</loadVariablesFromCsv>
- <pathForCsvWithVariables type="str"></pathForCsvWithVariables>
- <absolutePathForCsvWithVariables type="str"></absolutePathForCsvWithVariables>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">_gbIceSettings</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">_gbPCO</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">VOIP_IPAddress4</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">VOIP_IPAddress1</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">VOIP_IPAddress0</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">VOIP_IPAddress3</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">VOIP_IPAddress2</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">bUseIce</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">mobilityPath</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">VOIP_Var0</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_gbStunSettings</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">PCO_List</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_gbSRVCCSettings</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">absolutePathForCsvWithVariables</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">bIceLite</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">PCO_Groupbox</item>
- <item ref="2"/>
- </item>
- <item type="tuple">
- <item type="str">bUseHardcoded</item>
- <item ref="2"/>
- </item>
- <item type="tuple">
- <item type="str">bUseSRVCC</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">useBHCA</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">ipPreference</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">btnBrowseForVariableCsv</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">bUsePCO</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">stunPort</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">bUseStun</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">stunAddr</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">ddgGroupboxSRVCC</item>
- <item ref="2"/>
- </item>
- <item type="tuple">
- <item type="str">_gbHardcodedForDemo</item>
- <item ref="2"/>
- </item>
- <item type="tuple">
- <item type="str">pathForCsvWithVariables</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">DodPathForCsvWithVariables</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">_varCsvGroupBox</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">VOIP_Var1</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">loadVariablesFromCsv</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">VOIP_Var3</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">VOIP_Var2</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">VOIP_Var4</item>
- <item ref="1"/>
- </item>
- </_dict>
- </state>
- </otherSettings>
- <smsSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_SMSSettings">
- <enableSMS type="bool">False</enableSMS>
- <requestURI type="str">sc.home1.net</requestURI>
- <enableTelURI type="bool">False</enableTelURI>
- <telURI type="str">phone-context=example</telURI>
- <smscPhoneNo type="str">61814712345</smscPhoneNo>
- <smscTypeOfNo type="int">0</smscTypeOfNo>
- <smscNumberingPlan type="int">0</smscNumberingPlan>
- <enableSMOrigOverrideDest type="bool">False</enableSMOrigOverrideDest>
- <btnSMOrigEdit type="bool">False</btnSMOrigEdit>
- <enableSMOrigReqStatusReport type="bool">False</enableSMOrigReqStatusReport>
- <enableSMOrigReplyPath type="bool">False</enableSMOrigReplyPath>
- <smsAddressOriginator ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_SMSAddressInfo">
- <phoneType type="bool">False</phoneType>
- <phoneValue type="str">160[00000000-]</phoneValue>
- <comboPhoneBookEntry type="str">&lt;None&gt;</comboPhoneBookEntry>
- </smsAddressOriginator>
- <smOrigTypeOfNo type="int">0</smOrigTypeOfNo>
- <smOrigNumberingPlan type="int">0</smOrigNumberingPlan>
- <enableSMRecipOverrideSrc type="bool">False</enableSMRecipOverrideSrc>
- <btnSMRecipEdit type="bool">False</btnSMRecipEdit>
- <enableSMRecipReqStatusReport type="bool">False</enableSMRecipReqStatusReport>
- <enableSMRecipReplyPath type="bool">False</enableSMRecipReplyPath>
- <smsAddressRecipient ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_SMSAddressInfo">
- <phoneType type="bool">False</phoneType>
- <phoneValue type="str">160[00000000-]</phoneValue>
- <comboPhoneBookEntry type="str">&lt;None&gt;</comboPhoneBookEntry>
- </smsAddressRecipient>
- <smRecipTypeOfNo type="int">0</smRecipTypeOfNo>
- <smRecipNumberingPlan type="int">0</smRecipNumberingPlan>
- <depActivities ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_SMSSettings_depActivities" itemtype="ixConfig"/>
- <useFilesFromActivity type="bool">False</useFilesFromActivity>
- <verifyUserInfo type="bool">False</verifyUserInfo>
- <smsImportFilesActivity type="str">None</smsImportFilesActivity>
- <smsActivityForFiles type="int">0</smsActivityForFiles>
- <pcpuCommonPath type="str"></pcpuCommonPath>
- <smsFiles ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_SMSSettings_smsFiles" itemtype="ixConfig"/>
- <smsFilesCount type="int">0</smsFilesCount>
- <grBoxSMServiceCenter type="bool">False</grBoxSMServiceCenter>
- <grBoxSMOriginator type="bool">False</grBoxSMOriginator>
- <grBoxSMRecipient type="bool">False</grBoxSMRecipient>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">smOrigNumberingPlan</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">smsFiles</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">enableSMS</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enableSMOrigReplyPath</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">smsFilesCount</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">btnSMRecipEdit</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">enableSMOrigReqStatusReport</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">grBoxSMRecipient</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">enableSMRecipOverrideSrc</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">grBoxSMOriginator</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">smsAddressOriginator</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">telURI</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">depActivities</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">pcpuCommonPath</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">smOrigTypeOfNo</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">smRecipTypeOfNo</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">requestURI</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">smsFilesBackup</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">smsAddressRecipient</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enableTelURI</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">useFilesFromActivity</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">smRecipNumberingPlan</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">smscPhoneNo</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">smsImportFilesActivity</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">enableSMRecipReplyPath</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">btnSMOrigEdit</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">smscNumberingPlan</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">duringLoadFromBackup</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enableSMRecipReqStatusReport</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">grBoxSMServiceCenter</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">verifyUserInfo</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">smscTypeOfNo</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">enableSMOrigOverrideDest</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">smsActivityForFiles</item>
- <item ref="1"/>
- </item>
- </_dict>
- </state>
- </smsSettings>
- <smsFilesAdd ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_SMSFilesAdd">
- <loadedFileType type="int">0</loadedFileType>
- <fileName type="str"></fileName>
- <ixSmsFileName type="str"></ixSmsFileName>
- <ixSmsFilePath type="str"></ixSmsFilePath>
- <segmentOrder type="str"></segmentOrder>
- <totalTpudSize type="str"></totalTpudSize>
- <segmentNo type="str">0</segmentNo>
- <comboCoding type="int">0</comboCoding>
- <comboRefNo type="int">0</comboRefNo>
- <contentViewEdit type="str"></contentViewEdit>
- <contentViewShow type="str"></contentViewShow>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">contentViewShow</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">ixSmsFilePath</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">contentViewEdit</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">segmentOrder</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">comboRefNo</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">loadedFileType</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">btnSmsLoadFiles</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">ixSmsFileName</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">btnSmsSaveAs</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">fileName</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">segmentNo</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">totalTpudSize</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">comboCoding</item>
- <item ref="3"/>
- </item>
- </_dict>
- </state>
- </smsFilesAdd>
- <smsAddressOriginator ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_SMSAddress">
- <radioBtnPhoneNo type="int">0</radioBtnPhoneNo>
- <comboPhoneBook type="str">&lt;None&gt;</comboPhoneBook>
- <phoneBookPreview type="str"></phoneBookPreview>
- <userPattern type="str">160[00000000-]</userPattern>
- <ePhoneType type="int">0</ePhoneType>
- <ePhone type="str">160[00000000-]</ePhone>
- <fakeEnableTelURI type="bool">False</fakeEnableTelURI>
- <fakeTelURI type="str"></fakeTelURI>
- <fakeTelToPort type="str"></fakeTelToPort>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">userPattern</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">phoneBookPreview</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">ePhoneType</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">ePhone</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">fakeEnableTelURI</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">comboPhoneBook</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">fakeTelToPort</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">fakeTelURI</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">radioBtnPhoneNo</item>
- <item ref="1"/>
- </item>
- </_dict>
- </state>
- </smsAddressOriginator>
- <smsAddressRecipient ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_SMSAddress">
- <radioBtnPhoneNo type="int">0</radioBtnPhoneNo>
- <comboPhoneBook type="str">&lt;None&gt;</comboPhoneBook>
- <phoneBookPreview type="str"></phoneBookPreview>
- <userPattern type="str">160[00000000-]</userPattern>
- <ePhoneType type="int">0</ePhoneType>
- <ePhone type="str">160[00000000-]</ePhone>
- <fakeEnableTelURI type="bool">False</fakeEnableTelURI>
- <fakeTelURI type="str"></fakeTelURI>
- <fakeTelToPort type="str"></fakeTelToPort>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">userPattern</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">phoneBookPreview</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">ePhoneType</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">ePhone</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">fakeEnableTelURI</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">comboPhoneBook</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">fakeTelToPort</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">fakeTelURI</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">radioBtnPhoneNo</item>
- <item ref="1"/>
- </item>
- </_dict>
- </state>
- </smsAddressRecipient>
- <compatibility ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_Compatibility">
- <hasRtpChMapRules type="bool">True</hasRtpChMapRules>
- </compatibility>
- <editAutoHeaderRule ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_EditAutoHeaderRule">
- <defaultMessagesList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_EditAutoHeaderRule_defaultMessagesList" itemtype="ixConfig">
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">INVITE</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">ACK</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">BYE</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">CANCEL</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">OPTIONS</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">REGISTER</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">NOTIFY</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">SUBSCRIBE</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">REFER</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">MESSAGE</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">PRACK</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">INFO</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">UPDATE</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">100 (Trying)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">180 (Ringing)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">181 (Call Is Being Forwarded)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">182 (Queued)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">183 (Session Progress)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">200 (OK)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">202 (Accepted)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">300 (Multiple Choices)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">301 (Moved Permanently)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">302 (Moved Temporarily)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">305 (Use Proxy)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">380 (Alternative Service)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">400 (Bad Request)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">401 (Unauthorized)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">402 (Payment Required)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">403 (Forbidden)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">404 (Not Found)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">405 (Method Not Allowed)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">406 (Not Acceptable)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">407 (Proxy Authentication Required)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">408 (Request Timeout)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">410 (Gone)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">413 (Request Entity Too Large)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">414 (Request-URI Too Large)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">415 (Unsupported Media Type)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">416 (Unsupported URI Scheme)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">420 (Bad Extension)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">421 (Extension Required)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">423 (Interval Too Brief)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">480 (Temporarily not available)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">481 (Call Leg/Transaction Does Not Exist)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">482 (Loop Detected)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">483 (Too Many Hops)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">484 (Address Incomplete)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">485 (Ambiguous)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">486 (Busy Here)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">487 (Request Terminated)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">488 (Not Acceptable Here)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">491 (Request Pending)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">493 (Undecipherable)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">500 (Internal Server Error)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">501 (Not Implemented)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">502 (Bad Gateway)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">503 (Service Unavailable)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">504 (Server Time-out)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">505 (SIP Version not supported)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">513 (Message Too Large)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">600 (Busy Everywhere)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">603 (Decline)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">604 (Does not exist anywhere)</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">606 (Not Acceptable)</str>
- </item>
- </defaultMessagesList>
- <messagesList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_EditAutoHeaderRule_messagesList" itemtype="ixConfig"/>
- <autoHeaderTypeList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_EditAutoHeaderRule_autoHeaderTypeList" itemtype="ixConfig">
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">Request-Uri</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">Via</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">From</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">To</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">Call-ID</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">CSeq</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">Contact</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">Content-Length</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">Route</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">Record-Route</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">Authorization</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">Proxy-Authorization</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">Referred-By</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">Replaces</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">Event</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">RAck</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">RSeq</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">Refer-To</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">Subscription-State</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">WWW-Authenticate</str>
- </item>
- <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString">
- <str type="str">Also</str>
- </item>
- </autoHeaderTypeList>
- <autoHeaderType type="str">To</autoHeaderType>
- <option type="int">0</option>
- <appendToUri type="bool">False</appendToUri>
- <headerValue type="str"></headerValue>
- <parsedHeader ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_EditAutoHeaderRule_parsedHeader" itemtype="ixConfig"/>
- <valid type="bool">True</valid>
- </editAutoHeaderRule>
- <autoHeadersSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_AutoHeadersSettings">
- <enableAutoHeaders type="bool">False</enableAutoHeaders>
- <tableRules ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_AutoHeadersSettings_tableRules" itemtype="ixConfig"/>
- <reqAutoHeadRules ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_AutoHeadersSettings_reqAutoHeadRules" itemtype="ixConfig"/>
- <respAutoHeadRules ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_AutoHeadersSettings_respAutoHeadRules" itemtype="ixConfig"/>
- </autoHeadersSettings>
- <sipAdvSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_SipAdvancedSettings">
- <overrideTCPLocalPort type="bool">False</overrideTCPLocalPort>
- <tcpLocalPortStart type="int">40000</tcpLocalPortStart>
- <tcpLocalPortEnd type="int">60000</tcpLocalPortEnd>
- <tcpLocalPortStep type="int">1</tcpLocalPortStep>
- <closeNonsecureTcpConnectionsEnable type="bool">False</closeNonsecureTcpConnectionsEnable>
- <closeIdleTcpConnectionsEnable type="bool">False</closeIdleTcpConnectionsEnable>
- <tcpIdlePeriod type="int">10</tcpIdlePeriod>
- <donotCloseTCPInsideCallEnable type="bool">False</donotCloseTCPInsideCallEnable>
- <recordingServerEnable type="bool">False</recordingServerEnable>
- <state ver="[0, [0, [0]]]" type="ixPropertyStateDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">tcpIdlePeriod</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tcpEndPortLabel</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">tcpIdlePeriodLabel</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">donotCloseTCPInsideCallEnable</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">tcpPortStepLabel</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">tcpLocalPortStep</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">tcpLocalPortEnd</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">tcpStartPortLabel</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">tcpLocalPortStart</item>
- <item ref="3"/>
- </item>
- <item type="tuple">
- <item type="str">closeIdleTcpConnectionsEnable</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">recordingServerEnable</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">overrideTCPLocalPort</item>
- <item ref="1"/>
- </item>
- <item type="tuple">
- <item type="str">closeNonsecureTcpConnectionsEnable</item>
- <item ref="1"/>
- </item>
- </_dict>
- </state>
- </sipAdvSettings>
- </pm>
- <objectID type="int">6</objectID>
- <_apiUniqueId type="int">16382</_apiUniqueId>
- <uniqueID type="int">39</uniqueID>
- <commandIdCounter type="int">59</commandIdCounter>
- <networkPluginSettings ver="[0]" type="ixNetworkActivityPluginSupport">
- <serializedNetworkSettingsMap ver="[0, [0, [0]]]" type="ixOrderedDict">
- <_dict type="list"/>
- </serializedNetworkSettingsMap>
- <protocolName type="str">VoIP</protocolName>
- </networkPluginSettings>
- </item>
- </agentList>
- </traffic>
- <network ver="[17, [1, [6, [1, [0, [0]]]]]]" type="ixNetworkGroup">
- <resourceSyncTimeStamp type="NoneType">None</resourceSyncTimeStamp>
- <name type="str">VM1</name>
- <role type="str">Both</role>
- <networkType type="str">none</networkType>
- <aggregation type="int">0</aggregation>
- <lineSpeed type="str">Default</lineSpeed>
- <cpuAggregation type="bool">False</cpuAggregation>
- <chassisChain ref="6"/>
- <cardType type="str">Ixia Virtual Load Module</cardType>
- <activePortList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="ixNetworkPortListSequenceContainer" itemtype="ixConfig"/>
- <portList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" oid="21" type="ixNetworkPortListSequenceContainer" itemtype="ixConfig">
- <item ver="[3, [1, [1, [0, [0]]]]]" type="ixPort">
- <chassisId type="int">1</chassisId>
- <cardId type="int">1</cardId>
- <portId type="int">1</portId>
- <enableCapture type="bool">False</enableCapture>
- <cardType type="str">Ixia Virtual Load Module</cardType>
- <portPersistentSetting ver="[0, [1, [0, [0]]]]" type="ixPortPersistentSetting">
- <viewFilter type="NoneType">None</viewFilter>
- </portPersistentSetting>
- <analyzerPartialCapture type="str">False;8192</analyzerPartialCapture>
- <name type="str"></name>
- <afmPort type="NoneType">None</afmPort>
- </item>
- </portList>
- <comment type="str"></comment>
- <networkRangeList ver="[0, [2, [0, [3, [0, [0, [0], [0]], [0]]]]]]" type="ixNetworkRangeListSequenceContainer" itemtype="ixNetworkRange">
- <item ver="[13, [1, [1, [1, [0, [0]]]]]]" oid="15" type="ixNetworkRange">
- <_smRangeObjectId type="str">5affc0a7-68f6-46f6-b801-0e18e067a572</_smRangeObjectId>
- <name type="str">Network Range IP-R13 in VM1 ({{ipcard1}}+1)</name>
- <rangeGroup ver="[3, [0, [1, [0, [0]]]]]" oid="16" type="ixIpDistributionGroup">
- <name type="str">Group1</name>
- <ipDistributionMethod type="str">consecutiveIps</ipDistributionMethod>
- <objectID type="int">0</objectID>
- <_apiUniqueId type="int">15457</_apiUniqueId>
- <_networkRangeList ver="[0, [3, [0, [0, [0], [0]], [0]]]]" type="ixWeakrefSequenceContainer" itemtype="ixNetworkRange">
- <item ref="15"/>
- </_networkRangeList>
- <_rangeGroupObjectId type="str">abf2b6e4-a102-4cbe-bf1b-a11f11b2faac</_rangeGroupObjectId>
- <_smPluginObjectId type="str">9ea551b2-a0af-4a7d-9872-e9b94298d7bd</_smPluginObjectId>
- </rangeGroup>
- <enableStats type="bool">False</enableStats>
- </item>
- </networkRangeList>
- <layerPlugins type="NoneType">None</layerPlugins>
- <stack type="NoneType">None</stack>
- <rangeGroupList ver="[1, [0, [0, [3, [0, [0, [0], [0]], [0]]]]]]" type="ixIpDistributionGroupList" itemtype="ixIpDistributionGroup">
- <item ref="16"/>
- </rangeGroupList>
- <dynamicControlPlaneSetting type="int">0</dynamicControlPlaneSetting>
- <linkLayerOptions type="int">0</linkLayerOptions>
- <ipSourcePortFrom type="int">1024</ipSourcePortFrom>
- <ipSourcePortTo type="int">65535</ipSourcePortTo>
- <emulatedRouterGateway type="str">0.0.0.0</emulatedRouterGateway>
- <emulatedRouterSubnet type="str">255.255.0.0</emulatedRouterSubnet>
- <emulatedRouterGatewayIPv6 type="str">::</emulatedRouterGatewayIPv6>
- <emulatedRouterSubnetIPv6 type="str">FFFF:FFFF:FFFF:FFFF:FFFF:FFFF::0</emulatedRouterSubnetIPv6>
- <emulatedRouterIpAddressPool ver="[3, [0, [0, [0], [0]], [0]]]" type="ixConfigSequenceContainer" itemtype="ixEmulatedRouterIpAddressRange"/>
- <macMappingMode type="int">0</macMappingMode>
- <arpSettings ver="[0, [1, [0, [0]]]]" type="ixArpSettings">
- <gratuitousArp type="bool">True</gratuitousArp>
- <processGratArp type="bool">False</processGratArp>
- </arpSettings>
- <dnsParameters ver="[1, [1, [0, [0]]]]" type="ixDns">
- <enable type="bool">False</enable>
- <cacheTimeout type="int">30000</cacheTimeout>
- <serverList ver="[3, [0, [0, [0], [0]], [0]]]" type="ixConfigSequenceContainer" itemtype="_ixDnsServerItem"/>
- <suffixList ver="[3, [0, [0, [0], [0]], [0]]]" type="ixConfigSequenceContainer" itemtype="_ixDnsSuffixItem"/>
- </dnsParameters>
- <tcpParameters ver="[0, [1, [0, [0]]]]" type="ixTcpParameters">
- <tcpParametersFull ver="[4, [1, [0, [0]]]]" oid="17" type="ixTcpParametersFull">
- <enableCongestionNotification type="bool">False</enableCongestionNotification>
- <enableTimeStamp type="bool">True</enableTimeStamp>
- <timeWaitRecycle type="bool">True</timeWaitRecycle>
- <timeWaitReuse type="bool">False</timeWaitReuse>
- <enableTxBwLimit type="bool">False</enableTxBwLimit>
- <txBwLimitUnit type="int">0</txBwLimitUnit>
- <txBwLimit type="int">1024</txBwLimit>
- <enableRxBwLimit type="bool">False</enableRxBwLimit>
- <rxBwLimitUnit type="int">0</rxBwLimitUnit>
- <rxBwLimit type="int">1024</rxBwLimit>
- <finTimeout type="int">60</finTimeout>
- <keepAliveInterval type="int">75</keepAliveInterval>
- <keepAliveProbes type="int">9</keepAliveProbes>
- <keepAliveTime type="int">7200</keepAliveTime>
- <synRetries type="int">5</synRetries>
- <synAckRetries type="int">5</synAckRetries>
- <retransmitRetries type="int">5</retransmitRetries>
- <transmitBuffer type="int">8192</transmitBuffer>
- <receiveBuffer type="int">8192</receiveBuffer>
- <tcpSack type="bool">True</tcpSack>
- <windowScaling type="bool">False</windowScaling>
- <rtoMin type="int">1000</rtoMin>
- <rtoMax type="int">60000</rtoMax>
- </tcpParametersFull>
- <tcpParametersFull ref="17"/>
- </tcpParameters>
- <impairment ver="[5, [1, [0, [0]]]]" type="ixImpairment">
- <enable type="bool">False</enable>
- <addDelay type="bool">False</addDelay>
- <addReorder type="bool">False</addReorder>
- <addDrop type="bool">False</addDrop>
- <addDuplicate type="bool">False</addDuplicate>
- <randomizeSeed type="bool">False</randomizeSeed>
- <delay type="int">1</delay>
- <reorder type="int">1</reorder>
- <reorderLength type="int">1</reorderLength>
- <sourcePort type="int">0</sourcePort>
- <destinationPort type="int">0</destinationPort>
- <drop type="int">1</drop>
- <duplicate type="int">1</duplicate>
- <jitter type="int">0</jitter>
- <gap type="int">1</gap>
- <destinationIp type="str">any</destinationIp>
- <typeOfService type="str">any</typeOfService>
- <protocol type="str">any</protocol>
- <addFragmentation type="bool">False</addFragmentation>
- <fragmentationType type="str">FragmentationPercent</fragmentationType>
- <fragmentPercent type="int">50</fragmentPercent>
- <mtu type="int">1000</mtu>
- <fragmentSequenceSkip type="int">1</fragmentSequenceSkip>
- <fragmentSequenceLength type="int">1</fragmentSequenceLength>
- <_seed type="int">1</_seed>
- </impairment>
- <_portGroupId type="str">e7fa1f9e-23d9-4742-96b2-6edce6c4424e</_portGroupId>
- <_smExternalLinks ver="[0, [1, [0, [0]]]]" type="_smExternalLinkersMap">
- <externalLinks type="dict"/>
- </_smExternalLinks>
- <smVersion type="int">1</smVersion>
- </network>
- <activityParameters ver="[2, [0, [0, [3, [0, [0, [0], [0]], [0]]]]]]" type="ixActivityParametersList" itemtype="ixActivityParameters">
- <item ver="[0, [19, [1, [1, [0, [0]]]]]]" type="ixActivity">
- <agent ref="18"/>
- <protocolAndType type="str">VoIP Peer</protocolAndType>
- <name type="str">REGISTERING</name>
- <enable type="bool">True</enable>
- <timeline ver="[2, [1, [1, [0, [0]]]]]" oid="20" type="ixTimeline">
- <name type="str">Timeline1</name>
- <iterationTime type="int">{{registeringduration}}</iterationTime>
- <totalTime type="int">{{registeringduration}}</totalTime>
- <iterations type="int">1</iterations>
- <standbyTime type="int">0</standbyTime>
- <offlineTime type="int">10</offlineTime>
- <sustainTime type="int">0</sustainTime>
- <rampUpType type="int">0</rampUpType>
- <rampUpValue type="int">{{registeringtotalcalls}}</rampUpValue>
- <rampUpInterval type="int">{{registeringduration}}</rampUpInterval>
- <rampUpTime type="int">{{registeringduration}}</rampUpTime>
- <rampDownTime type="int">0</rampDownTime>
- <rampDownValue type="int">0</rampDownValue>
- <timelineType type="int">1</timelineType>
- <advancedIteration ver="[0, [1, [0, [0]]]]" type="ixAdvancedIteration">
- <segmentList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="ixTimelineSegmentList" itemtype="ixTimelineSegment">
- <item ver="[2, [0, [1, [0, [0]]]]]" type="ixLinearTimeSegment">
- <name type="str">Linear Segment 1</name>
- <noiseAmplitudeScale type="int">0</noiseAmplitudeScale>
- <segmentType type="int">1</segmentType>
- <startObjectiveScale type="float">0.0</startObjectiveScale>
- <endObjectiveScale type="float">1.0</endObjectiveScale>
- <duration type="int">{{registeringduration}}</duration>
- <objectID type="int">17</objectID>
- </item>
- </segmentList>
- <maxscale type="int">20</maxscale>
- <_apiUniqueId type="int">16159</_apiUniqueId>
- </advancedIteration>
- <objectID type="int">3</objectID>
- </timeline>
- <customParameters ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_ixCustomActivityParameters">
- <enableDbgLog type="bool">False</enableDbgLog>
- <dbgLogChannels type="str">1-5</dbgLogChannels>
- <bhcaType type="int">0</bhcaType>
- <talkTime type="int">10000</talkTime>
- <channelsNo type="int">1</channelsNo>
- <callSetupTime type="int">500</callSetupTime>
- <callTeardownTime type="int">500</callTeardownTime>
- <interCallDuration type="int">4000</interCallDuration>
- <bhcaObjectiveValue type="int">80000</bhcaObjectiveValue>
- <cpsOverwriteValueChecked type="int">0</cpsOverwriteValueChecked>
- <cpsTotalChannelsChecked type="int">0</cpsTotalChannelsChecked>
- <cpsOverwriteValue type="int">18</cpsOverwriteValue>
- <cpsType type="int">0</cpsType>
- <cpsTalkTime type="int">1500</cpsTalkTime>
- <cpsChannelsNo type="int">5</cpsChannelsNo>
- <cpsTotalChannelsNo type="int">2500</cpsTotalChannelsNo>
- <cpsOverheadTime type="int">1500</cpsOverheadTime>
- <cpsInterCallDuration type="int">2000</cpsInterCallDuration>
- <cpsObjectiveValue type="int">100</cpsObjectiveValue>
- <cpsRegisterTime type="int">40</cpsRegisterTime>
- <cpsSplitTimeline type="int">0</cpsSplitTimeline>
- <lpsType type="int">0</lpsType>
- <lpsTalkTime type="int">800</lpsTalkTime>
- <lpsChannelsNo type="int">2150</lpsChannelsNo>
- <lpsOverheadTime type="int">1500</lpsOverheadTime>
- <lpsInterLoopDuration type="int">2000</lpsInterLoopDuration>
- <lpsObjectiveValue type="int">100</lpsObjectiveValue>
- <lpsActiveChannel type="int">0</lpsActiveChannel>
- <activeUsersTalkTime type="int">750</activeUsersTalkTime>
- <activeUsersNo type="int">86534</activeUsersNo>
- <activeUsersChannel type="int">0</activeUsersChannel>
- <activeUsersObjectiveValue type="int">100</activeUsersObjectiveValue>
- </customParameters>
- <role type="str">Peer</role>
- <activeRole type="str">Both</activeRole>
- <objectivePercent type="float">100.0</objectivePercent>
- <objectiveType type="str">concurrentConnections</objectiveType>
- <objectiveValue type="int">{{registeringtotalcalls}}</objectiveValue>
- <userObjectiveType type="str">activeUsers</userObjectiveType>
- <userObjectiveValue type="long">{{registeringtotalcalls}}</userObjectiveValue>
- <constraintType type="str">SimulatedUserConstraint</constraintType>
- <constraintValue type="int">86534</constraintValue>
- <timerGranularity type="int">100</timerGranularity>
- <enableConstraint type="bool">True</enableConstraint>
- <secondaryConstraintType type="str">SimulatedUserConstraint</secondaryConstraintType>
- <secondaryConstraintValue type="int">100</secondaryConstraintValue>
- <secondaryEnableConstraint type="bool">False</secondaryEnableConstraint>
- <portMapPolicy type="str">protocolSpecific</portMapPolicy>
- <concurrentObjectiveBehavior type="int">1</concurrentObjectiveBehavior>
- <cpsObjectiveBehavior type="int">0</cpsObjectiveBehavior>
- <userIpMapping type="str">1:1</userIpMapping>
- <destinationIpMapping type="str">Consecutive</destinationIpMapping>
- <playlists ver="[1, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="ixPlaylistList" itemtype="ixPlaylist"/>
- <objectID type="int">2</objectID>
- <_apiUniqueId type="int">15566</_apiUniqueId>
- <resourceGuid type="str">58ff41761a9072107c63efca</resourceGuid>
- <_objectiveValue type="int">{{registeringtotalcalls}}</_objectiveValue>
- <timelineScale type="tuple">
- <item type="float">1.0</item>
- </timelineScale>
- </item>
- <item ver="[0, [19, [1, [1, [0, [0]]]]]]" oid="24" type="ixActivity">
- <agent ref="19"/>
- <protocolAndType type="str">VoIP Peer</protocolAndType>
- <name type="str">CALLING</name>
- <enable type="bool">True</enable>
- <timeline ref="11"/>
- <customParameters ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_ixCustomActivityParameters">
- <enableDbgLog type="bool">False</enableDbgLog>
- <dbgLogChannels type="str">1-5</dbgLogChannels>
- <bhcaType type="int">0</bhcaType>
- <talkTime type="int">10000</talkTime>
- <channelsNo type="int">1</channelsNo>
- <callSetupTime type="int">500</callSetupTime>
- <callTeardownTime type="int">500</callTeardownTime>
- <interCallDuration type="int">4000</interCallDuration>
- <bhcaObjectiveValue type="int">80000</bhcaObjectiveValue>
- <cpsOverwriteValueChecked type="int">0</cpsOverwriteValueChecked>
- <cpsTotalChannelsChecked type="int">0</cpsTotalChannelsChecked>
- <cpsOverwriteValue type="int">18</cpsOverwriteValue>
- <cpsType type="int">0</cpsType>
- <cpsTalkTime type="int">30000</cpsTalkTime>
- <cpsChannelsNo type="int">16750</cpsChannelsNo>
- <cpsTotalChannelsNo type="int">33500</cpsTotalChannelsNo>
- <cpsOverheadTime type="int">1500</cpsOverheadTime>
- <cpsInterCallDuration type="int">2000</cpsInterCallDuration>
- <cpsObjectiveValue type="int">100</cpsObjectiveValue>
- <cpsRegisterTime type="int">40</cpsRegisterTime>
- <cpsSplitTimeline type="int">0</cpsSplitTimeline>
- <lpsType type="int">0</lpsType>
- <lpsTalkTime type="int">800</lpsTalkTime>
- <lpsChannelsNo type="int">2150</lpsChannelsNo>
- <lpsOverheadTime type="int">1500</lpsOverheadTime>
- <lpsInterLoopDuration type="int">2000</lpsInterLoopDuration>
- <lpsObjectiveValue type="int">100</lpsObjectiveValue>
- <lpsActiveChannel type="int">0</lpsActiveChannel>
- <activeUsersTalkTime type="int">30000</activeUsersTalkTime>
- <activeUsersNo type="int">{{activecalls}}</activeUsersNo>
- <activeUsersChannel type="int">0</activeUsersChannel>
- <activeUsersObjectiveValue type="int">100</activeUsersObjectiveValue>
- </customParameters>
- <role type="str">Peer</role>
- <activeRole type="str">Both</activeRole>
- <objectivePercent type="float">100.0</objectivePercent>
- <objectiveType type="str">concurrentConnections</objectiveType>
- <objectiveValue type="int">{{activecalls}}</objectiveValue>
- <userObjectiveType type="str">activeUsers</userObjectiveType>
- <userObjectiveValue type="long">{{activecalls}}</userObjectiveValue>
- <constraintType type="str">SimulatedUserConstraint</constraintType>
- <constraintValue type="int">{{activecalls}}</constraintValue>
- <timerGranularity type="int">100</timerGranularity>
- <enableConstraint type="bool">True</enableConstraint>
- <secondaryConstraintType type="str">SimulatedUserConstraint</secondaryConstraintType>
- <secondaryConstraintValue type="int">100</secondaryConstraintValue>
- <secondaryEnableConstraint type="bool">False</secondaryEnableConstraint>
- <portMapPolicy type="str">protocolSpecific</portMapPolicy>
- <concurrentObjectiveBehavior type="int">1</concurrentObjectiveBehavior>
- <cpsObjectiveBehavior type="int">0</cpsObjectiveBehavior>
- <userIpMapping type="str">1:1</userIpMapping>
- <destinationIpMapping type="str">Consecutive</destinationIpMapping>
- <playlists ver="[1, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="ixPlaylistList" itemtype="ixPlaylist"/>
- <objectID type="int">6</objectID>
- <_apiUniqueId type="int">16446</_apiUniqueId>
- <resourceGuid type="str">58ff41761a9072107c63efca</resourceGuid>
- <_objectiveValue type="int">{{activecalls}}</_objectiveValue>
- <timelineScale type="tuple">
- <item type="float">1.0</item>
- </timelineScale>
- </item>
- </activityParameters>
- <timeline ref="20"/>
- <communityCapture ver="[0, [1, [0, [0]]]]" type="ixViewCommunityCapture">
- <captureViewOptions ref="12"/>
- <filter ver="[0, [1, [0, [0]]]]" type="ixViewFilter">
- <filterString type="str"></filterString>
- </filter>
- <portList ref="21"/>
- <enable type="bool">False</enable>
- <_apiUniqueId type="int">15466</_apiUniqueId>
- </communityCapture>
- <payload type="NoneType">None</payload>
- <activityIpWiring ver="[0, [1, [0, [0]]]]" oid="22" type="ixRangeAgentEndpointWiring">
- <rangeAgentConnections type="list"/>
- <_apiUniqueId type="int">15451</_apiUniqueId>
- <rangeAgentDict ver="[0, [0, [0]]]" type="ixOrderedDict">
- <_dict type="list">
- <item type="tuple">
- <item ref="15"/>
- <item ver="[0, [1, [0, [0]]]]" type="ixRangeAgentWiring">
- <range ref="15"/>
- <agentEndpointConnections type="list"/>
- <agentConnectionsDict ver="[0, [0, [0]]]" type="ixOrderedDict">
- <_dict type="list">
- <item type="tuple">
- <item ref="18"/>
- <item ver="[0, [1, [0, [0]]]]" type="ixAgentEndpointWiring">
- <agent ref="18"/>
- <endpoints type="list"/>
- <endpointsDict ver="[0, [0, [0]]]" type="ixOrderedDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">SIP</item>
- <item ver="[0, [1, [0, [0]]]]" type="ixEndpoint">
- <endpointName type="str">SIP</endpointName>
- <isAvailable type="bool">True</isAvailable>
- </item>
- </item>
- <item type="tuple">
- <item type="str">RTP</item>
- <item ver="[0, [1, [0, [0]]]]" type="ixEndpoint">
- <endpointName type="str">RTP</endpointName>
- <isAvailable type="bool">True</isAvailable>
- </item>
- </item>
- <item type="tuple">
- <item type="str">T38</item>
- <item ver="[0, [1, [0, [0]]]]" type="ixEndpoint">
- <endpointName type="str">T38</endpointName>
- <isAvailable type="bool">True</isAvailable>
- </item>
- </item>
- <item type="tuple">
- <item type="str">MSRP</item>
- <item ver="[0, [1, [0, [0]]]]" type="ixEndpoint">
- <endpointName type="str">MSRP</endpointName>
- <isAvailable type="bool">True</isAvailable>
- </item>
- </item>
- </_dict>
- </endpointsDict>
- </item>
- </item>
- <item type="tuple">
- <item ref="19"/>
- <item ver="[0, [1, [0, [0]]]]" type="ixAgentEndpointWiring">
- <agent ref="19"/>
- <endpoints type="list"/>
- <endpointsDict ver="[0, [0, [0]]]" type="ixOrderedDict">
- <_dict type="list">
- <item type="tuple">
- <item type="str">SIP</item>
- <item ver="[0, [1, [0, [0]]]]" type="ixEndpoint">
- <endpointName type="str">SIP</endpointName>
- <isAvailable type="bool">True</isAvailable>
- </item>
- </item>
- <item type="tuple">
- <item type="str">RTP</item>
- <item ver="[0, [1, [0, [0]]]]" type="ixEndpoint">
- <endpointName type="str">RTP</endpointName>
- <isAvailable type="bool">True</isAvailable>
- </item>
- </item>
- <item type="tuple">
- <item type="str">T38</item>
- <item ver="[0, [1, [0, [0]]]]" type="ixEndpoint">
- <endpointName type="str">T38</endpointName>
- <isAvailable type="bool">True</isAvailable>
- </item>
- </item>
- <item type="tuple">
- <item type="str">MSRP</item>
- <item ver="[0, [1, [0, [0]]]]" type="ixEndpoint">
- <endpointName type="str">MSRP</endpointName>
- <isAvailable type="bool">True</isAvailable>
- </item>
- </item>
- </_dict>
- </endpointsDict>
- </item>
- </item>
- </_dict>
- </agentConnectionsDict>
- </item>
- </item>
- </_dict>
- </rangeAgentDict>
- </activityIpWiring>
- <tcpAccelerationAllowedFlag type="bool">True</tcpAccelerationAllowedFlag>
- <iterations type="int">1</iterations>
- <standbyTime type="int">0</standbyTime>
- <offlineTime type="int">10</offlineTime>
- <sustainTime type="int">244522</sustainTime>
- <iterationTime type="int">3549</iterationTime>
- <totalTime type="int">3549</totalTime>
- <portMapPolicy type="str">protocolSpecific</portMapPolicy>
- <objectiveType type="str">n/a</objectiveType>
- <objectiveValue type="int">{{registeringtotalcalls}}</objectiveValue>
- <rampUpType type="int">0</rampUpType>
- <rampUpValue type="int">5</rampUpValue>
- <rampUpInterval type="int">1</rampUpInterval>
- <rampUpTime type="int">17307</rampUpTime>
- <rampDownTime type="int">20</rampDownTime>
- <userObjectiveType type="str">activeUsers</userObjectiveType>
- <userObjectiveValue type="long">{{registeringtotalcalls}}</userObjectiveValue>
- <totalUserObjectiveValue type="long">{{registeringtotalcalls}}</totalUserObjectiveValue>
- <objectID type="int">0</objectID>
- <_apiUniqueId type="int">15450</_apiUniqueId>
- <isVisible type="bool">True</isVisible>
- <activityIpWiring ref="22"/>
- <_portOperationModesAllowed type="dict">
- <item>
- <key type="int">0</key>
- <value type="bool">True</value>
- </item>
- <item>
- <key type="int">1</key>
- <value type="bool">True</value>
- </item>
- <item>
- <key type="int">2</key>
- <value type="bool">False</value>
- </item>
- <item>
- <key type="int">3</key>
- <value type="bool">True</value>
- </item>
- <item>
- <key type="int">4</key>
- <value type="bool">True</value>
- </item>
- <item>
- <key type="int">8</key>
- <value type="bool">True</value>
- </item>
- </_portOperationModesAllowed>
- <_tcpAccelerationAllowed type="dict">
- <item>
- <key type="int">0</key>
- <value type="bool">True</value>
- </item>
- <item>
- <key type="int">1</key>
- <value type="bool">False</value>
- </item>
- </_tcpAccelerationAllowed>
- </item>
- </elementList>
- <objectID type="int">0</objectID>
- <_apiUniqueId type="int">15447</_apiUniqueId>
- </item>
- <item ver="[0, [1, [0, [0]]]]" type="ixTrafficColumn">
- <name type="str">Terminate</name>
- <elementList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="ixScenarioElementList" itemtype="ixScenarioElement">
- <item ref="23"/>
- </elementList>
- <objectID type="int">2</objectID>
- <_apiUniqueId type="int">15449</_apiUniqueId>
- </item>
- </columnList>
- <links ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="ixActivityLinkList" itemtype="ixActivityLink">
- <item ver="[1, [0, [1, [0, [0]]]]]" type="ixActivityLink">
- <objectiveType type="str">concurrentConnections</objectiveType>
- <objectiveValue type="int">{{activecalls}}</objectiveValue>
- <portMapPolicy type="str">protocolSpecific</portMapPolicy>
- <userObjectiveType type="str">activeUsers</userObjectiveType>
- <userObjectiveValue type="long">{{activecalls}}</userObjectiveValue>
- <timeline ref="11"/>
- <constraintValue type="int">{{activecalls}}</constraintValue>
- <enableConstraint type="bool">True</enableConstraint>
- <name type="str">VoiceLink1</name>
- <activityList ver="[1, [0, [0, [3, [0, [0, [0], [0]], [0]]]]]]" type="ixActivityListWeakrefSequenceContainer" itemtype="ixActivityParameters">
- <item ref="24"/>
- <item ref="25"/>
- </activityList>
- <objectID type="int">0</objectID>
- <_apiUniqueId type="int">16586</_apiUniqueId>
- </item>
- </links>
- <appMixList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="ixAppMixList" itemtype="ixAppMix"/>
- <objectID type="int">0</objectID>
- <_apiUniqueId type="int">15446</_apiUniqueId>
- </item>
- </scenarioList>
- <currentUniqueIDForAgent type="int">45</currentUniqueIDForAgent>
- <enableNetworkDiagnostics type="bool">True</enableNetworkDiagnostics>
- <showNetworkDiagnosticsFromApplyConfig type="bool">True</showNetworkDiagnosticsFromApplyConfig>
- <showNetworkDiagnosticsAfterRunStops type="bool">True</showNetworkDiagnosticsAfterRunStops>
- <resetNetworkDiagnosticsAtStartRun type="bool">True</resetNetworkDiagnosticsAtStartRun>
- <enableNetworkDiagnosticsLogging type="bool">False</enableNetworkDiagnosticsLogging>
- <enableTcpAdvancedStats type="bool">False</enableTcpAdvancedStats>
- <enableFrameSizeDistributionStats type="bool">False</enableFrameSizeDistributionStats>
- <isFrameSizeDistributionViewSupported type="bool">False</isFrameSizeDistributionViewSupported>
- <statViewThroughputUnits type="str">Kbps</statViewThroughputUnits>
- <totalUserObjectiveInfoList ver="[0, [3, [0, [0, [0], [0]], [0]]]]" type="ixTotalUserObjectiveInfoList" itemtype="ixTotalUserObjectiveInfo"/>
- <activitiesGroupedByObjective type="bool">False</activitiesGroupedByObjective>
- <eventHandlerSettings ver="[0, [1, [0, [0]]]]" type="ixEventHandlerSettings">
- <disabledEventClasses type="str"></disabledEventClasses>
- <disabledPorts type="str"></disabledPorts>
- <_apiUniqueId type="int">15684</_apiUniqueId>
- </eventHandlerSettings>
- <allowMixedObjectiveTypes type="bool">False</allowMixedObjectiveTypes>
- <networkProtocolOptions type="NoneType">None</networkProtocolOptions>
- <seedForRandomBehavior type="int">0</seedForRandomBehavior>
- <csvThroughputScalingFactor type="int">0</csvThroughputScalingFactor>
- <reporterThroughputScalingFactor type="int">0</reporterThroughputScalingFactor>
- <profileDirectory ver="[2, [1, [0, [0]]]]" type="ixProfileDirectory">
- <categoryList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="ixProfileCategoryList" itemtype="ixProfileCategory">
- <item ver="[0, [1, [0, [0]]]]" type="ixProfileCategory">
- <name type="str">Playlist</name>
- <categoryId type="str">playlist</categoryId>
- <profileList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="ixProfileList" itemtype="ixProfile"/>
- <pm ver="[0, [1, [0.1, [1, [0, [0]]]]]]" type="#Plugins.profile.Playlist.ixPropertyMap_PlaylistCategory$ixPropertyMap_PlaylistCategory"/>
- <temporaryProfileList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="ixProfileList" itemtype="ixProfile"/>
- <objectID type="int">0</objectID>
- </item>
- <item ver="[0, [1, [0, [0]]]]" type="ixProfileCategory">
- <name type="str">Random Data</name>
- <categoryId type="str">rdge</categoryId>
- <profileList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="ixProfileList" itemtype="ixProfile"/>
- <pm ver="[0, [1, [0.1, [1, [0, [0]]]]]]" type="#Plugins.profile.RandomData.ixPropertyMap_RandomDataCategory$ixPropertyMap_RandomDataCategory">
- <startcore type="int">0</startcore>
- <totalcores type="int">1</totalcores>
- </pm>
- <temporaryProfileList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="ixProfileList" itemtype="ixProfile"/>
- <objectID type="int">1</objectID>
- </item>
- <item ver="[0, [1, [0, [0]]]]" type="ixProfileCategory">
- <name type="str">Real File</name>
- <categoryId type="str">realfile</categoryId>
- <profileList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="ixProfileList" itemtype="ixProfile"/>
- <pm type="NoneType">None</pm>
- <temporaryProfileList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="ixProfileList" itemtype="ixProfile"/>
- <objectID type="int">2</objectID>
- </item>
- <item ver="[0, [1, [0, [0]]]]" type="ixProfileCategory">
- <name type="str">Unified File System</name>
- <categoryId type="str">ufs</categoryId>
- <profileList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="ixProfileList" itemtype="ixProfile"/>
- <pm type="NoneType">None</pm>
- <temporaryProfileList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="ixProfileList" itemtype="ixProfile"/>
- <objectID type="int">3</objectID>
- </item>
- </categoryList>
- <_profileMru type="str"></_profileMru>
- </profileDirectory>
- <communityList type="NoneType">None</communityList>
- <autoUpdateAppFlowsToLatest type="bool">True</autoUpdateAppFlowsToLatest>
- <downgradeAppLibFlowsToLatestValidVersion type="bool">True</downgradeAppLibFlowsToLatestValidVersion>
- <objectID type="int">0</objectID>
- <_apiUniqueId type="int">15445</_apiUniqueId>
- <lastStatViewerConfiguration type="str"></lastStatViewerConfiguration>
- <statManagerOptions ver="[1, [1, [0, [0]]]]" type="ixStatManagerOptions">
- <pollingInterval type="int">2</pollingInterval>
- <allowCsvLogging type="bool">True</allowCsvLogging>
- <enableDataStore type="bool">False</enableDataStore>
- <svConfiguration type="str">begin 666 &lt;data&gt;&#10;M&gt;)S=G6MOXSBRAO^*D(,9S&amp; GMJB[,ND,TD[2$W1NB-T]N]A&gt;--0VDVC;EKR2&#10;MG,L&gt;G/]^*-E.1+)DUTQ$&quot;LB'[C@65:5Z0Y;X4)?:_^UQ-C7N:9;':?)NA_3,&#10;MG=\.]H=%5'R.Z0/-7C9Y/&lt;_LF3TKM'98 YJ7WY[%&gt;6%\I$_O=J)Y$3_&amp;42^_&#10;M[\W+/?*&quot;)F/:J[7[(XOF;!/;&gt;7!Y,3J^&amp;!G]@_VKZ^,A^W@X.KV\$'__&gt;GQT&#10;M.CI\?W9&lt;;AA&lt;GK\_O3@^&gt;G:=/W_&quot;'(#D_&amp;#_)*/_6; V3\9]-%W0=SO63N4H&#10;MOS]+;V_CY';]_2A;T&amp;K3*)[1X5,R?D_OHOLXS=8-S.&gt;M&gt;1'-YE&lt;9'&lt;?5@:VV&#10;MV]7VX]N,'4NIZNAI3M?;2+7MDJD\3:/)5986=%S4]GUV_G)&lt;O\&gt;3&quot;4U*0_FZ&#10;MU4DTS9?-CI/HVY0&gt;144T+-*,R@VN7L2I'X&lt;#[;W1$SN@RT4Q7Q3/0IXOID4\&#10;MGXJQ58V.AEN:G4&gt;/9:_+V?$-%GF1SCZP/]G=&lt;QMO[?,DGM*KJ'C&gt;4GU_.*59&#10;MD:]_&amp;JQ+)_G&gt;8QZ_V[DKBOE&gt;O__P\-![L'MI=MNW3)/T_WY^-AS?T5FT&amp;R?L&#10;MC\;$V'G&gt;:[)]K\II?^WUB-Y$+*9*)_ZWJAF_&gt;9&quot;EJUZ04&lt;I:,ZU'I&gt;@'^X_Y&#10;M7EY9-V)V&quot;!?TH?H[T&amp;)U9&amp;6HZT/$'.&amp;R[2R?,&quot;OO=A99LK*&gt;[\[B,3N(]*;8&#10;M':&gt;S/=9N=]EJISH&amp;.J4SFA1&amp;$LTH?QC+5GNG^&gt;J;=SM%U3M7WY]'&lt;?(&lt;3MES&#10;M*:UB/DPF'[)T,&lt;^?6YZEXZALLG3(#H+UAL&gt;R-RY_OTOC,35F&lt;7(Y'B^RO!I@&#10;ML^AQ_=LB^98ND@F=0,&lt;+&gt; 6=Y,O.2 $3IT&lt;[1L':O=MAFZ9I&lt;KLC'$L?V.DJ&#10;MRM@O?VG7&quot;_9_;;&gt;\R&amp;+&lt;CF4P?VG'P1T=?R]'V\L?K_K#59:&amp;3RP[S'I_Q,DD&#10;M?&lt;A[)VDVRWLO&gt;_QB0 U^,3ZOSA-.KSQ+F+\8 ];G%QE]E]!%D4737XRKQ;=I&#10;M/&amp;;)&gt;I1^I\F[;[X?N6/7(Z'M4#,(:Y%$R=,R-HSNQ=U?TN RF[#SP&lt;N&gt;&lt;5)@&#10;M=EMFR$EMQV]I.J51 NS&lt;Y_I97^R%_1?CJZU5Q\&gt;T7([D@_U)?'-SF^TM?T2S&#10;MOS+F5_LL36S;9^UH]YZP8764CA?E,1VO#TT&gt;?,;J&quot;,N,)F\ES]TO2Q^J/T@E&#10;MW6J?NR@?W$7)+66&quot;LBS-&lt;FTUY$^/#LS]/OM_?SWF#G;)?O_YE_UR/!U4CO;[&#10;MU&gt;?]2L7*Y7Y_J&gt;A+?SZP]ONUW_;+#G70+^VQG_O5057VEY]69\C)09GY]OOK&#10;MWYA9*;@_+X&lt;%R$$0&lt;A!!#E-28W4*P@E&quot; $'6!@1A3&quot;VZV( N%D(72]!%[B57&#10;M:588@ZM/1ADKFQ7%8UZB\CC^K$*@S;IHKI[&gt;Y &quot;JV0C5;$$U2U+M!^,HSK\;&#10;MGXIX&amp;O\W*F&gt;KG&amp;AEW']6-,AD73-+BV0N()F#D,S9*MDH+:*I&lt;4YG:?;TT\?W&#10;M/[]:,-F@_G'I 7*Y&quot;+G&lt;K7(Q5J!MJB79JXNE9SCZ@%@&gt;0BQOJUAEKCEC\&amp;@&lt;&#10;MWM\:/Q'C/$X6!7V]:(UVZ^+96L0+ /%\A'C^GQ3/7069MZU&gt;W7!=/D&gt;+?&quot;$@&#10;M7X&quot;0+_BS?4^9?J1)0%&gt;+@,0$% P1&quot;H;;3Z;K0%]_#GVQ5%?(TZ,0-)&lt;GF,D\&#10;M$6?S\C3MS-JUJ^E4;MRDF3&amp;8QB60E1.MUT_7-MKN8-I&amp;0 I 88#( 40&amp;@;,X&#10;M^5Y%2U_=W&gt;JF],\]&quot; 0%!$,%1,(&quot;4&quot;9J#.&gt;4OGY4UDWIGW40B ((!@.(R &amp; &#10;M3&quot;&lt;9^S\WANR[%J9H-5OZI_X$FOL3S.2?B+/_S4(9UVT,/MF@_DD9@&gt;;_! , &#10;M1&quot;0 0++/T32&gt;&amp;*LXK^F8QO&lt;MC,8&amp;J_JG9 3B 8(! B(2 5:\=GK&gt;)M,=3,P@&#10;M,B 8-&quot; B&amp;P ROG\JVDIO=5,=S,X@ B 8!&quot; B T RQ44M%1D_??PV;P$ &amp;JS6&#10;MQ?/U+,M&quot;DW^&quot;F?T3&lt;?K?V,=:2W&quot;BN;I&lt;@1ZY(!*P,&quot;1@2230T-&gt;XM--J?X,M&#10;MUT4,]8@(48&quot;%H0 +00&amp;C+$KR65P8A]F&lt;A?R?!&lt;U?G^%@H]R45P\:6.#U M0%&#10;M P0:&quot;&amp;'.IT]M*U&gt;9Y'33=/D)8@4+PPH6@A56(ZO5+@?:Y)33 P\6! \6!AXL&#10;M!#SP4;;1X0&quot;+G&amp;IZ^,&amp;&quot;^,'&quot;\(,E\&lt;.V):,AS&gt;YIIF;)B+?=P9*1!;&amp;$A6$)&#10;M2[JZX+[=)2,+8@4+PPJ6=!T!E.EM+!E9$&quot;M8&amp;%:PI.L%LDQO:,G(AKC PG&quot;!&#10;M)5T6V&quot;C4VUDRLB$VL#%L8(ML $CVQI&gt;,;(@); P3V&quot;(38,5[BTM&amp;-H0'-@8/&#10;M;!$/ !G?S)*1#=X_A+J!2+J#&quot;)#I;2\9V1 0V!@@L*5[B9KZV!M:,K(A$K Q&#10;M)&amp;!+]Q(U]+6WOV1D0Q1@8RC 1E# VUXRLB$TL#%H8&quot;/0X.TN&amp;=D0*]@85K 1&#10;MK/&quot;6EXP&lt;&quot;!YL##S8&quot;'AXJTM&amp;#L0/#H8?'.1=1J,[YNCV;KXHEBL\[2P6R5:[&#10;MN&quot;$&lt;X@&lt;'PP^.R ^.O$JYNG%*S&lt;1NLW']2TD.Q! .AB$&lt;D2&amp;V2*EDWK+=@?YE&#10;M)P?B#0?#&amp;X[(&amp;X&quot;DJS5:-;USLW']&quot;U,.^!P#ZD$&amp;D3ZV2*FD=VYWH'_ARH$(&#10;MQ&lt;$0BK/]6L7G]/1J&amp;,]?_W#6RE G#VDY$'XX&amp;/QP1/QP (9;Y$_&amp;[^DB,P;1&#10;MM'SN)&lt;H76?7486[\M K[YU&gt;?J]?Z(;UQW=#4)#-$*@Z&amp;5!R15$K=19E_'QR^&#10;M?KEOK6)EK(.&gt;&quot;$&amp;)@X$21X026*)!FQ(-NCC9NA!].!CZ&lt;$3Z 9KN6M&quot;IRI&amp;&#10;M)F2:'X::!(1 Q,6 B&quot;N&quot;2*DH^+3@.M;6&gt;IMH5O_0=&quot;$$&lt;3$(XDH((LMV.&quot;Y*&#10;M1&amp;U=-\EN!P,6 @X7 QRN!!RR&lt;,/%&gt;$SS_&amp;:AH-.!MCMXM!?&quot;&quot;Q&gt;#%ZZ$%[* &#10;M?T194KXQJ'7U9,/ZY[XNA!,N!B=&lt;&quot;2=DZ4ZBF!UJ^\I)=O5?L'7!!Z113TB+&#10;MT !ENV]IN8.&quot;=&quot;&lt;9UG^1UH5HPL70A(N@B;,TG:N8G4AV^:F)IDP'$8*+(017&#10;M) 17GO[*Z=RHHE9XOE@[Z&amp;&quot;Z I&amp;$BR$)5R0)0$H^0[4L(VQ&lt;_\3%@TC#Q9&quot;&amp;&#10;M*Y(&amp;(*%P&gt;FQ9PP;K^B&lt;O'D0;'H8V/)$V !&amp;%?-^RB W6]4]C/(@]/ Q[&gt;&quot;)[&#10;M &quot;)R;-6RA*!M_=,9#V(0#\,@GL@@@(&quot;G24&amp;S*CCC:)%5KP R?CJ\O_W9^.&lt;L&#10;M_U=K6FYSHW^JXT%DXF'(Q)/(!%B+B:9J%F)$N_Q41U./A,C$PY&quot;))Y))J:68&#10;M%XN&quot;SN95[BJ#;2\CBG8[&gt;',31&quot;8&gt;ADP\D4P X08I2U3C]H63['8PG0%?XX1Z&#10;MCY/()8!PJTF;JH[79+Z#&quot;0W$*!Z&amp;43R140 9GR\:MBN?:+:#*0S$(QZ&amp;1SR1&#10;M1Z!\E^0/-&amp;L_W0EF]4]&lt;?(A!/ R#&gt;&quot;*#- ]:19VNP;K^:8H/,8B/81!?9!! &#10;MQ.-D%9IQFL1%S 1IX&lt;&amp;-E82@;?TWU/L0?_@8_O!%_M@H8'L/ODCZP?&gt;(Z[FE&#10;MWH?HP\?0AR_2QT;Y!M6+E]7TOYIM_3?9^Q!G^!C.\$7. 2L;DB^H5G[YP_ &#10;MLOZ;ZWV(-'P,:?@(TJCN-VE7M;K)#FZH]R' \#&amp; X2, 8WU!MMUY&quot;F&gt;T@YOI&#10;M?8@M? Q;^ BVN*;_5L%DHMD.;J7WP;?#HEX/BX*)29RI44XTW,$-]3Y$%#Z&amp;&#10;M*'P$42S/&gt;@]Q&lt;6&lt;&lt;+HH[MBD&gt;+Y?&lt;RD&lt;O6/3MG60QKCA]]:!' *&amp;'CT$/'X$&gt;&#10;MRZ#+XD'&amp;IZ.KEK5\,&lt;OIIH&lt;V H@V @QM! C:J 4X&amp;BC1K3++Z:8',@((,@(,&#10;M9 0(R*@'&gt;#94HEMIEM--#UT$$%T$&amp;+H($'11&quot;_ \?F0)OYK3SM/L]&lt;^S 1I*&#10;M+C@]]&lt;!&amp; ,%&amp;@(&amp;- 'E1HWHB0-65#=DX?WE#4Q*$H&quot;/ 0$&lt;@0D&gt;P]?*&amp;T&lt;_I&#10;M6-4UCI5Q_1&lt;Z HA# @R'!&quot;*' !(*%R3:E1 VKO^21P!A28#!DD#$$D!&quot;?F&amp;S&#10;M705!V_HO=@00GP08/@E$/H&amp;&amp;,;&gt;\WO(HAFSKO^P1@/4K4 4L1$@!!)36E]K5&#10;ML,F\_LL@(&lt;0B 89% I%% !E?%IS:U4^RJ__21PC!2(B!D5&quot;$$3 #_EO9.02T&#10;MK?_21PA128BADE&quot;D$E! ?B&amp;E;0E!Z_HO@(00HH081 E%1(&amp;F,EO73UJ&gt;W6#]&#10;MZ;]0$D+L$F+8)139I5'H]&gt;**&quot;E$%V_HOEH00MX08;@D1W,*OLB@3\,5V!Y=/&#10;M0@A;0@RVA!ALX=9;U&quot;GX;+N#BRDA1&quot;TAAEI&quot;!+4TK[8H4Q/VT\'EEA#&quot;F1&quot;#&#10;M,Z'T!'K#TLXHGJE;VI&amp;,\TL[FF9$$-*$&amp;*0)1:0I585$'-)B,:^B57$?]287&#10;M^I=YB D6Z$-5Z!/9!M!S%$V_*U,2-JY_G8&gt;8&lt; D_7 T_$70 %=?WP2A3LMF!&#10;M_D4?8H)U_$Q4(3]3I!ZH3RX?&quot;BG#5?F\Q#8W^E&gt;#B F6_C-1M?],Z6GXIM&gt;K&#10;M*GBKC&amp;B7/_'HH4AB@A4!351)0%.N\R$7-%V&amp;N7Y!99LWT@&amp;6NSC5@)4&quot;352I&#10;M0%,N]]$D8.NW&lt;6YZS:^N,PQ8,=!$E0PTI4?BH==&gt;WL9YL&lt;Q2*D9PHWU^).M9&#10;MIB F6$+01-40-.4B@K*&lt;+Q?QN, 57&quot;04['&lt;QJL%&quot;@B:JDJ IEQ*4Q:P]UZY&amp;&#10;MS68'78QTL.&quot;@B:HX:,HE!X'R&amp;.OG(E1(&quot;1OO8!()UAVOQ$7(*!&lt;?W#3$CZCJ&#10;M02YYZ&amp;#N&quot;)&lt;IQ]4IEPN5;Q[FJA3=Y$+_54724+ &lt;5[%&lt;+E;8.-15R=ED7O]U&#10;M1@(7-&lt;=5-9?*FF^9'RF[?VJS$WZFI.=Z!(&amp;KH./*H,MUT(D\96^8R:BZIPIR&#10;MTL&amp;&lt;&quot;:Z9CBN:+E=-!V1MFM*TJ^L6+QW,GN#*ZKC2ZG)M]8W]54A[JGHL[*:+&#10;M&amp;14(3;C&quot;ZW+E]&lt;U]5JFV6_UT,;L&quot;(0I7CEVJQ[[M_%5=QU%\^A)]&lt;)IJNA9,&#10;MX.+MN.KM&lt;OEV(B\E2R&amp;K6$C&gt;[*2#LQ=&lt;UAU7UUTN[ [(R@]+9&lt;)N&lt;]/!^0LL&#10;M 4]0-&gt;&quot;)5 0&gt;R /#TROCG&quot;6_Z%;)#+;)/#_Z=6D)XA6J%#R1:\%;0#T'%NVJ&#10;M$E)+A0OK.@J6NQCG(%2AZL$3N2#\-@'9MKS%17O0=A&lt;C&amp;B0H5'%X(E&gt;'WR;B&#10;M&gt;52,[U2I^&amp;R\@]DG6&quot;B&gt;H&quot;K%$[E4?*.,^9Q- ]LJ0\J+R)ON8(X)5HTGJ++Q&#10;M1*X;#TCX$F/+8UDVW,%J'5@KGJ&quot;*Q1.I6OSV'JAF)$O6.UBK ZO)$U0Y&gt;2+5&#10;MDX&gt;$/+WX?#HZ5G1JAHWK?S* @-7F&quot;:K&lt;/)'JS6-D;'E0-YG7_WP &gt;O1$U1!&#10;M&gt;B)5I,=(V?;@;K2O_QD E:J)ZA2]42J58\1\YH6JQM;%&quot;K*.]'_9 !:]@3&#10;M5!%[(E6QAV0]''Q4E#(!RQT\&amp;4# \O4$5;^&gt;2 7LMRK8&lt;K8$;7?P= !J]L3&#10;M5'E[(M6WWZIBVXD2-M[!LP $+'1/4)7NB53J?JN.2G+D!@\=O)&quot;)V&quot;#?V&quot;B^&#10;ML3%\\_X?JB:5@.4.7KE$;!!Q;!3BV!C$X&gt;)L.4.&quot;MCMX 1.Q0;ZQ47QC8_B&amp;&#10;MB[3M# D;[^&quot;%3,0&amp; &lt;=&amp; 8Z- 1PNU*J\01)-IT]J)87\=/#:)N* S&amp;.CF,?&amp;&#10;M, \7M9+SSP8/';RXB3@@^#@H\'$PX$,&gt;'U4M44*F.0TU48X#4HZ#HAP'0SE\&#10;MH&quot;V?@F#CW&amp;JY)M9Q0-9Q4*SC8%B'#[7MC-E@G5-2$^\X(.\X*-YQ,+S#QZHD&#10;M46YRP6FJB7T&lt;D'T&lt;%/LX&amp;/:QU&amp;5*R#2GH2;:&lt;4#:&lt;5&quot;TXV!HQU*9*6'CG(Z:&#10;MF,&lt;!F&lt;=!,8^#81Y+::9LL,XIJ8E[')!['!3W.!CNL=1GRDTN.$TU,9 #,I&quot;#&#10;M8B 'PT&quot;VNDP)F&gt;8TU$0Z+D@Z#HIT' SIV&quot;HS)6R&lt;TU$3W[@@W[@HOG$Q?&amp;,K&#10;MS90-UCDE-5&amp;.&quot;U*.BZ(&lt;%T,YMOI,N&lt;D%_ZB*)DU!XG%1Q.-BB,=1ERDAT_PM&#10;MDYHT!%G'1;&amp;.BV$=1V6FA(US.FKB&amp;Q?D&amp;Q?%-RZ&amp;;QREF;+!.J&gt;D)LIQ0&lt;IQ&#10;M493C8BC'49\I-[G@--5$/&quot;Y(/&quot;Z*&gt;%P,\;CJ,B5DFM-0$^NX(.NX*-9Q,:SC&#10;MJLR4L'%.1TU\XX)\XZ+XQL7PC:LT4S98YY341#D&gt;2#DNBG)&lt;#.6XZC/E)A&gt;&lt;&#10;MIIJ(QP.)QT,1CX&lt;A'D]=IH1,&lt;QIJ8AT/9!T/Q3H&gt;AG4\E9D2-L[=?:Z);SR0&#10;M;SP4WW@8OO&amp;49LH&amp;ZYR2FBC' RG'0U&amp;.AZ$&lt;3WVFW.2&quot;TU03\7@@\7@HXO$P&#10;MQ#,XO!@&lt;GQEJ;K^&quot;C7,Z:N(=#^0=#\4['H9WQ%!;SI=-YCDM-7&amp;.!W*.A^(&lt;&#10;M#\,Y8K!MY\Q&amp;^YR:FHC' XG'0Q&amp;/AR$&gt;,5HE&gt;7.S$TY7303D@03DH0C(PQ#0&#10;MY=7H]/)BJ&quot;AU-ECGE-1$0#Y(0!Z*@#P, 4FQMIP\&amp;^US:FIB'Q]D'Q_%/CZ&amp;&#10;M?:1HVTZ?S0XX/35QD ]RD(_B(!_#05*X2A+H%B_&lt;XZ2:R,@'R&lt;A'D9&amp;/(:/K&#10;MXP^GP]'QM:(4VF2&gt;TU(3&amp;_D@&amp;_DH-O(Q;&quot;0'V_:SXHT..#TU&lt;9$/&lt;I&amp;/XB(?&#10;MPT5RN&amp;VGT0T&gt;.$4U$9(/$I*/(B0?]18#*5XEB72;&amp;TY;3&lt;3D@\3DHXC)QQ#3&#10;MQ&gt;7H].0?BO(H;)S341,K^2 K^2A6\C&amp;L)(;:&lt;@YM,L]IJ8F/?)&quot;/?!0?^1@^&#10;M$H-M.W\VVN?4U,1( &lt;A(/HJ1? PCB=$JR9V;G7&quot;Z:J*E *2E $5+ 8:6AI_&gt;&#10;M#P?7I^]5/8'::)]34Q,K!2 K!2A6&quot;E!O;I.C;3F%;O# O2M&amp;$R,%(&quot;,%*$8*&#10;M4*]RD^-M_0U&amp;&amp;UQPFFIBI0!DI0#%2@'JS6YRP$K2Z58_G+J:R&quot;D R2E D5. &#10;M(Z&lt;3A4@/V.94U$1+ 4A+ 8J6 APMG2B%&gt;= ZIZ0F-@I -@I0;!1@V$B(M7V,&#10;MA\US6FKBHP#DHP#%1P&amp;&amp;CX1@%0'\!A^&lt;JII(*0!)*4&quot;14H AI?/CX?#P@ZH9&#10;M:(-U3DE-E!2&quot;E!2@*&quot;G 4)(4:\MYL]$^IZ8F-@I!-@I1;!1BV$B*MNW&lt;V&gt;R &#10;MTU,3'84@'84H.@HQ=&quot;2%JR1_;O'&quot;O092$R6%(&quot;6%*$H*,91T&gt;G%RJ2A]0J8Y&#10;M#35140A248BBHA!#17R@+2=.V#BGHR;^&quot;4'^&quot;5'\$V+XAP^U_3&gt;2@M8Y)34Q&#10;M4 @R4(ABH!##0'RLBEY'VNR&quot;TU03#84@#84H&amp;@HQ-/3IZNA0V3N&lt;8&gt;.&lt;CII(&#10;M* 1)*$214(@A(3'4EO-EDWE.2TW\$X+\$Z+X)\3PCQALVSFST3ZGIAX&amp;LDR0&#10;M@4(4 X48!A*C59(W-SOA=-5#0Y8)T5&quot;E]E9=62N$KE?7ZM[D#-KF5-3#0)8)&#10;M,5&quot;E+4)%# ,)D;:&lt;-ANLUY4,]#&quot;/94+,4^F+4!+#/$*L;2?-)O.&lt;EGK8QS(A&#10;M]JD41FB)81\A6&quot;4I&lt;Z,/3E4])&amp;29$ E56B-4Q9#0IXN/%Y=_7*B;)#79Y]34&#10;M0T.6&quot;=%0I3%&quot;30P-2=&amp;V/DUJ=,#IJ8&gt;$+!,BH4IEA)XH$GH.5]$SKLT..#WU&#10;M$)%E0D14J8S0$T5$4KCJ.NC&amp;YUT#/5QDF1 753HC%,5PT;*TU/HTP78VSO/;&#10;M]LK,-YGGM-1$102BHDIAA)88*BJ#/;U-TJPJ5KX*.L_+ZL2M&quot;MKH@U-5$Q,1&#10;MD(D(BHD(ZNZY&gt;AG#RVS.;+7=/T7CG(Z:J(B 5$105$3P%4_764V-D)+UNI*A&#10;M)BHB(!41%!41D8J@.KRT&amp;F\LW)N,YG&gt;4%[$\F+\LHFR9?Y6&lt;IED[ 5F(H%B(&#10;MB&quot;QD &gt;7B3Z*8':ZQ6&lt;G7=,=F!W5!=75($(((&quot;H*(&quot;$&amp;0G,/%&gt;,PBO5E,%4JZ&#10;MV4E=5DW$3D :(B@:(B(-0;)&gt;TS&amp;-[Y7VTTTNZI+J&amp;O@@$!$4$!$1B&quot;!)#]D&lt;&#10;M&lt;#8OE&amp;JZT0&gt;73S6)&quot;E(105$1$:D(.!\=9UF:J:@(+QOFST:Z] ,9B* 8B(@,&#10;M5&quot;DJ&quot;#C*XMM;FAG+&gt;%OKAZ+9#LX\%H@\!(4\1$0&gt;2+KKT57;LM5-=G!6L4&quot;&gt;&#10;ML5 \8XD\ TFV+B+5MFZ2W0[.'Q8(,18*8BP18L&quot;A&amp;L]HNBA:'ZJ&quot;V0[.$A9(&#10;M+1:*6BR16N LQXALGF;MBR&lt;9YM[1H4D^$%DL%+)8,K+(\I6 .XBF4^-DFCZT&#10;M+2%LG'M\3Y.,(*I8*%2Q9%2!9:R6J%L_W0*6N3M\-0D(0HF%@A)+AA)8P.%1&#10;MZV==T2QW8X FZ4#XL%#P8&lt;GPT2S=ARG[WABDR20N6E^&lt;A1UP*XJ:Y 2QPT)A&#10;MAR5B1Y.&lt;QX]%%HT+XW.4Q&gt;71YRKZ9;,3;GE1DZP@C5@H&amp;K$P-%*M\&quot;N:(X*V&#10;MN4FV)C&quot;Q03&quot;Q4&amp;!BB6 &quot;,/$1G49/*IA8-LPSL:;IC@U2BHVB%%NBE%)1\6Z5&#10;M-&quot;^,HYAUDRIBXZ?#^]N?C7_.\G^U=[/*!A&lt;=L+(-LHN-8A=;8A= TG,ZB:-5&#10;MK*._JU!T@X&lt;.2-H&amp;B&lt;9&amp;$8TM$0U&quot;T//H4;&amp;@-0\=T+4-,HZ-8AQ;8AR,H'&amp;B&#10;M6M 7#QTPMPW2CHVB'5NBG2V&quot;7BL?\M?-0U[7:0FD'QM%/[9$/PA!U0[YZ^8A&#10;MKXG';9&quot;);!03V1(38015.N2OFX&gt;\)CZW02JR451D2U34,'':O8K'WQ=SM5.G&#10;M9B&lt;=L+L-4I&amp;-HB);HB*&lt;K.V/_&lt;U..F!X!\0D&amp;X5)MG3]!BEKZQE@LY,.&amp;-X!&#10;MZ&lt;E!T9.#H:?/\82FAA9Q,:ZZ('P'Q&quot;D'A5,.!J&gt;: V\]+V!&lt;&lt;1IK(BP')&quot;P'&#10;M15@.AK : V__E(9QQ6FL&quot;;H&lt;$+H&lt;%'0Y&amp;.A:!JX&gt;O;;ZX=351&amp; .2&amp; .BL &lt;&#10;M#($U1*TH12#7&quot;W2M$CH@CCDH'',P. 9'K2HY8)&gt;W-+&amp;9 [*9@V(S!\-F&lt;M1J&#10;M&quot;&amp;VK'TY=3:#F@*#FH$#-P8!:0]0:,L.&amp;906BB=&lt;&lt;D-&lt;&lt;%*\Y&amp;%Z#H]:1&amp;3:L&#10;M@A%-V.:&quot;V.:@L,T1L0VHMK7(BW1F5$XY(2OW@)(FH&amp;3=2+^3&quot;RXN2&amp;$NBL)&lt;&#10;MD&lt;*:5'JE/H(R?VU&gt;WS]*QXL9.[;C*2U_L&amp;]6$2Y_1+.R#=-A5%IAGP=9FN&gt;E&#10;ME=+:P?YU-(G3RIBP(6:VV#0XKDPVMAI,8^;T),UFBVDTI$41)[&gt;Y&lt;1]-%_3=&#10;MSO_^^#^/1[^R_PY__?$_B[3X]3/-RGNFE[_L+7^0GKO\\(O4N@QUU?:?+QO_&#10;M]?+Q_UX^[AA]]H&gt;@&gt;7&amp;]2,3C^'%:_/K;XVQJW&quot;_]OUM[-I&lt;?#)J,TPG;8[5A&#10;M4=SL$F_Y^;&lt;?;XM?:T?&amp;3*V\G&quot;8WZ9!F&lt;32-_QN5MV*\CVX-YB7)]Q[S&gt;&amp;7J&#10;MKBCF&gt;_W^P\-#[\'NI=EMWS)-TO_[^=EP?$=GT2[K&gt;T64C.GJ2-;[3Y#[+UOQ&#10;MQV@8Y5'.OA8K-5C'B\=763K/Q7;+EF4\94&lt;NMY:?2?EEO_XMO,^ =&gt;C;-'LJ&#10;M6WQ.XS%=)\[G_&gt;LM9!N#F]N3&gt;$K+,5 V&amp;.Q]^&lt;3&amp;8?XERM-LDGY9=^S\R]&gt;O&#10;MRP%3;KS,RD'[Y?+JXN2S]?4L2A*F_)?KXP]?!X=G9U^K[[]&gt;7A]&gt;?#C^&gt;A_&gt;&#10;M];+'F^IP!&amp;=P1#1;1[P\AN= 7C;(.QXM*IV,?N/FWQ]6'7]#F^&amp;V-N5A7'[[&#10;M-QT7\3W--[7Z/;Z]F[)_16.KJ](5BXIEM G[+[Z):5:V=.W0_T9#?]&gt;]\2&gt;[&#10;MCNW:N]]N'']WXMV8MN&gt;0\8T75IHT&amp;9!=L0Y8[UOL5]&lt;A;F6DMDG&gt;K^P*P].C&#10;M&lt;N-PE^RZNQ;9M4V7&gt;*YK.^XNL^'Y[)A,?]&lt;F%H/AT#'-7&gt;('KE?9KNT.'A,;&#10;M%&amp;7&amp;OTS*%I9)_%UFR3)'A.R9WIYM]P+'M&lt;+0_9MI[9GF^G&quot;YO1KLIO-YV&lt;)@&#10;M.6 OB:&gt;K&lt;5RF\M40;_B;+#/I&gt;32^BQ.ZUN5X&gt;'YXM'LXO+P^NMP]6W9DJ-T6&#10;M&lt;X&gt;324;S:OB3T.H1+^B1'B'6RV[$[)D]EZ7BEV]6#=U&gt;K=D-#&lt;R]/6+&gt;F'L.&#10;MI=_V?/-FCUB1_X,CM0EO[#W+GY ]SYUX&gt;TY@^S\05VP5F1[=8WV-[OG^-[(7&#10;M3NP??#[9]IL&quot;D4,^?;R@Q4.:?5^?9EBKH&amp;&gt;7D1%OF=2@)AL,7=,IC?)*X=/'&#10;MLS2:&amp;$PXTS@^Y(W5FFTP5LMS+!F79V:CS$BY\=-CX/W\Y?0QCKXLO7PICWI7&#10;M]-*&lt;NDX?KVEYCS3-:F'9/;^,W'975H F&lt;/KX=#X&lt;1],J&amp;F*N^K[PO;SC\+ZV&#10;M^&gt;,W=JHI=^.^!&lt;=+&amp;90\(JJ=,2&gt;PVHF.YN7&lt;_7)&gt;W139,&quot;;2Z93ESW**5C8X&#10;MHD7U).&gt;RF_';&amp;G&lt;^HU&amp;6T$EY\B_;W413]H&gt;O&amp;1&quot;V-]HI;\9&gt;SN% ,_SF1BLL&#10;M#Y&lt;M2X6JAE6:J9D1MV\RM'J@;9,ML4FSN2PMTG$ZK&gt;X'O(G&amp;%+8(MFHT&gt;ITN&#10;M&quot;GI=S=DA:\)FR,QL7F:/T7-W$:6'MC?URXW];=DO)T])V6L_TB?@3,PU^5Q.&#10;M5*5&amp;ST.O8;99MJ[FO?W!Y&lt;7H^&amp;+$\.+Z&gt;,@^');%.,LM]=^_'A^=C@[?GQV7&#10;M&amp;P:7Y^]/+XX9T%33[.JK_/XRF3Y5OY/RB[,X^4XGS]O[+_NLGR9_^92#V\_8&#10;M).%@O^K(1L+.5&gt;]V*FL[SS/Q';+#;U_.]':,=(EL#..BZM'@,WI/IPSAEO%6&#10;M&gt;QSL#Y/9W&amp;#ROMN)V-^!)=!&gt;?M^;K^&lt;F8]HK&amp;ZSF*N4D&gt;Z&gt;,&gt;Z54N6F0)C?Q&#10;M[2*K!*W30LXVCMG&amp;ZN^Q^OT^RI;'N#R/E_NOSNA1-2&gt;3S_03FH^SN.HAJXVU&#10;MZ3JSRDYI4W8^6T_YRK_VRE'=[X3&gt;;]FAUJ)?/_+7]HUJ]S+.\@&lt;;\^7?CO'I&#10;&amp;_P,I\+)D&#10; &#10;end&#10;</svConfiguration>
- <svRestConfiguration type="str"></svRestConfiguration>
- </statManagerOptions>
- <currentUniqueIDForAgent type="int">45</currentUniqueIDForAgent>
- <_scenarioElementFactory ver="[0, [1, [0, [0]]]]" type="ixScenarioElementFactory">
- <singletonDict type="dict"/>
- <referenceCountDict type="dict">
- <item>
- <key type="str">qovCoprocessor</key>
- <value type="int">0</value>
- </item>
- <item>
- <key type="str">Impairment</key>
- <value type="int">0</value>
- </item>
- <item>
- <key type="str">asrCoprocessor</key>
- <value type="int">0</value>
- </item>
- </referenceCountDict>
- </_scenarioElementFactory>
- </item>
- </testList>
-</root>
diff --git a/functest/opnfv_tests/vnf/ims/ixia/files/Registration_only_LPS.tst b/functest/opnfv_tests/vnf/ims/ixia/files/Registration_only_LPS.tst
deleted file mode 100644
index a7bce95a0..000000000
--- a/functest/opnfv_tests/vnf/ims/ixia/files/Registration_only_LPS.tst
+++ /dev/null
Binary files differ
diff --git a/functest/opnfv_tests/vnf/ims/ixia/files/SIPCall.tst b/functest/opnfv_tests/vnf/ims/ixia/files/SIPCall.tst
deleted file mode 100644
index 783918861..000000000
--- a/functest/opnfv_tests/vnf/ims/ixia/files/SIPCall.tst
+++ /dev/null
Binary files differ
diff --git a/functest/opnfv_tests/vnf/ims/ixia/utils/IxChassisUtils.py b/functest/opnfv_tests/vnf/ims/ixia/utils/IxChassisUtils.py
deleted file mode 100644
index 973e0264d..000000000
--- a/functest/opnfv_tests/vnf/ims/ixia/utils/IxChassisUtils.py
+++ /dev/null
@@ -1,150 +0,0 @@
-#!/usr/bin/env python
-
-# Copyright (c) 2017 IXIA and others.
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-
-import httplib2
-import json
-import logging
-
-
-okStates = [200, 201, 202]
-states = [
- 'Queued',
- 'In Progress',
- 'Manual Step Required',
- 'Error',
- 'Finished',
- 'Aborted',
- 'Retried',
- 'IRebooting',
- 'Force Continue',
- 'Pending',
- ]
-notStartedState = 'Not_Started'
-errorStates = ['Error', 'Aborted', 'Force Continue']
-finishedStates = ['Manual Step Required', 'Finished']
-
-logger = logging.getLogger(__name__)
-
-
-class TestFailedError(Exception):
- pass
-
-
-class ChassisRestAPI:
- @staticmethod
- def postWithPayload(loginUrl, payload=None):
- urlHeadersJson = {'content-type': 'application/json'}
- try:
- h = httplib2.Http('.cache',
- disable_ssl_certificate_validation=True)
- if payload is None:
- logger.debug('POST: ' + loginUrl)
- (response, content) = h.request(loginUrl, 'POST', '',
- urlHeadersJson)
- logger.debug(content)
- else:
- logger.debug('POST: ' + loginUrl + ' <- Data: ' + str(payload))
- (response, content) = h.request(loginUrl, 'POST',
- body=payload,
- headers=urlHeadersJson)
- logger.debug(response)
- logger.debug(content)
- except Exception, e:
- raise Exception('Got an error code: ', e)
- return content
-
- @staticmethod
- def postWithPayloadAndHeaders(loginUrl, urlHeadersJson,
- payload=None):
- try:
- h = httplib2.Http('.cache',
- disable_ssl_certificate_validation=True)
- if payload is None:
- logger.debug('POST: ' + loginUrl)
- (response, content) = h.request(loginUrl, 'POST', '',
- urlHeadersJson)
- else:
- logger.debug('POST: ' + loginUrl + ' <- Data: ' + str(payload))
- (response, content) = h.request(loginUrl, 'POST',
- body=payload,
- headers=urlHeadersJson)
- except Exception, e:
- raise Exception('Got an error code: ', e)
- return content
-
- @staticmethod
- def postOperation(url, apiKey, payload=''):
- urlHeadersJson = {'content-type': 'application/json',
- 'X-Api-Key': '%s' % str(apiKey)}
- try:
- h = httplib2.Http('.cache',
- disable_ssl_certificate_validation=True)
- if payload is None:
- logger.debug('POST: ' + url)
- (response, content) = h.request(url, 'POST',
- json.dumps(payload),
- urlHeadersJson)
- else:
- logger.debug('POST: ' + url + ' <- Data: ' + str(payload))
- (response, content) = h.request(url, 'POST',
- json.dumps(payload),
- headers=urlHeadersJson)
- except Exception, e:
- raise Exception('Got an error code: ', e)
- return content
-
- @staticmethod
- def patch(url, payload, apiKey):
- urlHeadersJson = {'content-type': 'application/json',
- 'X-Api-Key': '%s' % str(apiKey)}
- try:
- h = httplib2.Http('.cache',
- disable_ssl_certificate_validation=True)
- logger.debug('PATCH: ' + url + ' <-- Attribute: ' +
- str(payload))
- (response, content) = h.request(url, 'PATCH',
- json.dumps(payload),
- urlHeadersJson)
- except Exception, e:
-
- # print (response, content)
-
- raise Exception('Got an error code: ', e)
- return content
-
- @staticmethod
- def delete(url, apiKey):
- urlHeadersJson = {'content-type': 'application/json',
- 'X-Api-Key': '%s' % str(apiKey)}
- try:
- h = httplib2.Http('.cache',
- disable_ssl_certificate_validation=True)
- (response, content) = h.request(url, 'DELETE', '', urlHeadersJson)
- logger.debug('DELETE: ' + url)
- except Exception, e:
- raise Exception('Got an error code: ', e)
- if response.status not in okStates:
- raise TestFailedError(json.loads(content)['error'])
- return json.loads(content)
-
- @staticmethod
- def getWithHeaders(url, apiKey):
- urlHeadersJson = {'content-type': 'application/json',
- 'X-Api-Key': '%s' % str(apiKey)}
- try:
- h = httplib2.Http('.cache',
- disable_ssl_certificate_validation=True)
- logger.debug('GET: ' + url)
- (response, content) = h.request(url, 'GET', '', urlHeadersJson)
- except Exception, e:
- raise Exception('Got an error code: ', e)
- if response.status not in okStates:
- raise TestFailedError(json.loads(content)['error'])
- output = json.loads(content)
- return output
diff --git a/functest/opnfv_tests/vnf/ims/ixia/utils/IxLoadUtils.py b/functest/opnfv_tests/vnf/ims/ixia/utils/IxLoadUtils.py
deleted file mode 100644
index 50dfbc661..000000000
--- a/functest/opnfv_tests/vnf/ims/ixia/utils/IxLoadUtils.py
+++ /dev/null
@@ -1,398 +0,0 @@
-#!/usr/bin/env python
-
-# Copyright (c) 2017 IXIA and others.
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-
-import requests
-import sys
-import time
-import logging
-
-from functest.opnfv_tests.vnf.ims.ixia.utils import IxRestUtils
-
-
-kActionStateFinished = 'finished'
-kActionStatusSuccessful = 'Successful'
-kActionStatusError = 'Error'
-kTestStateUnconfigured = 'Unconfigured'
-
-logger = logging.getLogger(__name__)
-
-
-def stripApiAndVersionFromURL(url):
-
- # remove the slash (if any) at the beginning of the url
-
- if url[0] == '/':
- url = url[1:]
-
- urlElements = url.split('/')
- if 'api' in url:
-
- # strip the api/v0 part of the url
-
- urlElements = urlElements[2:]
-
- return '/'.join(urlElements)
-
-
-def waitForActionToFinish(connection, replyObj, actionUrl):
- """
- This method waits for an action to finish executing. after a POST request
- is sent in order to start an action, The HTTP reply will contain,
- in the header, a 'location' field, that contains an URL.
- The action URL contains the status of the action. we perform a GET on that
- URL every 0.5 seconds until the action finishes with a success.
- If the action fails, we will throw an error and
- print the action's error message.
- """
-
- actionResultURL = replyObj.headers.get('location')
- if actionResultURL:
- actionResultURL = stripApiAndVersionFromURL(actionResultURL)
- actionFinished = False
-
- while not actionFinished:
- actionStatusObj = connection.httpGet(actionResultURL)
-
- if actionStatusObj.state == kActionStateFinished:
- if actionStatusObj.status == kActionStatusSuccessful:
- actionFinished = True
- else:
- errorMsg = "Error while executing action '%s'." \
- % actionUrl
-
- if actionStatusObj.status == kActionStatusError:
- errorMsg += actionStatusObj.error
-
- print errorMsg
-
- sys.exit(1)
- else:
- time.sleep(0.1)
-
-
-def performGenericOperation(connection, url, payloadDict):
- """
- This will perform a generic operation on the given url,
- it will wait for it to finish.
- """
-
- data = IxRestUtils.formatDictToJSONPayload(payloadDict)
- reply = connection.httpPost(url=url, data=data)
-
- waitForActionToFinish(connection, reply, url)
-
- return reply
-
-
-def performGenericPost(connection, listUrl, payloadDict):
- """
- This will perform a generic POST method on a given url
- """
-
- data = IxRestUtils.formatDictToJSONPayload(payloadDict)
-
- reply = connection.httpPost(url=listUrl, data=data)
- try:
- newObjPath = reply.headers['location']
- except:
- raise Exception('Location header is not present. \
- Please check if the action was created successfully.')
-
- newObjID = newObjPath.split('/')[-1]
- return newObjID
-
-
-def performGenericDelete(connection, listUrl, payloadDict):
- """
- This will perform a generic DELETE method on a given url
- """
-
- data = IxRestUtils.formatDictToJSONPayload(payloadDict)
-
- reply = connection.httpDelete(url=listUrl, data=data)
- return reply
-
-
-def performGenericPatch(connection, url, payloadDict):
- """
- This will perform a generic PATCH method on a given url
- """
-
- data = IxRestUtils.formatDictToJSONPayload(payloadDict)
-
- reply = connection.httpPatch(url=url, data=data)
- return reply
-
-
-def createSession(connection, ixLoadVersion):
- """
- This method is used to create a new session.
- It will return the url of the newly created session
- """
-
- sessionsUrl = 'sessions'
- data = {'ixLoadVersion': ixLoadVersion}
-
- sessionId = performGenericPost(connection, sessionsUrl, data)
-
- newSessionUrl = '%s/%s' % (sessionsUrl, sessionId)
- startSessionUrl = '%s/operations/start' % newSessionUrl
-
- # start the session
-
- performGenericOperation(connection, startSessionUrl, {})
-
- logger.debug('Created session no %s' % sessionId)
-
- return newSessionUrl
-
-
-def deleteSession(connection, sessionUrl):
- """
- This method is used to delete an existing session.
- """
-
- deleteParams = {}
- performGenericDelete(connection, sessionUrl, deleteParams)
-
-
-def uploadFile(connection, url, fileName, uploadPath, overwrite=True):
- headers = {'Content-Type': 'multipart/form-data'}
- params = {'overwrite': overwrite, 'uploadPath': uploadPath}
-
- logger.debug('Uploading...')
- try:
- with open(fileName, 'rb') as f:
- resp = requests.post(url, data=f, params=params,
- headers=headers)
- except requests.exceptions.ConnectionError, e:
- raise Exception('Upload file failed. Received connection error. \
- One common cause for this error is the size of the \
- file to be uploaded.The web server sets a limit of 1GB\
- for the uploaded file size. \
- Received the following error: %s' % str(e))
- except IOError, e:
- raise Exception('Upload file failed. Received IO error: %s'
- % str(e))
- except Exception:
- raise Exception('Upload file failed. Received the following error: %s'
- % str(e))
- else:
- logger.debug('Upload file finished.')
- logger.debug('Response status code %s' % resp.status_code)
- logger.debug('Response text %s' % resp.text)
-
-
-def loadRepository(connection, sessionUrl, rxfFilePath):
- """
- This method will perform a POST request to load a repository.
- """
-
- loadTestUrl = '%s/ixload/test/operations/loadTest' % sessionUrl
- data = {'fullPath': rxfFilePath}
-
- performGenericOperation(connection, loadTestUrl, data)
-
-
-def saveRxf(connection, sessionUrl, rxfFilePath):
- """
- This method saves the current rxf to the disk of the machine on
- which the IxLoad instance is running.
- """
-
- saveRxfUrl = '%s/ixload/test/operations/saveAs' % sessionUrl
- rxfFilePath = rxfFilePath.replace('\\', '\\\\')
- data = {'fullPath': rxfFilePath, 'overWrite': 1}
-
- performGenericOperation(connection, saveRxfUrl, data)
-
-
-def runTest(connection, sessionUrl):
- """
- This method is used to start the currently loaded test.
- After starting the 'Start Test' action, wait for the action to complete.
- """
-
- startRunUrl = '%s/ixload/test/operations/runTest' % sessionUrl
- data = {}
-
- performGenericOperation(connection, startRunUrl, data)
-
-
-def getTestCurrentState(connection, sessionUrl):
- """
- This method gets the test current state.
- (for example - running, unconfigured, ..)
- """
-
- activeTestUrl = '%s/ixload/test/activeTest' % sessionUrl
- testObj = connection.httpGet(activeTestUrl)
-
- return testObj.currentState
-
-
-def getTestRunError(connection, sessionUrl):
- """
- This method gets the error that appeared during the last test run.
- If no error appeared (the test ran successfully),
- the return value will be 'None'.
- """
-
- activeTestUrl = '%s/ixload/test/activeTest' % sessionUrl
- testObj = connection.httpGet(activeTestUrl)
-
- return testObj.testRunError
-
-
-def waitForTestToReachUnconfiguredState(connection, sessionUrl):
- """
- This method waits for the current test to reach the 'Unconfigured' state.
- """
-
- while getTestCurrentState(connection, sessionUrl) \
- != kTestStateUnconfigured:
- time.sleep(0.1)
-
-
-def pollStats(connection, sessionUrl, watchedStatsDict, pollingInterval=4):
- """
- This method is used to poll the stats.
- Polling stats is per request but this method does a continuous poll.
- """
-
- statSourceList = watchedStatsDict.keys()
- statsDict = {}
-
- collectedTimestamps = {}
- testIsRunning = True
-
- # check stat sources
-
- for statSource in statSourceList[:]:
- statSourceUrl = '%s/ixload/stats/%s/values' % (sessionUrl, statSource)
- statSourceReply = connection.httpRequest('GET', statSourceUrl)
- if statSourceReply.status_code != 200:
- logger.debug("Warning - Stat source '%s' does not exist. \
- Will ignore it." % statSource)
- statSourceList.remove(statSource)
-
- # check the test state, and poll stats while the test is still running
-
- while testIsRunning:
-
- # the polling interval is configurable.
- # by default, it's set to 4 seconds
-
- time.sleep(pollingInterval)
-
- for statSource in statSourceList:
- valuesUrl = '%s/ixload/stats/%s/values' % (sessionUrl, statSource)
-
- valuesObj = connection.httpGet(valuesUrl)
- valuesDict = valuesObj.getOptions()
-
- # get just the new timestamps - that were not previously
- # retrieved in another stats polling iteration
-
- newTimestamps = [int(timestamp) for timestamp in
- valuesDict.keys() if timestamp
- not in collectedTimestamps.get(statSource,
- [])]
- newTimestamps.sort()
-
- for timestamp in newTimestamps:
- timeStampStr = str(timestamp)
-
- collectedTimestamps.setdefault(
- statSource, []).append(timeStampStr)
-
- timestampDict = statsDict.setdefault(
- statSource, {}).setdefault(timestamp, {})
-
- # save the values for the current timestamp,
- # and later print them
-
- logger.info(' -- ')
- for (caption, value) in \
- valuesDict[timeStampStr].getOptions().items():
- if caption in watchedStatsDict[statSource]:
- logger.info(' %s -> %s' % (caption, value))
- timestampDict[caption] = value
-
- testIsRunning = getTestCurrentState(connection, sessionUrl) \
- == 'Running'
-
- logger.debug('Stopped receiving stats.')
- return timestampDict
-
-
-def clearChassisList(connection, sessionUrl):
- """
- This method is used to clear the chassis list.
- After execution no chassis should be available in the chassisListself.
- """
-
- chassisListUrl = '%s/ixload/chassischain/chassisList' % sessionUrl
- deleteParams = {}
- performGenericDelete(connection, chassisListUrl, deleteParams)
-
-
-def configureLicenseServer(connection, sessionUrl, licenseServerIp):
- """
- This method is used to clear the chassis list.
- After execution no chassis should be available in the chassisList.
- """
-
- chassisListUrl = '%s/ixload/preferences' % sessionUrl
- patchParams = {'licenseServer': licenseServerIp}
- performGenericPatch(connection, chassisListUrl, patchParams)
-
-
-def addChassisList(connection, sessionUrl, chassisList):
- """
- This method is used to add one or more chassis to the chassis list.
- """
-
- chassisListUrl = '%s/ixload/chassisChain/chassisList' % sessionUrl
-
- for chassisName in chassisList:
- data = {'name': chassisName}
- chassisId = performGenericPost(connection, chassisListUrl, data)
-
- # refresh the chassis
-
- refreshConnectionUrl = '%s/%s/operations/refreshConnection' \
- % (chassisListUrl, chassisId)
- performGenericOperation(connection, refreshConnectionUrl, {})
-
-
-def assignPorts(connection, sessionUrl, portListPerCommunity):
- """
- This method is used to assign ports from a connected chassis
- to the required NetTraffics.
- """
-
- communtiyListUrl = '%s/ixload/test/activeTest/communityList' \
- % sessionUrl
-
- communityList = connection.httpGet(url=communtiyListUrl)
-
- for community in communityList:
- portListForCommunity = portListPerCommunity.get(community.name)
-
- portListUrl = '%s/%s/network/portList' % (communtiyListUrl,
- community.objectID)
-
- if portListForCommunity:
- for portTuple in portListForCommunity:
- (chassisId, cardId, portId) = portTuple
- paramDict = {'chassisId': chassisId, 'cardId': cardId,
- 'portId': portId}
-
- performGenericPost(connection, portListUrl, paramDict)
diff --git a/functest/opnfv_tests/vnf/ims/ixia/utils/IxRestUtils.py b/functest/opnfv_tests/vnf/ims/ixia/utils/IxRestUtils.py
deleted file mode 100644
index 63db403b3..000000000
--- a/functest/opnfv_tests/vnf/ims/ixia/utils/IxRestUtils.py
+++ /dev/null
@@ -1,192 +0,0 @@
-#!/usr/bin/env python
-
-# Copyright (c) 2017 IXIA and others.
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-
-from urlparse import urljoin
-import requests
-
-
-def getConnection(server, port):
- """
- Gets a Connection instance, that will be used to
- make the HTTP requests to the application
- """
- connectionUrl = 'http://%s:%s/' % (server, port)
-
- conn = Connection(connectionUrl, 'v0')
- return conn
-
-
-def formatDictToJSONPayload(dictionary):
- """
- Converts a given python dict instance to a string
- JSON payload that can be sent to a REST API.
- """
- jsonPayload = '{'
- optionsList = []
- for (key, val) in dictionary.items():
- valStr = str(val)
- if type(val) is str:
- valStr = '"%s"' % val
- if type(val) is bool:
- valStr = valStr.lower()
- optionsList.append('"%s":%s' % (key, valStr))
-
- jsonPayload += ','.join(optionsList)
- jsonPayload += '}'
-
- return jsonPayload
-
-
-class Connection(object):
-
- """
- Class that executes the HTTP requests to the application instance.
- It handles creating the HTTP session and executing HTTP methods.
- """
-
- kHeaderContentType = 'content-type'
- kContentJson = 'application/json'
-
- def __init__(self, siteUrl, apiVersion):
- self.httpSession = None
-
- self.url = Connection.urljoin(siteUrl, 'api')
- self.url = Connection.urljoin(self.url, apiVersion)
-
- def _getHttpSession(self):
- """
- This is a lazy initializer for the HTTP session.
- It does not need to be active until it is required.
- """
-
- if self.httpSession is None:
- self.httpSession = requests.Session()
- return self.httpSession
-
- @classmethod
- def urljoin(cls, base, end):
- """ Join two URLs. If the second URL is absolute, the base is ignored.
-
- Use this instead of urlparse.urljoin directly so that we can customize
- its behavior if necessary.
- Currently differs in that it
- 1. appends a / to base if not present.
- 2. casts end to a str as a convenience
- """
-
- if base and not base.endswith('/'):
- base = base + '/'
- return urljoin(base, str(end))
-
- def httpRequest(self, method, url='', data='', params={}, headers={}):
- """
- Method for making a HTTP request.
- The method type (GET, POST, PATCH, DELETE) will be sent as a parameter.
- Along with the url and request data. The HTTP response is returned
- """
-
- headers[Connection.kHeaderContentType] = Connection.kContentJson
-
- absUrl = Connection.urljoin(self.url, url)
- result = self._getHttpSession().request(method,
- absUrl,
- data=str(data),
- params=params,
- headers=headers)
- return result
-
- def httpGet(self, url='', data='', params={}, headers={}):
- """
- Method for calling HTTP GET.
- This will return a WebObject that has the fields returned
- in JSON format by the GET operation.
- """
-
- reply = self.httpRequest('GET', url, data, params, headers)
- return _WebObject(reply.json())
-
- def httpPost(self, url='', data='', params={}, headers={}):
- """
- Method for calling HTTP POST. Will return the HTTP reply.
- """
-
- return self.httpRequest('POST', url, data, params, headers)
-
- def httpPatch(self, url='', data='', params={}, headers={}):
- """
- Method for calling HTTP PATCH. Will return the HTTP reply.
- """
-
- return self.httpRequest('PATCH', url, data, params, headers)
-
- def httpDelete(self, url='', data='', params={}, headers={}):
- """
- Method for calling HTTP DELETE. Will return the HTTP reply.
- """
-
- return self.httpRequest('DELETE', url, data, params, headers)
-
-
-def _WebObject(value):
- """
- Method used for creating a wrapper object corresponding to the JSON string
- received on a GET request.
- """
-
- if isinstance(value, dict):
- result = WebObject(**value)
- elif isinstance(value, list):
- result = WebList(entries=value)
- else:
- result = value
- return result
-
-
-class WebList(list):
-
- """
- Using this class a JSON list will be transformed
- in a list of WebObject instances.
- """
-
- def __init__(self, entries=[]):
- """
- Create a WebList from a list of items that
- are processed by the _WebObject function
- """
-
- for item in entries:
- self.append(_WebObject(item))
-
-
-class WebObject(object):
-
- """
- A WebObject instance will have its fields set to correspond to
- the JSON format received on a GET request.
- """
-
- def __init__(self, **entries):
- """
- Create a WebObject instance by providing a dict having a
- property - value structure.
- """
-
- self.jsonOptions = {}
- for (key, value) in entries.iteritems():
- webObj = _WebObject(value)
- self.jsonOptions[key] = webObj
- self.__dict__[key] = webObj
-
- def getOptions(self):
- '''
- Get the JSON dictionary which represents the WebObject Instance
- '''
-
- return self.jsonOptions
diff --git a/functest/opnfv_tests/vnf/ims/ixia/utils/__init__.py b/functest/opnfv_tests/vnf/ims/ixia/utils/__init__.py
deleted file mode 100644
index e69de29bb..000000000
--- a/functest/opnfv_tests/vnf/ims/ixia/utils/__init__.py
+++ /dev/null
diff --git a/functest/opnfv_tests/vnf/ims/orchestra.yaml b/functest/opnfv_tests/vnf/ims/orchestra.yaml
deleted file mode 100644
index f81f55fbe..000000000
--- a/functest/opnfv_tests/vnf/ims/orchestra.yaml
+++ /dev/null
@@ -1,68 +0,0 @@
----
-tenant_images:
- orchestrator:
- ubuntu-14.04-server-cloudimg-amd64-disk1:
- /home/opnfv/functest/images/trusty-server-cloudimg-amd64-disk1.img
- orchestra_openims:
- openims: /home/opnfv/functest/images/img
- orchestra_clearwaterims:
- ubuntu-14.04-server-cloudimg-amd64-disk1:
- /home/opnfv/functest/images/trusty-server-cloudimg-amd64-disk1.img
-mano:
- name: OpenBaton
- version: '3.2.0'
- requirements:
- flavor:
- name: openbaton
- ram_min: 4096
- disk: 5
- vcpus: 2
- image: 'ubuntu-14.04-server-cloudimg-amd64-disk1'
- bootstrap:
- url: http://get.openbaton.org/bootstraps/bootstrap_3.2.0_opnfv/bootstrap
- config:
- url:
- http://get.openbaton.org/bootstraps/bootstrap_3.2.0_opnfv/bootstrap-config-file
- gvnfm:
- userdata:
- url:
- https://raw.githubusercontent.com/openbaton/generic-vnfm/3.2.0/src/main/resources/user-data.sh
- credentials:
- username: admin
- password: openbaton
-
-orchestra_openims:
- name: OpenIMS
- descriptor:
- url:
- http://marketplace.openbaton.org:8080/api/v1/nsds/fokus/OpenImsCore/3.2.0/json
- requirements:
- flavor:
- name: m1.small
- ram_min: 2048
- disk: 5
- vcpus: 2
- test:
- scscf:
- ports: [3870, 6060]
- pcscf:
- ports: [4060]
- icscf:
- ports: [3869, 5060]
- fhoss:
- ports: [3868]
- bind9:
- ports: []
-
-orchestra_clearwaterims:
- name: Clearwater IMS
- descriptor:
- url:
- http://marketplace.openbaton.org:8080/api/v1/nsds/fokus/ClearwaterIMS/3.2.0/json
- requirements:
- flavor:
- name: m1.small
- ram_min: 2048
- disk: 5
- vcpus: 2
- test:
diff --git a/functest/opnfv_tests/vnf/ims/orchestra_clearwaterims.py b/functest/opnfv_tests/vnf/ims/orchestra_clearwaterims.py
deleted file mode 100644
index 3db53e35e..000000000
--- a/functest/opnfv_tests/vnf/ims/orchestra_clearwaterims.py
+++ /dev/null
@@ -1,667 +0,0 @@
-#!/usr/bin/env python
-
-# Copyright (c) 2016 Orange and others.
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-
-"""Orchestra Clearwater IMS testcase implementation."""
-
-import json
-import logging
-import os
-import socket
-import time
-import pkg_resources
-import yaml
-
-import functest.core.vnf as vnf
-import functest.utils.openstack_utils as os_utils
-from functest.opnfv_tests.openstack.snaps import snaps_utils
-from functest.utils.constants import CONST
-
-from org.openbaton.cli.errors.errors import NfvoException
-from org.openbaton.cli.agents.agents import MainAgent
-from snaps.config.flavor import FlavorConfig
-from snaps.config.image import ImageConfig
-from snaps.config.network import NetworkConfig, PortConfig, SubnetConfig
-from snaps.config.router import RouterConfig
-from snaps.config.security_group import (
- Direction, Protocol, SecurityGroupConfig, SecurityGroupRuleConfig)
-from snaps.config.vm_inst import VmInstanceConfig
-from snaps.openstack.utils import keystone_utils
-from snaps.openstack.create_flavor import OpenStackFlavor
-from snaps.openstack.create_image import OpenStackImage
-from snaps.openstack.create_instance import OpenStackVmInstance
-from snaps.openstack.create_network import OpenStackNetwork
-from snaps.openstack.create_router import OpenStackRouter
-from snaps.openstack.create_security_group import OpenStackSecurityGroup
-
-
-__author__ = "Pauls, Michael <michael.pauls@fokus.fraunhofer.de>"
-# ----------------------------------------------------------
-#
-# UTILS
-#
-# -----------------------------------------------------------
-
-
-def get_config(parameter, file_path):
- """
- Get config parameter.
-
- Returns the value of a given parameter in file.yaml
- parameter must be given in string format with dots
- Example: general.openstack.image_name
- """
- with open(file_path) as config_file:
- file_yaml = yaml.safe_load(config_file)
- config_file.close()
- value = file_yaml
- for element in parameter.split("."):
- value = value.get(element)
- if value is None:
- raise ValueError("The parameter %s is not defined in"
- " reporting.yaml", parameter)
- return value
-
-
-def servertest(host, port):
- """Method to test that a server is reachable at IP:port"""
- args = socket.getaddrinfo(host, port, socket.AF_INET, socket.SOCK_STREAM)
- for family, socktype, proto, canonname, sockaddr in args:
- sock = socket.socket(family, socktype, proto)
- try:
- sock.connect(sockaddr)
- except socket.error:
- return False
- else:
- sock.close()
- return True
-
-
-def get_userdata(orchestrator=dict):
- """Build userdata for Open Baton machine"""
- userdata = "#!/bin/bash\n"
- userdata += "echo \"Executing userdata...\"\n"
- userdata += "set -x\n"
- userdata += "set -e\n"
- userdata += "echo \"Set nameserver to '8.8.8.8'...\"\n"
- userdata += "echo \"nameserver 8.8.8.8\" >> /etc/resolv.conf\n"
- userdata += "echo \"Install curl...\"\n"
- userdata += "apt-get install curl\n"
- userdata += "echo \"Inject public key...\"\n"
- userdata += ("echo \"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCuPXrV3"
- "geeHc6QUdyUr/1Z+yQiqLcOskiEGBiXr4z76MK4abiFmDZ18OMQlc"
- "fl0p3kS0WynVgyaOHwZkgy/DIoIplONVr2CKBKHtPK+Qcme2PVnCtv"
- "EqItl/FcD+1h5XSQGoa+A1TSGgCod/DPo+pes0piLVXP8Ph6QS1k7S"
- "ic7JDeRQ4oT1bXYpJ2eWBDMfxIWKZqcZRiGPgMIbJ1iEkxbpeaAd9O"
- "4MiM9nGCPESmed+p54uYFjwEDlAJZShcAZziiZYAvMZhvAhe6USljc"
- "7YAdalAnyD/jwCHuwIrUw/lxo7UdNCmaUxeobEYyyFA1YVXzpNFZya"
- "XPGAAYIJwEq/ openbaton@opnfv\" >> /home/ubuntu/.ssh/aut"
- "horized_keys\n")
- userdata += "echo \"Download bootstrap...\"\n"
- userdata += ("curl -s %s "
- "> ./bootstrap\n" % orchestrator['bootstrap']['url'])
- userdata += ("curl -s %s" "> ./config_file\n" %
- orchestrator['bootstrap']['config']['url'])
- userdata += ("echo \"Disable usage of mysql...\"\n")
- userdata += "sed -i s/mysql=.*/mysql=no/g /config_file\n"
- userdata += ("echo \"Setting 'rabbitmq_broker_ip' to '%s'\"\n"
- % orchestrator['details']['fip'].ip)
- userdata += ("sed -i s/rabbitmq_broker_ip=localhost/rabbitmq_broker_ip"
- "=%s/g /config_file\n" % orchestrator['details']['fip'].ip)
- userdata += "echo \"Set autostart of components to 'false'\"\n"
- userdata += "export OPENBATON_COMPONENT_AUTOSTART=false\n"
- userdata += "echo \"Execute bootstrap...\"\n"
- bootstrap = "sh ./bootstrap release -configFile=./config_file"
- userdata += bootstrap + "\n"
- userdata += "echo \"Setting 'nfvo.plugin.timeout' to '300000'\"\n"
- userdata += ("echo \"nfvo.plugin.timeout=600000\" >> "
- "/etc/openbaton/openbaton-nfvo.properties\n")
- userdata += (
- "wget %s -O /etc/openbaton/openbaton-vnfm-generic-user-data.sh\n" %
- orchestrator['gvnfm']['userdata']['url'])
- userdata += "sed -i '113i"'\ \ \ \ '"sleep 60' " \
- "/etc/openbaton/openbaton-vnfm-generic-user-data.sh\n"
- userdata += ("sed -i s/nfvo.marketplace.port=8082/nfvo.marketplace."
- "port=8080/g /etc/openbaton/openbaton-nfvo.properties\n")
- userdata += "echo \"Starting NFVO\"\n"
- userdata += "service openbaton-nfvo restart\n"
- userdata += "echo \"Starting Generic VNFM\"\n"
- userdata += "service openbaton-vnfm-generic restart\n"
- userdata += "echo \"...end of userdata...\"\n"
- return userdata
-
-
-class ClearwaterImsVnf(vnf.VnfOnBoarding):
- """Clearwater IMS VNF deployed with openBaton orchestrator"""
-
- # logger = logging.getLogger(__name__)
-
- def __init__(self, **kwargs):
- if "case_name" not in kwargs:
- kwargs["case_name"] = "orchestra_clearwaterims"
- super(ClearwaterImsVnf, self).__init__(**kwargs)
- self.logger = logging.getLogger("functest.ci.run_tests.orchestra")
- self.logger.info("kwargs %s", (kwargs))
-
- self.case_dir = pkg_resources.resource_filename(
- 'functest', 'opnfv_tests/vnf/ims/')
- self.data_dir = CONST.__getattribute__('dir_ims_data')
- self.test_dir = CONST.__getattribute__('dir_repo_vims_test')
- self.created_resources = []
- self.logger.info("%s VNF onboarding test starting", self.case_name)
-
- try:
- self.config = CONST.__getattribute__(
- 'vnf_{}_config'.format(self.case_name))
- except BaseException:
- raise Exception("Orchestra VNF config file not found")
-
- config_file = self.case_dir + self.config
-
- self.mano = dict(
- get_config("mano", config_file),
- details={}
- )
- self.logger.debug("Orchestrator configuration %s", self.mano)
-
- self.details['orchestrator'] = dict(
- name=self.mano['name'],
- version=self.mano['version'],
- status='ERROR',
- result=''
- )
-
- self.vnf = dict(
- get_config(self.case_name, config_file),
- )
- self.logger.debug("VNF configuration: %s", self.vnf)
-
- self.details['vnf'] = dict(
- name=self.vnf['name'],
- )
-
- self.details['test_vnf'] = dict(
- name=self.case_name,
- )
-
- # Orchestra base Data directory creation
- if not os.path.exists(self.data_dir):
- os.makedirs(self.data_dir)
-
- self.images = get_config("tenant_images.orchestrator", config_file)
- self.images.update(
- get_config(
- "tenant_images.%s" %
- self.case_name,
- config_file))
- self.snaps_creds = None
-
- def prepare(self):
- """Prepare testscase (Additional pre-configuration steps)."""
- super(ClearwaterImsVnf, self).prepare()
-
- self.logger.info("Additional pre-configuration steps")
-
- public_auth_url = keystone_utils.get_endpoint(
- self.snaps_creds, 'identity')
-
- self.creds = {
- "tenant": self.tenant_name,
- "username": self.tenant_name,
- "password": self.tenant_name,
- "auth_url": public_auth_url
- }
- self.prepare_images()
- self.prepare_flavor()
- self.prepare_security_groups()
- self.prepare_network()
- self.prepare_floating_ip()
-
- def prepare_images(self):
- """Upload images if they doen't exist yet"""
- self.logger.info("Upload images if they doen't exist yet")
- for image_name, image_file in self.images.iteritems():
- self.logger.info("image: %s, file: %s", image_name, image_file)
- if image_file and image_name:
- image = OpenStackImage(
- self.snaps_creds,
- ImageConfig(name=image_name,
- image_user='cloud',
- img_format='qcow2',
- image_file=image_file,
- public=True))
- image.create()
- # self.created_resources.append(image);
-
- def prepare_security_groups(self):
- """Create Open Baton security group if it doesn't exist yet"""
- self.logger.info(
- "Creating security group for Open Baton if not yet existing...")
- sg_rules = list()
- sg_rules.append(
- SecurityGroupRuleConfig(
- sec_grp_name="orchestra-sec-group-allowall",
- direction=Direction.ingress,
- protocol=Protocol.tcp,
- port_range_min=1,
- port_range_max=65535))
- sg_rules.append(
- SecurityGroupRuleConfig(
- sec_grp_name="orchestra-sec-group-allowall",
- direction=Direction.egress,
- protocol=Protocol.tcp,
- port_range_min=1,
- port_range_max=65535))
- sg_rules.append(
- SecurityGroupRuleConfig(
- sec_grp_name="orchestra-sec-group-allowall",
- direction=Direction.ingress,
- protocol=Protocol.udp,
- port_range_min=1,
- port_range_max=65535))
- sg_rules.append(
- SecurityGroupRuleConfig(
- sec_grp_name="orchestra-sec-group-allowall",
- direction=Direction.egress,
- protocol=Protocol.udp,
- port_range_min=1,
- port_range_max=65535))
- sg_rules.append(
- SecurityGroupRuleConfig(
- sec_grp_name="orchestra-sec-group-allowall",
- direction=Direction.ingress,
- protocol=Protocol.icmp))
- sg_rules.append(
- SecurityGroupRuleConfig(
- sec_grp_name="orchestra-sec-group-allowall",
- direction=Direction.egress,
- protocol=Protocol.icmp))
- security_group = OpenStackSecurityGroup(
- self.snaps_creds,
- SecurityGroupConfig(
- name="orchestra-sec-group-allowall",
- rule_settings=sg_rules))
-
- security_group_info = security_group.create()
- self.created_resources.append(security_group)
- self.mano['details']['sec_group'] = security_group_info.name
- self.logger.info(
- "Security group orchestra-sec-group-allowall prepared")
-
- def prepare_flavor(self):
- """Create Open Baton flavor if it doesn't exist yet"""
- self.logger.info(
- "Create Flavor for Open Baton NFVO if not yet existing")
-
- flavor_settings = FlavorConfig(
- name=self.mano['requirements']['flavor']['name'],
- ram=self.mano['requirements']['flavor']['ram_min'],
- disk=self.mano['requirements']['flavor']['disk'],
- vcpus=self.mano['requirements']['flavor']['vcpus'])
- flavor = OpenStackFlavor(self.snaps_creds, flavor_settings)
- flavor_info = flavor.create()
- self.created_resources.append(flavor)
- self.mano['details']['flavor'] = {}
- self.mano['details']['flavor']['name'] = flavor_settings.name
- self.mano['details']['flavor']['id'] = flavor_info.id
-
- def prepare_network(self):
- """Create network/subnet/router if they doen't exist yet"""
- self.logger.info(
- "Creating network/subnet/router if they doen't exist yet...")
- subnet_settings = SubnetConfig(
- name='%s_subnet' %
- self.case_name,
- cidr="192.168.100.0/24")
- network_settings = NetworkConfig(
- name='%s_net' %
- self.case_name,
- subnet_settings=[subnet_settings])
- orchestra_network = OpenStackNetwork(
- self.snaps_creds, network_settings)
- orchestra_network_info = orchestra_network.create()
- self.mano['details']['network'] = {}
- self.mano['details']['network']['id'] = orchestra_network_info.id
- self.mano['details']['network']['name'] = orchestra_network_info.name
- self.mano['details']['external_net_name'] = snaps_utils.\
- get_ext_net_name(self.snaps_creds)
- self.created_resources.append(orchestra_network)
- orchestra_router = OpenStackRouter(
- self.snaps_creds,
- RouterConfig(
- name='%s_router' %
- self.case_name,
- external_gateway=self.mano['details']['external_net_name'],
- internal_subnets=[
- subnet_settings.name]))
- orchestra_router.create()
- self.created_resources.append(orchestra_router)
- self.logger.info("Created network and router for Open Baton NFVO...")
-
- def prepare_floating_ip(self):
- """Select/Create Floating IP if it doesn't exist yet"""
- self.logger.info("Retrieving floating IP for Open Baton NFVO")
- neutron_client = snaps_utils.neutron_utils.neutron_client(
- self.snaps_creds)
- # Finding Tenant ID to check to which tenant the Floating IP belongs
- tenant_id = os_utils.get_tenant_id(
- os_utils.get_keystone_client(self.creds),
- self.tenant_name)
- # Use os_utils to retrieve complete information of Floating IPs
- floating_ips = os_utils.get_floating_ips(neutron_client)
- my_floating_ips = []
- # Filter Floating IPs with tenant id
- for floating_ip in floating_ips:
- if floating_ip.get('tenant_id') == tenant_id:
- my_floating_ips.append(floating_ip.get('floating_ip_address'))
- # Select if Floating IP exist else create new one
- if len(my_floating_ips) >= 1:
- # Get Floating IP object from snaps for clean up
- snaps_floating_ips = snaps_utils.neutron_utils.get_floating_ips(
- neutron_client)
- for my_floating_ip in my_floating_ips:
- for snaps_floating_ip in snaps_floating_ips:
- if snaps_floating_ip.ip == my_floating_ip:
- self.mano['details']['fip'] = snaps_floating_ip
- self.logger.info(
- "Selected floating IP for Open Baton NFVO %s",
- (self.mano['details']['fip'].ip))
- break
- if self.mano['details']['fip'] is not None:
- break
- else:
- self.logger.info("Creating floating IP for Open Baton NFVO")
- self.mano['details']['fip'] = snaps_utils.neutron_utils.\
- create_floating_ip(
- neutron_client,
- self.mano['details']['external_net_name'])
- self.logger.info(
- "Created floating IP for Open Baton NFVO %s",
- (self.mano['details']['fip'].ip))
-
- def get_vim_descriptor(self):
- """"Create VIM descriptor to be used for onboarding"""
- self.logger.info(
- "Building VIM descriptor with PoP creds: %s",
- self.creds)
- # Depending on API version either tenant ID or project name must be
- # used
- if os_utils.is_keystone_v3():
- self.logger.info(
- "Using v3 API of OpenStack... -> Using OS_PROJECT_ID")
- project_id = os_utils.get_tenant_id(
- os_utils.get_keystone_client(),
- self.creds.get("project_name"))
- else:
- self.logger.info(
- "Using v2 API of OpenStack... -> Using OS_TENANT_NAME")
- project_id = self.creds.get("tenant_name")
- self.logger.debug("VIM project/tenant id: %s", project_id)
- vim_json = {
- "name": "vim-instance",
- "authUrl": self.creds.get("auth_url"),
- "tenant": project_id,
- "username": self.creds.get("username"),
- "password": self.creds.get("password"),
- "securityGroups": [
- self.mano['details']['sec_group']
- ],
- "type": "openstack",
- "location": {
- "name": "opnfv",
- "latitude": "52.525876",
- "longitude": "13.314400"
- }
- }
- self.logger.info("Built VIM descriptor: %s", vim_json)
- return vim_json
-
- def deploy_orchestrator(self):
- self.logger.info("Deploying Open Baton...")
- self.logger.info("Details: %s", self.mano['details'])
- start_time = time.time()
-
- self.logger.info("Creating orchestra instance...")
- userdata = get_userdata(self.mano)
- self.logger.info("flavor: %s\n"
- "image: %s\n"
- "network_id: %s\n",
- self.mano['details']['flavor']['name'],
- self.mano['requirements']['image'],
- self.mano['details']['network']['id'])
- self.logger.debug("userdata: %s\n", userdata)
- # setting up image
- image_settings = ImageConfig(
- name=self.mano['requirements']['image'],
- image_user='ubuntu',
- exists=True)
- # setting up port
- port_settings = PortConfig(
- name='%s_port' % self.case_name,
- network_name=self.mano['details']['network']['name'])
- # build configuration of vm
- orchestra_settings = VmInstanceConfig(
- name=self.case_name,
- flavor=self.mano['details']['flavor']['name'],
- port_settings=[port_settings],
- security_group_names=[self.mano['details']['sec_group']],
- userdata=str(userdata))
- orchestra_vm = OpenStackVmInstance(self.snaps_creds,
- orchestra_settings,
- image_settings)
-
- orchestra_vm.create()
- self.created_resources.append(orchestra_vm)
- self.mano['details']['id'] = orchestra_vm.get_vm_info()['id']
- self.logger.info(
- "Created orchestra instance: %s",
- self.mano['details']['id'])
-
- self.logger.info("Associating floating ip: '%s' to VM '%s' ",
- self.mano['details']['fip'].ip,
- self.case_name)
- nova_client = os_utils.get_nova_client()
- if not os_utils.add_floating_ip(
- nova_client,
- self.mano['details']['id'],
- self.mano['details']['fip'].ip):
- duration = time.time() - start_time
- self.details["orchestrator"].update(
- status='FAIL', duration=duration)
- self.logger.error("Cannot associate floating IP to VM.")
- return False
-
- self.logger.info("Waiting for Open Baton NFVO to be up and running...")
- timeout = 0
- while timeout < 20:
- if servertest(
- self.mano['details']['fip'].ip,
- "8080"):
- break
- else:
- self.logger.info(
- "Open Baton NFVO is not started yet (%ss)",
- (timeout * 60))
- time.sleep(60)
- timeout += 1
-
- if timeout >= 20:
- duration = time.time() - start_time
- self.details["orchestrator"].update(
- status='FAIL', duration=duration)
- self.logger.error("Open Baton is not started correctly")
- return False
-
- self.logger.info("Waiting for all components to be up and running...")
- time.sleep(60)
- duration = time.time() - start_time
- self.details["orchestrator"].update(status='PASS', duration=duration)
- self.logger.info("Deploy Open Baton NFVO: OK")
- return True
-
- def deploy_vnf(self):
- start_time = time.time()
- self.logger.info("Deploying %s...", self.vnf['name'])
-
- main_agent = MainAgent(
- nfvo_ip=self.mano['details']['fip'].ip,
- nfvo_port=8080,
- https=False,
- version=1,
- username=self.mano['credentials']['username'],
- password=self.mano['credentials']['password'])
-
- self.logger.info(
- "Create %s Flavor if not existing", self.vnf['name'])
- flavor_settings = FlavorConfig(
- name=self.vnf['requirements']['flavor']['name'],
- ram=self.vnf['requirements']['flavor']['ram_min'],
- disk=self.vnf['requirements']['flavor']['disk'],
- vcpus=self.vnf['requirements']['flavor']['vcpus'])
- flavor = OpenStackFlavor(self.snaps_creds, flavor_settings)
- flavor_info = flavor.create()
- self.logger.debug("Flavor id: %s", flavor_info.id)
-
- self.logger.info("Getting project 'default'...")
- project_agent = main_agent.get_agent("project", "")
- for project in json.loads(project_agent.find()):
- if project.get("name") == "default":
- self.mano['details']['project_id'] = project.get("id")
- self.logger.info("Found project 'default': %s", project)
- break
-
- vim_json = self.get_vim_descriptor()
- self.logger.info("Registering VIM: %s", vim_json)
-
- main_agent.get_agent(
- "vim", project_id=self.mano['details']['project_id']).create(
- entity=json.dumps(vim_json))
-
- market_agent = main_agent.get_agent(
- "market", project_id=self.mano['details']['project_id'])
-
- try:
- self.logger.info("sending: %s", self.vnf['descriptor']['url'])
- nsd = market_agent.create(entity=self.vnf['descriptor']['url'])
- if nsd.get('id') is None:
- self.logger.error("NSD not onboarded correctly")
- duration = time.time() - start_time
- self.details["vnf"].update(status='FAIL', duration=duration)
- return False
- self.mano['details']['nsd_id'] = nsd.get('id')
- self.logger.info("Onboarded NSD: " + nsd.get("name"))
-
- nsr_agent = main_agent.get_agent(
- "nsr", project_id=self.mano['details']['project_id'])
-
- self.mano['details']['nsr'] = nsr_agent.create(
- self.mano['details']['nsd_id'])
- except NfvoException as exc:
- self.logger.error(exc.message)
- duration = time.time() - start_time
- self.details["vnf"].update(status='FAIL', duration=duration)
- return False
-
- if self.mano['details']['nsr'].get('code') is not None:
- self.logger.error(
- "%s cannot be deployed: %s -> %s",
- self.vnf['name'],
- self.mano['details']['nsr'].get('code'),
- self.mano['details']['nsr'].get('message'))
- self.logger.error("%s cannot be deployed", self.vnf['name'])
- duration = time.time() - start_time
- self.details["vnf"].update(status='FAIL', duration=duration)
- return False
-
- timeout = 0
- self.logger.info("Waiting for NSR to go to ACTIVE...")
- while self.mano['details']['nsr'].get("status") != 'ACTIVE' \
- and self.mano['details']['nsr'].get("status") != 'ERROR':
- timeout += 1
- self.logger.info("NSR is not yet ACTIVE... (%ss)", 60 * timeout)
- if timeout == 30:
- self.logger.error("INACTIVE NSR after %s sec..", 60 * timeout)
- duration = time.time() - start_time
- self.details["vnf"].update(status='FAIL', duration=duration)
- return False
- time.sleep(60)
- self.mano['details']['nsr'] = json.loads(
- nsr_agent.find(self.mano['details']['nsr'].get('id')))
-
- duration = time.time() - start_time
- if self.mano['details']['nsr'].get("status") == 'ACTIVE':
- self.details["vnf"].update(status='PASS', duration=duration)
- self.logger.info("Sleep for 60s to ensure that all "
- "services are up and running...")
- time.sleep(60)
- result = True
- else:
- self.details["vnf"].update(status='FAIL', duration=duration)
- self.logger.error("NSR: %s", self.mano['details'].get('nsr'))
- result = False
- return result
-
- def test_vnf(self):
- self.logger.info(
- "Testing VNF Clearwater IMS is not yet implemented...")
- start_time = time.time()
-
- duration = time.time() - start_time
- self.details["test_vnf"].update(status='PASS', duration=duration)
- self.logger.info("Test VNF: OK")
- return True
-
- def clean(self):
- self.logger.info("Cleaning %s...", self.case_name)
- try:
- main_agent = MainAgent(
- nfvo_ip=self.mano['details']['fip'].ip,
- nfvo_port=8080,
- https=False,
- version=1,
- username=self.mano['credentials']['username'],
- password=self.mano['credentials']['password'])
- self.logger.info("Terminating %s...", self.vnf['name'])
- if (self.mano['details'].get('nsr')):
- main_agent.get_agent(
- "nsr",
- project_id=self.mano['details']['project_id']).delete(
- self.mano['details']['nsr'].get('id'))
- self.logger.info("Sleeping 60 seconds...")
- time.sleep(60)
- else:
- self.logger.info("No need to terminate the VNF...")
- # os_utils.delete_instance(nova_client=os_utils.get_nova_client(),
- # instance_id=self.mano_instance_id)
- except (NfvoException, KeyError) as exc:
- self.logger.error('Unexpected error cleaning - %s', exc)
-
- try:
- neutron_client = os_utils.get_neutron_client(self.creds)
- self.logger.info("Deleting Open Baton Port...")
- port = snaps_utils.neutron_utils.get_port(
- neutron_client,
- port_name='%s_port' % self.case_name)
- snaps_utils.neutron_utils.delete_port(neutron_client, port)
- time.sleep(10)
- except Exception as exc: # pylint: disable=broad-except
- self.logger.error('Unexpected error cleaning - %s', exc)
- try:
- self.logger.info("Deleting Open Baton Floating IP...")
- snaps_utils.neutron_utils.delete_floating_ip(
- neutron_client, self.mano['details']['fip'])
- except Exception as exc: # pylint: disable=broad-except
- self.logger.error('Unexpected error cleaning - %s', exc)
-
- for resource in reversed(self.created_resources):
- try:
- self.logger.info("Cleaning %s", str(resource))
- resource.clean()
- except Exception as exc: # pylint: disable=broad-except
- self.logger.error('Unexpected error cleaning - %s', exc)
- super(ClearwaterImsVnf, self).clean()
diff --git a/functest/opnfv_tests/vnf/ims/orchestra_openims.py b/functest/opnfv_tests/vnf/ims/orchestra_openims.py
deleted file mode 100644
index d609a0fba..000000000
--- a/functest/opnfv_tests/vnf/ims/orchestra_openims.py
+++ /dev/null
@@ -1,690 +0,0 @@
-#!/usr/bin/env python
-
-# Copyright (c) 2016 Orange and others.
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-
-"""Orchestra OpenIMS testcase implementation."""
-
-import json
-import logging
-import os
-import socket
-import time
-import pkg_resources
-import yaml
-
-import functest.core.vnf as vnf
-import functest.utils.openstack_utils as os_utils
-from functest.utils.constants import CONST
-
-from org.openbaton.cli.errors.errors import NfvoException
-from org.openbaton.cli.agents.agents import MainAgent
-from snaps.config.flavor import FlavorConfig
-from snaps.config.image import ImageConfig
-from snaps.config.network import NetworkConfig, PortConfig, SubnetConfig
-from snaps.config.router import RouterConfig
-from snaps.config.security_group import (
- Direction, Protocol, SecurityGroupConfig, SecurityGroupRuleConfig)
-from snaps.config.vm_inst import VmInstanceConfig
-from snaps.openstack.utils import keystone_utils
-from snaps.openstack.create_image import OpenStackImage
-from snaps.openstack.create_flavor import OpenStackFlavor
-from snaps.openstack.create_security_group import OpenStackSecurityGroup
-from snaps.openstack.create_network import OpenStackNetwork
-from snaps.openstack.create_router import OpenStackRouter
-from snaps.openstack.create_instance import OpenStackVmInstance
-
-from functest.opnfv_tests.openstack.snaps import snaps_utils
-
-
-__author__ = "Pauls, Michael <michael.pauls@fokus.fraunhofer.de>"
-# ----------------------------------------------------------
-#
-# UTILS
-#
-# -----------------------------------------------------------
-
-
-def get_config(parameter, file_path):
- """
- Get config parameter.
-
- Returns the value of a given parameter in file.yaml
- parameter must be given in string format with dots
- Example: general.openstack.image_name
- """
- with open(file_path) as config_file:
- file_yaml = yaml.safe_load(config_file)
- config_file.close()
- value = file_yaml
- for element in parameter.split("."):
- value = value.get(element)
- if value is None:
- raise ValueError("The parameter %s is not defined in"
- " reporting.yaml", parameter)
- return value
-
-
-def servertest(host, port):
- """Method to test that a server is reachable at IP:port"""
- args = socket.getaddrinfo(host, port, socket.AF_INET, socket.SOCK_STREAM)
- for family, socktype, proto, canonname, sockaddr in args:
- sock = socket.socket(family, socktype, proto)
- try:
- sock.connect(sockaddr)
- except socket.error:
- return False
- else:
- sock.close()
- return True
-
-
-def get_userdata(orchestrator=dict):
- """Build userdata for Open Baton machine"""
- userdata = "#!/bin/bash\n"
- userdata += "echo \"Executing userdata...\"\n"
- userdata += "set -x\n"
- userdata += "set -e\n"
- userdata += "echo \"Set nameserver to '8.8.8.8'...\"\n"
- userdata += "echo \"nameserver 8.8.8.8\" >> /etc/resolv.conf\n"
- userdata += "echo \"Install curl...\"\n"
- userdata += "apt-get install curl\n"
- userdata += "echo \"Inject public key...\"\n"
- userdata += ("echo \"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCuPXrV3"
- "geeHc6QUdyUr/1Z+yQiqLcOskiEGBiXr4z76MK4abiFmDZ18OMQlc"
- "fl0p3kS0WynVgyaOHwZkgy/DIoIplONVr2CKBKHtPK+Qcme2PVnCtv"
- "EqItl/FcD+1h5XSQGoa+A1TSGgCod/DPo+pes0piLVXP8Ph6QS1k7S"
- "ic7JDeRQ4oT1bXYpJ2eWBDMfxIWKZqcZRiGPgMIbJ1iEkxbpeaAd9O"
- "4MiM9nGCPESmed+p54uYFjwEDlAJZShcAZziiZYAvMZhvAhe6USljc"
- "7YAdalAnyD/jwCHuwIrUw/lxo7UdNCmaUxeobEYyyFA1YVXzpNFZya"
- "XPGAAYIJwEq/ openbaton@opnfv\" >> /home/ubuntu/.ssh/aut"
- "horized_keys\n")
- userdata += "echo \"Download bootstrap...\"\n"
- userdata += ("curl -s %s "
- "> ./bootstrap\n" % orchestrator['bootstrap']['url'])
- userdata += ("curl -s %s" "> ./config_file\n" %
- orchestrator['bootstrap']['config']['url'])
- userdata += ("echo \"Disable usage of mysql...\"\n")
- userdata += "sed -i s/mysql=.*/mysql=no/g /config_file\n"
- userdata += ("echo \"Setting 'rabbitmq_broker_ip' to '%s'\"\n"
- % orchestrator['details']['fip'].ip)
- userdata += ("sed -i s/rabbitmq_broker_ip=localhost/rabbitmq_broker_ip"
- "=%s/g /config_file\n" % orchestrator['details']['fip'].ip)
- userdata += "echo \"Set autostart of components to 'false'\"\n"
- userdata += "export OPENBATON_COMPONENT_AUTOSTART=false\n"
- userdata += "echo \"Execute bootstrap...\"\n"
- bootstrap = "sh ./bootstrap release -configFile=./config_file"
- userdata += bootstrap + "\n"
- userdata += "echo \"Setting 'nfvo.plugin.timeout' to '300000'\"\n"
- userdata += ("echo \"nfvo.plugin.timeout=600000\" >> "
- "/etc/openbaton/openbaton-nfvo.properties\n")
- userdata += (
- "wget %s -O /etc/openbaton/openbaton-vnfm-generic-user-data.sh\n" %
- orchestrator['gvnfm']['userdata']['url'])
- userdata += "sed -i '113i"'\ \ \ \ '"sleep 60' " \
- "/etc/openbaton/openbaton-vnfm-generic-user-data.sh\n"
- userdata += ("sed -i s/nfvo.marketplace.port=8082/nfvo.marketplace."
- "port=8080/g /etc/openbaton/openbaton-nfvo.properties\n")
- userdata += "echo \"Starting NFVO\"\n"
- userdata += "service openbaton-nfvo restart\n"
- userdata += "echo \"Starting Generic VNFM\"\n"
- userdata += "service openbaton-vnfm-generic restart\n"
- userdata += "echo \"...end of userdata...\"\n"
- return userdata
-
-
-class OpenImsVnf(vnf.VnfOnBoarding):
- """OpenIMS VNF deployed with openBaton orchestrator"""
-
- # logger = logging.getLogger(__name__)
-
- def __init__(self, **kwargs):
- if "case_name" not in kwargs:
- kwargs["case_name"] = "orchestra_openims"
- super(OpenImsVnf, self).__init__(**kwargs)
- self.logger = logging.getLogger("functest.ci.run_tests.orchestra")
- self.logger.info("kwargs %s", (kwargs))
-
- self.case_dir = pkg_resources.resource_filename(
- 'functest', 'opnfv_tests/vnf/ims/')
- self.data_dir = CONST.__getattribute__('dir_ims_data')
- self.test_dir = CONST.__getattribute__('dir_repo_vims_test')
- self.created_resources = []
- self.logger.info("%s VNF onboarding test starting", self.case_name)
-
- try:
- self.config = CONST.__getattribute__(
- 'vnf_{}_config'.format(self.case_name))
- except BaseException:
- raise Exception("Orchestra VNF config file not found")
- config_file = self.case_dir + self.config
-
- self.mano = dict(
- get_config("mano", config_file),
- details={}
- )
- self.logger.debug("Orchestrator configuration %s", self.mano)
-
- self.details['orchestrator'] = dict(
- name=self.mano['name'],
- version=self.mano['version'],
- status='ERROR',
- result=''
- )
-
- self.vnf = dict(
- get_config(self.case_name, config_file),
- )
- self.logger.debug("VNF configuration: %s", self.vnf)
-
- self.details['vnf'] = dict(
- name=self.vnf['name'],
- )
-
- self.details['test_vnf'] = dict(
- name=self.case_name,
- )
-
- # Orchestra base Data directory creation
- if not os.path.exists(self.data_dir):
- os.makedirs(self.data_dir)
-
- self.images = get_config("tenant_images.orchestrator", config_file)
- self.images.update(get_config("tenant_images.%s" %
- self.case_name, config_file))
-
- def prepare(self):
- """Prepare testscase (Additional pre-configuration steps)."""
- super(OpenImsVnf, self).prepare()
-
- public_auth_url = keystone_utils.get_endpoint(
- self.snaps_creds, 'identity')
-
- self.logger.info("Additional pre-configuration steps")
- self.creds = {
- "tenant": self.tenant_name,
- "username": self.tenant_name,
- "password": self.tenant_name,
- "auth_url": public_auth_url
- }
- self.prepare_images()
- self.prepare_flavor()
- self.prepare_security_groups()
- self.prepare_network()
- self.prepare_floating_ip()
-
- def prepare_images(self):
- """Upload images if they doen't exist yet"""
- self.logger.info("Upload images if they doen't exist yet")
- for image_name, image_file in self.images.iteritems():
- self.logger.info("image: %s, file: %s", image_name, image_file)
- if image_file and image_name:
- image = OpenStackImage(
- self.snaps_creds,
- ImageConfig(name=image_name,
- image_user='cloud',
- img_format='qcow2',
- image_file=image_file,
- public=True))
- image.create()
- # self.created_resources.append(image);
-
- def prepare_security_groups(self):
- """Create Open Baton security group if it doesn't exist yet"""
- self.logger.info(
- "Creating security group for Open Baton if not yet existing...")
- sg_rules = list()
- sg_rules.append(
- SecurityGroupRuleConfig(
- sec_grp_name="orchestra-sec-group-allowall",
- direction=Direction.ingress,
- protocol=Protocol.tcp,
- port_range_min=1,
- port_range_max=65535))
- sg_rules.append(
- SecurityGroupRuleConfig(
- sec_grp_name="orchestra-sec-group-allowall",
- direction=Direction.egress,
- protocol=Protocol.tcp,
- port_range_min=1,
- port_range_max=65535))
- sg_rules.append(
- SecurityGroupRuleConfig(
- sec_grp_name="orchestra-sec-group-allowall",
- direction=Direction.ingress,
- protocol=Protocol.udp,
- port_range_min=1,
- port_range_max=65535))
- sg_rules.append(
- SecurityGroupRuleConfig(
- sec_grp_name="orchestra-sec-group-allowall",
- direction=Direction.egress,
- protocol=Protocol.udp,
- port_range_min=1,
- port_range_max=65535))
- security_group = OpenStackSecurityGroup(
- self.snaps_creds,
- SecurityGroupConfig(
- name="orchestra-sec-group-allowall",
- rule_settings=sg_rules))
-
- security_group_info = security_group.create()
- self.created_resources.append(security_group)
- self.mano['details']['sec_group'] = security_group_info.name
- self.logger.info(
- "Security group orchestra-sec-group-allowall prepared")
-
- def prepare_flavor(self):
- """Create Open Baton flavor if it doesn't exist yet"""
- self.logger.info(
- "Create Flavor for Open Baton NFVO if not yet existing")
-
- flavor_settings = FlavorConfig(
- name=self.mano['requirements']['flavor']['name'],
- ram=self.mano['requirements']['flavor']['ram_min'],
- disk=self.mano['requirements']['flavor']['disk'],
- vcpus=self.mano['requirements']['flavor']['vcpus'])
- flavor = OpenStackFlavor(self.snaps_creds, flavor_settings)
- flavor_info = flavor.create()
- self.created_resources.append(flavor)
- self.mano['details']['flavor'] = {}
- self.mano['details']['flavor']['name'] = flavor_settings.name
- self.mano['details']['flavor']['id'] = flavor_info.id
-
- def prepare_network(self):
- """Create network/subnet/router if they doen't exist yet"""
- self.logger.info(
- "Creating network/subnet/router if they doen't exist yet...")
- subnet_settings = SubnetConfig(
- name='%s_subnet' %
- self.case_name,
- cidr="192.168.100.0/24")
- network_settings = NetworkConfig(
- name='%s_net' %
- self.case_name,
- subnet_settings=[subnet_settings])
- orchestra_network = OpenStackNetwork(
- self.snaps_creds, network_settings)
- orchestra_network_info = orchestra_network.create()
- self.mano['details']['network'] = {}
- self.mano['details']['network']['id'] = orchestra_network_info.id
- self.mano['details']['network']['name'] = orchestra_network_info.name
- self.mano['details']['external_net_name'] = \
- snaps_utils.get_ext_net_name(self.snaps_creds)
- self.created_resources.append(orchestra_network)
- orchestra_router = OpenStackRouter(
- self.snaps_creds,
- RouterConfig(
- name='%s_router' %
- self.case_name,
- external_gateway=self.mano['details']['external_net_name'],
- internal_subnets=[
- subnet_settings.name]))
- orchestra_router.create()
- self.created_resources.append(orchestra_router)
- self.logger.info("Created network and router for Open Baton NFVO...")
-
- def prepare_floating_ip(self):
- """Select/Create Floating IP if it doesn't exist yet"""
- self.logger.info("Retrieving floating IP for Open Baton NFVO")
- neutron_client = snaps_utils.neutron_utils.neutron_client(
- self.snaps_creds)
- # Finding Tenant ID to check to which tenant the Floating IP belongs
- tenant_id = os_utils.get_tenant_id(
- os_utils.get_keystone_client(self.creds),
- self.tenant_name)
- # Use os_utils to retrieve complete information of Floating IPs
- floating_ips = os_utils.get_floating_ips(neutron_client)
- my_floating_ips = []
- # Filter Floating IPs with tenant id
- for floating_ip in floating_ips:
- # self.logger.info("Floating IP: %s", floating_ip)
- if floating_ip.get('tenant_id') == tenant_id:
- my_floating_ips.append(floating_ip.get('floating_ip_address'))
- # Select if Floating IP exist else create new one
- if len(my_floating_ips) >= 1:
- # Get Floating IP object from snaps for clean up
- snaps_floating_ips = snaps_utils.neutron_utils.get_floating_ips(
- neutron_client)
- for my_floating_ip in my_floating_ips:
- for snaps_floating_ip in snaps_floating_ips:
- if snaps_floating_ip.ip == my_floating_ip:
- self.mano['details']['fip'] = snaps_floating_ip
- self.logger.info(
- "Selected floating IP for Open Baton NFVO %s",
- (self.mano['details']['fip'].ip))
- break
- if self.mano['details']['fip'] is not None:
- break
- else:
- self.logger.info("Creating floating IP for Open Baton NFVO")
- self.mano['details']['fip'] = (
- snaps_utils.neutron_utils. create_floating_ip(
- neutron_client, self.mano['details']['external_net_name']))
- self.logger.info(
- "Created floating IP for Open Baton NFVO %s",
- (self.mano['details']['fip'].ip))
-
- def get_vim_descriptor(self):
- """"Create VIM descriptor to be used for onboarding"""
- self.logger.info(
- "Building VIM descriptor with PoP creds: %s",
- self.creds)
- # Depending on API version either tenant ID or project name must be
- # used
- if os_utils.is_keystone_v3():
- self.logger.info(
- "Using v3 API of OpenStack... -> Using OS_PROJECT_ID")
- project_id = os_utils.get_tenant_id(
- os_utils.get_keystone_client(),
- self.creds.get("project_name"))
- else:
- self.logger.info(
- "Using v2 API of OpenStack... -> Using OS_TENANT_NAME")
- project_id = self.creds.get("tenant_name")
- self.logger.debug("VIM project/tenant id: %s", project_id)
- vim_json = {
- "name": "vim-instance",
- "authUrl": self.creds.get("auth_url"),
- "tenant": project_id,
- "username": self.creds.get("username"),
- "password": self.creds.get("password"),
- "securityGroups": [
- self.mano['details']['sec_group']
- ],
- "type": "openstack",
- "location": {
- "name": "opnfv",
- "latitude": "52.525876",
- "longitude": "13.314400"
- }
- }
- self.logger.info("Built VIM descriptor: %s", vim_json)
- return vim_json
-
- def deploy_orchestrator(self):
- self.logger.info("Deploying Open Baton...")
- self.logger.info("Details: %s", self.mano['details'])
- start_time = time.time()
-
- self.logger.info("Creating orchestra instance...")
- userdata = get_userdata(self.mano)
- self.logger.info("flavor: %s\n"
- "image: %s\n"
- "network_id: %s\n",
- self.mano['details']['flavor']['name'],
- self.mano['requirements']['image'],
- self.mano['details']['network']['id'])
- self.logger.debug("userdata: %s\n", userdata)
- # setting up image
- image_settings = ImageConfig(
- name=self.mano['requirements']['image'],
- image_user='ubuntu',
- exists=True)
- # setting up port
- port_settings = PortConfig(
- name='%s_port' % self.case_name,
- network_name=self.mano['details']['network']['name'])
- # build configuration of vm
- orchestra_settings = VmInstanceConfig(
- name=self.case_name,
- flavor=self.mano['details']['flavor']['name'],
- port_settings=[port_settings],
- security_group_names=[self.mano['details']['sec_group']],
- userdata=str(userdata))
- orchestra_vm = OpenStackVmInstance(self.snaps_creds,
- orchestra_settings,
- image_settings)
-
- orchestra_vm.create()
- self.created_resources.append(orchestra_vm)
- self.mano['details']['id'] = orchestra_vm.get_vm_info()['id']
- self.logger.info(
- "Created orchestra instance: %s",
- self.mano['details']['id'])
-
- self.logger.info("Associating floating ip: '%s' to VM '%s' ",
- self.mano['details']['fip'].ip,
- self.case_name)
- nova_client = os_utils.get_nova_client()
- if not os_utils.add_floating_ip(
- nova_client,
- self.mano['details']['id'],
- self.mano['details']['fip'].ip):
- duration = time.time() - start_time
- self.details["orchestrator"].update(
- status='FAIL', duration=duration)
- self.logger.error("Cannot associate floating IP to VM.")
- return False
-
- self.logger.info("Waiting for Open Baton NFVO to be up and running...")
- timeout = 0
- while timeout < 20:
- if servertest(
- self.mano['details']['fip'].ip,
- "8080"):
- break
- else:
- self.logger.info("Open Baton NFVO is not started yet (%ss)",
- (timeout * 60))
- time.sleep(60)
- timeout += 1
-
- if timeout >= 20:
- duration = time.time() - start_time
- self.details["orchestrator"].update(
- status='FAIL', duration=duration)
- self.logger.error("Open Baton is not started correctly")
- return False
-
- self.logger.info("Waiting for all components to be up and running...")
- time.sleep(60)
- duration = time.time() - start_time
- self.details["orchestrator"].update(status='PASS', duration=duration)
- self.logger.info("Deploy Open Baton NFVO: OK")
- return True
-
- def deploy_vnf(self):
- start_time = time.time()
- self.logger.info("Deploying %s...", self.vnf['name'])
-
- main_agent = MainAgent(
- nfvo_ip=self.mano['details']['fip'].ip,
- nfvo_port=8080,
- https=False,
- version=1,
- username=self.mano['credentials']['username'],
- password=self.mano['credentials']['password'])
-
- self.logger.info(
- "Create %s Flavor if not existing", self.vnf['name'])
- flavor_settings = FlavorConfig(
- name=self.vnf['requirements']['flavor']['name'],
- ram=self.vnf['requirements']['flavor']['ram_min'],
- disk=self.vnf['requirements']['flavor']['disk'],
- vcpus=self.vnf['requirements']['flavor']['vcpus'])
- flavor = OpenStackFlavor(self.snaps_creds, flavor_settings)
- flavor_info = flavor.create()
- self.logger.debug("Flavor id: %s", flavor_info.id)
-
- self.logger.info("Getting project 'default'...")
- project_agent = main_agent.get_agent("project", "")
- for project in json.loads(project_agent.find()):
- if project.get("name") == "default":
- self.mano['details']['project_id'] = project.get("id")
- self.logger.info("Found project 'default': %s", project)
- break
-
- vim_json = self.get_vim_descriptor()
- self.logger.info("Registering VIM: %s", vim_json)
-
- main_agent.get_agent(
- "vim", project_id=self.mano['details']['project_id']).create(
- entity=json.dumps(vim_json))
-
- market_agent = main_agent.get_agent(
- "market", project_id=self.mano['details']['project_id'])
-
- try:
- self.logger.info("sending: %s", self.vnf['descriptor']['url'])
- nsd = market_agent.create(entity=self.vnf['descriptor']['url'])
- if nsd.get('id') is None:
- self.logger.error("NSD not onboarded correctly")
- duration = time.time() - start_time
- self.details["vnf"].update(status='FAIL', duration=duration)
- return False
- self.mano['details']['nsd_id'] = nsd.get('id')
- self.logger.info("Onboarded NSD: " + nsd.get("name"))
-
- nsr_agent = main_agent.get_agent(
- "nsr", project_id=self.mano['details']['project_id'])
-
- self.mano['details']['nsr'] = nsr_agent.create(
- self.mano['details']['nsd_id'])
- except NfvoException as exc:
- self.logger.error(exc.message)
- duration = time.time() - start_time
- self.details["vnf"].update(status='FAIL', duration=duration)
- return False
-
- if self.mano['details']['nsr'].get('code') is not None:
- self.logger.error(
- "%s cannot be deployed: %s -> %s",
- self.vnf['name'],
- self.mano['details']['nsr'].get('code'),
- self.mano['details']['nsr'].get('message'))
- self.logger.error("%s cannot be deployed", self.vnf['name'])
- duration = time.time() - start_time
- self.details["vnf"].update(status='FAIL', duration=duration)
- return False
-
- timeout = 0
- self.logger.info("Waiting for NSR to go to ACTIVE...")
- while self.mano['details']['nsr'].get("status") != 'ACTIVE' \
- and self.mano['details']['nsr'].get("status") != 'ERROR':
- timeout += 1
- self.logger.info("NSR is not yet ACTIVE... (%ss)", 60 * timeout)
- if timeout == 30:
- self.logger.error("INACTIVE NSR after %s sec..", 60 * timeout)
- duration = time.time() - start_time
- self.details["vnf"].update(status='FAIL', duration=duration)
- return False
- time.sleep(60)
- self.mano['details']['nsr'] = json.loads(
- nsr_agent.find(self.mano['details']['nsr'].get('id')))
-
- duration = time.time() - start_time
- if self.mano['details']['nsr'].get("status") == 'ACTIVE':
- self.details["vnf"].update(status='PASS', duration=duration)
- self.logger.info("Sleep for 60s to ensure that all "
- "services are up and running...")
- time.sleep(60)
- result = True
- else:
- self.details["vnf"].update(status='FAIL', duration=duration)
- self.logger.error("NSR: %s", self.mano['details'].get('nsr'))
- result = False
- return result
-
- def test_vnf(self):
- self.logger.info("Testing VNF OpenIMS...")
- start_time = time.time()
- self.logger.info(
- "Testing if %s works properly...",
- self.mano['details']['nsr'].get('name'))
- for vnfr in self.mano['details']['nsr'].get('vnfr'):
- self.logger.info(
- "Checking ports %s of VNF %s",
- self.vnf['test'][vnfr.get('name')]['ports'],
- vnfr.get('name'))
- for vdu in vnfr.get('vdu'):
- for vnfci in vdu.get('vnfc_instance'):
- self.logger.debug(
- "Checking ports of VNFC instance %s",
- vnfci.get('hostname'))
- for floating_ip in vnfci.get('floatingIps'):
- self.logger.debug(
- "Testing %s:%s",
- vnfci.get('hostname'),
- floating_ip.get('ip'))
- for port in self.vnf['test'][vnfr.get(
- 'name')]['ports']:
- if servertest(floating_ip.get('ip'), port):
- self.logger.info(
- "VNFC instance %s is reachable at %s:%s",
- vnfci.get('hostname'),
- floating_ip.get('ip'),
- port)
- else:
- self.logger.error(
- "VNFC instance %s is not reachable "
- "at %s:%s",
- vnfci.get('hostname'),
- floating_ip.get('ip'),
- port)
- duration = time.time() - start_time
- self.details["test_vnf"].update(
- status='FAIL', duration=duration, esult=(
- "Port %s of server %s -> %s is "
- "not reachable",
- port,
- vnfci.get('hostname'),
- floating_ip.get('ip')))
- self.logger.error("Test VNF: ERROR")
- return False
- duration = time.time() - start_time
- self.details["test_vnf"].update(status='PASS', duration=duration)
- self.logger.info("Test VNF: OK")
- return True
-
- def clean(self):
- self.logger.info("Cleaning %s...", self.case_name)
- try:
- main_agent = MainAgent(
- nfvo_ip=self.mano['details']['fip'].ip,
- nfvo_port=8080,
- https=False,
- version=1,
- username=self.mano['credentials']['username'],
- password=self.mano['credentials']['password'])
- self.logger.info("Terminating %s...", self.vnf['name'])
- if (self.mano['details'].get('nsr')):
- main_agent.get_agent(
- "nsr",
- project_id=self.mano['details']['project_id']).\
- delete(self.mano['details']['nsr'].get('id'))
- self.logger.info("Sleeping 60 seconds...")
- time.sleep(60)
- else:
- self.logger.info("No need to terminate the VNF...")
- except (NfvoException, KeyError) as exc:
- self.logger.error('Unexpected error cleaning - %s', exc)
-
- try:
- neutron_client = os_utils.get_neutron_client(self.creds)
- self.logger.info("Deleting Open Baton Port...")
- port = snaps_utils.neutron_utils.get_port(
- neutron_client,
- port_name='%s_port' % self.case_name)
- snaps_utils.neutron_utils.delete_port(neutron_client, port)
- time.sleep(10)
- except Exception as exc: # pylint: disable=broad-except
- self.logger.error('Unexpected error cleaning - %s', exc)
- try:
- self.logger.info("Deleting Open Baton Floating IP...")
- snaps_utils.neutron_utils.delete_floating_ip(
- neutron_client, self.mano['details']['fip'])
- except Exception as exc: # pylint: disable=broad-except
- self.logger.error('Unexpected error cleaning - %s', exc)
-
- for resource in reversed(self.created_resources):
- try:
- self.logger.info("Cleaning %s", str(resource))
- resource.clean()
- except Exception as exc:
- self.logger.error('Unexpected error cleaning - %s', exc)
- super(OpenImsVnf, self).clean()
diff --git a/functest/opnfv_tests/vnf/router/cloudify_vrouter.py b/functest/opnfv_tests/vnf/router/cloudify_vrouter.py
index f2cd63fb2..32d675347 100644
--- a/functest/opnfv_tests/vnf/router/cloudify_vrouter.py
+++ b/functest/opnfv_tests/vnf/router/cloudify_vrouter.py
@@ -7,352 +7,197 @@
# which accompanies this distribution, and is available at
# http://www.apache.org/licenses/LICENSE-2.0
+# pylint: disable=missing-docstring
+
"""vrouter testcase implementation."""
import logging
import os
import time
-from cloudify_rest_client import CloudifyClient
-from cloudify_rest_client.executions import Execution
-from scp import SCPClient
-import yaml
+import pkg_resources
-from functest.opnfv_tests.openstack.snaps import snaps_utils
-import functest.opnfv_tests.vnf.router.vrouter_base as vrouter_base
+from functest.core import cloudify
+from functest.opnfv_tests.vnf.router import vrouter_base
from functest.opnfv_tests.vnf.router.utilvnf import Utilvnf
-from functest.utils.constants import CONST
+from functest.utils import config
+from functest.utils import env
+from functest.utils import functest_utils
-from git import Repo
-from snaps.config.flavor import FlavorConfig
-from snaps.config.image import ImageConfig
-from snaps.config.keypair import KeypairConfig
-from snaps.config.network import NetworkConfig, PortConfig, SubnetConfig
-from snaps.config.router import RouterConfig
-from snaps.config.security_group import (
- Direction, Protocol, SecurityGroupConfig, SecurityGroupRuleConfig)
-from snaps.config.vm_inst import FloatingIpConfig, VmInstanceConfig
+__author__ = "Shuya Nakama <shuya.nakama@okinawaopenlabs.org>"
-from snaps.openstack.create_flavor import OpenStackFlavor
-from snaps.openstack.create_image import OpenStackImage
-from snaps.openstack.create_instance import OpenStackVmInstance
-from snaps.openstack.create_keypairs import OpenStackKeypair
-from snaps.openstack.create_network import OpenStackNetwork
-from snaps.openstack.create_security_group import OpenStackSecurityGroup
-from snaps.openstack.create_router import OpenStackRouter
-import snaps.openstack.utils.glance_utils as glance_utils
-from snaps.openstack.utils import keystone_utils
+class CloudifyVrouter(cloudify.Cloudify):
+ # pylint: disable=too-many-instance-attributes
+ """vrouter testcase deployed with Cloudify Orchestrator."""
+ __logger = logging.getLogger(__name__)
-__author__ = "Shuya Nakama <shuya.nakama@okinawaopenlabs.org>"
+ filename_alt = '/home/opnfv/functest/images/vyos-1.1.8-amd64.qcow2'
+ flavor_alt_ram = 1024
+ flavor_alt_vcpus = 1
+ flavor_alt_disk = 3
-class CloudifyVrouter(vrouter_base.VrouterOnBoardingBase):
- """vrouter testcase deployed with Cloudify Orchestrator."""
+ check_console_loop = 12
- __logger = logging.getLogger(__name__)
- name = __name__
+ cop_yaml = ("https://github.com/cloudify-cosmo/cloudify-openstack-plugin/"
+ "releases/download/2.14.7/plugin.yaml")
+ cop_wgn = ("https://github.com/cloudify-cosmo/cloudify-openstack-plugin/"
+ "releases/download/2.14.7/cloudify_openstack_plugin-2.14.7-py27"
+ "-none-linux_x86_64-centos-Core.wgn")
def __init__(self, **kwargs):
if "case_name" not in kwargs:
kwargs["case_name"] = "vyos_vrouter"
- super(CloudifyVrouter, self).__init__(**kwargs)
+ super().__init__(**kwargs)
# Retrieve the configuration
try:
- self.config = CONST.__getattribute__(
- 'vnf_{}_config'.format(self.case_name))
- except Exception:
- raise Exception("VNF config file not found")
-
- self.snaps_creds = ''
- self.created_object = []
-
- self.cfy_manager_ip = ''
- self.util_info = {}
- self.deployment_name = ''
+ self.config = getattr(
+ config.CONF, f'vnf_{self.case_name}_config')
+ except Exception as exc:
+ raise Exception("VNF config file not found") from exc
+ self.case_dir = pkg_resources.resource_filename(
+ 'functest', 'opnfv_tests/vnf/router')
config_file = os.path.join(self.case_dir, self.config)
self.orchestrator = dict(
- requirements=get_config("orchestrator.requirements", config_file),
+ requirements=functest_utils.get_parameter_from_yaml(
+ "orchestrator.requirements", config_file),
)
self.details['orchestrator'] = dict(
- name=get_config("orchestrator.name", config_file),
- version=get_config("orchestrator.version", config_file),
+ name=functest_utils.get_parameter_from_yaml(
+ "orchestrator.name", config_file),
+ version=functest_utils.get_parameter_from_yaml(
+ "orchestrator.version", config_file),
status='ERROR',
result=''
)
self.__logger.debug("Orchestrator configuration %s", self.orchestrator)
- self.__logger.debug("name = %s", self.name)
+ self.__logger.debug("name = %s", __name__)
self.vnf = dict(
- descriptor=get_config("vnf.descriptor", config_file),
- inputs=get_config("vnf.inputs", config_file),
- requirements=get_config("vnf.requirements", config_file)
+ descriptor=functest_utils.get_parameter_from_yaml(
+ "vnf.descriptor", config_file),
+ inputs=functest_utils.get_parameter_from_yaml(
+ "vnf.inputs", config_file),
+ requirements=functest_utils.get_parameter_from_yaml(
+ "vnf.requirements", config_file)
)
self.details['vnf'] = dict(
descriptor_version=self.vnf['descriptor']['version'],
- name=get_config("vnf.name", config_file),
- version=get_config("vnf.version", config_file),
+ name=functest_utils.get_parameter_from_yaml(
+ "vnf.name", config_file),
+ version=functest_utils.get_parameter_from_yaml(
+ "vnf.version", config_file),
)
self.__logger.debug("VNF configuration: %s", self.vnf)
self.util = Utilvnf()
+ self.util.set_credentials(self.cloud)
+ credentials = {"cloud": self.cloud}
+ self.util_info = {"credentials": credentials,
+ "vnf_data_dir": self.util.vnf_data_dir}
self.details['test_vnf'] = dict(
- name=get_config("vnf_test_suite.name", config_file),
- version=get_config("vnf_test_suite.version", config_file)
+ name=functest_utils.get_parameter_from_yaml(
+ "vnf_test_suite.name", config_file),
+ version=functest_utils.get_parameter_from_yaml(
+ "vnf_test_suite.version", config_file)
)
- self.images = get_config("tenant_images", config_file)
+ self.images = functest_utils.get_parameter_from_yaml(
+ "tenant_images", config_file)
self.__logger.info("Images needed for vrouter: %s", self.images)
- def prepare(self):
- super(CloudifyVrouter, self).prepare()
-
- self.__logger.info("Additional pre-configuration steps")
+ self.image_alt = None
+ self.flavor_alt = None
- self.util.set_credentials(self.snaps_creds)
+ def check_requirements(self):
+ if env.get('NEW_USER_ROLE').lower() == "admin":
+ self.__logger.warning(
+ "Defining NEW_USER_ROLE=admin will easily break the testcase "
+ "because Cloudify doesn't manage tenancy (e.g. subnet "
+ "overlapping)")
- # needs some images
- self.__logger.info("Upload some OS images if it doesn't exist")
- for image_name, image_file in self.images.iteritems():
- self.__logger.info("image: %s, file: %s", image_name, image_file)
- if image_file and image_name:
- image_creator = OpenStackImage(
- self.snaps_creds,
- ImageConfig(name=image_name,
- image_user='cloud',
- img_format='qcow2',
- image_file=image_file))
- image_creator.create()
- self.created_object.append(image_creator)
-
- def deploy_orchestrator(self):
+ def execute(self):
+ # pylint: disable=too-many-locals,too-many-statements
"""
Deploy Cloudify Manager.
network, security group, fip, VM creation
"""
# network creation
-
+ super().execute()
start_time = time.time()
- self.__logger.info("Creating keypair ...")
- kp_file = os.path.join(self.data_dir, "cloudify_vrouter.pem")
- keypair_settings = KeypairConfig(name='cloudify_vrouter_kp',
- private_filepath=kp_file)
- keypair_creator = OpenStackKeypair(self.snaps_creds, keypair_settings)
- keypair_creator.create()
- self.created_object.append(keypair_creator)
-
- self.__logger.info("Creating full network ...")
- subnet_settings = SubnetConfig(name='cloudify_vrouter_subnet',
- cidr='10.67.79.0/24')
- network_settings = NetworkConfig(name='cloudify_vrouter_network',
- subnet_settings=[subnet_settings])
- network_creator = OpenStackNetwork(self.snaps_creds, network_settings)
- network_creator.create()
- self.created_object.append(network_creator)
- ext_net_name = snaps_utils.get_ext_net_name(self.snaps_creds)
- router_creator = OpenStackRouter(
- self.snaps_creds,
- RouterConfig(
- name='cloudify_vrouter_router',
- external_gateway=ext_net_name,
- internal_subnets=[subnet_settings.name]))
- router_creator.create()
- self.created_object.append(router_creator)
-
- # security group creation
- self.__logger.info("Creating security group for cloudify manager vm")
- sg_rules = list()
- sg_rules.append(
- SecurityGroupRuleConfig(sec_grp_name="sg-cloudify-manager",
- direction=Direction.ingress,
- protocol=Protocol.tcp, port_range_min=1,
- port_range_max=65535))
- sg_rules.append(
- SecurityGroupRuleConfig(sec_grp_name="sg-cloudify-manager",
- direction=Direction.ingress,
- protocol=Protocol.udp, port_range_min=1,
- port_range_max=65535))
-
- security_group_creator = OpenStackSecurityGroup(
- self.snaps_creds,
- SecurityGroupConfig(
- name="sg-cloudify-manager",
- rule_settings=sg_rules))
-
- security_group_creator.create()
- self.created_object.append(security_group_creator)
-
- # orchestrator VM flavor
- self.__logger.info("Get or create flavor for cloudify manager vm ...")
-
- flavor_settings = FlavorConfig(
- name=self.orchestrator['requirements']['flavor']['name'],
- ram=self.orchestrator['requirements']['flavor']['ram_min'],
- disk=50,
- vcpus=2)
- flavor_creator = OpenStackFlavor(self.snaps_creds, flavor_settings)
- flavor_creator.create()
- self.created_object.append(flavor_creator)
- image_settings = ImageConfig(
- name=self.orchestrator['requirements']['os_image'],
- image_user='centos',
- exists=True)
-
- port_settings = PortConfig(name='cloudify_manager_port',
- network_name=network_settings.name)
-
- manager_settings = VmInstanceConfig(
- name='cloudify_manager',
- flavor=flavor_settings.name,
- port_settings=[port_settings],
- security_group_names=[
- security_group_creator.sec_grp_settings.name],
- floating_ip_settings=[FloatingIpConfig(
- name='cloudify_manager_fip',
- port_name=port_settings.name,
- router_name=router_creator.router_settings.name)])
-
- manager_creator = OpenStackVmInstance(self.snaps_creds,
- manager_settings,
- image_settings,
- keypair_settings)
-
- self.__logger.info("Creating cloudify manager VM")
- manager_creator.create()
- self.created_object.append(manager_creator)
-
- public_auth_url = keystone_utils.get_endpoint(
- self.snaps_creds, 'identity')
-
- self.__logger.info("Set creds for cloudify manager")
- cfy_creds = dict(keystone_username=self.tenant_name,
- keystone_password=self.tenant_name,
- keystone_tenant_name=self.tenant_name,
- keystone_url=public_auth_url)
-
- cfy_client = CloudifyClient(host=manager_creator.get_floating_ip().ip,
- username='admin',
- password='admin',
- tenant='default_tenant')
-
- self.orchestrator['object'] = cfy_client
-
- self.cfy_manager_ip = manager_creator.get_floating_ip().ip
-
- self.__logger.info("Attemps running status of the Manager")
- cfy_status = None
- retry = 10
- while str(cfy_status) != 'running' and retry:
- try:
- cfy_status = cfy_client.manager.get_status()['status']
- self.__logger.debug("The current manager status is %s",
- cfy_status)
- except Exception: # pylint: disable=broad-except
- self.__logger.warning("Cloudify Manager isn't " +
- "up and running. Retrying ...")
- retry = retry - 1
- time.sleep(30)
-
- if str(cfy_status) == 'running':
- self.__logger.info("Cloudify Manager is up and running")
- else:
- raise Exception("Cloudify Manager isn't up and running")
+ self.put_private_key()
+ self.upload_cfy_plugins(self.cop_yaml, self.cop_wgn)
- self.__logger.info("Put OpenStack creds in manager")
- secrets_list = cfy_client.secrets.list()
- for k, val in cfy_creds.iteritems():
- if not any(d.get('key', None) == k for d in secrets_list):
- cfy_client.secrets.create(k, val)
- else:
- cfy_client.secrets.update(k, val)
+ self.image_alt = self.publish_image_alt()
+ self.flavor_alt = self.create_flavor_alt()
duration = time.time() - start_time
-
- self.__logger.info("Put private keypair in manager")
- if manager_creator.vm_ssh_active(block=True):
- ssh = manager_creator.ssh_client()
- scp = SCPClient(ssh.get_transport(), socket_timeout=15.0)
- scp.put(kp_file, '~/')
- cmd = "sudo cp ~/cloudify_vrouter.pem /etc/cloudify/"
- run_blocking_ssh_command(ssh, cmd)
- cmd = "sudo chmod 444 /etc/cloudify/cloudify_vrouter.pem"
- run_blocking_ssh_command(ssh, cmd)
- cmd = "sudo yum install -y gcc python-devel"
- run_blocking_ssh_command(
- ssh, cmd, "Unable to install packages on manager")
-
self.details['orchestrator'].update(status='PASS', duration=duration)
- self.vnf['inputs'].update(dict(external_network_name=ext_net_name))
-
- return True
+ self.vnf['inputs'].update(dict(
+ external_network_name=self.ext_net.name))
+ self.vnf['inputs'].update(dict(
+ target_vnf_image_id=self.image_alt.id))
+ self.vnf['inputs'].update(dict(
+ reference_vnf_image_id=self.image_alt.id))
+ self.vnf['inputs'].update(dict(
+ target_vnf_flavor_id=self.flavor_alt.id))
+ self.vnf['inputs'].update(dict(
+ reference_vnf_flavor_id=self.flavor_alt.id))
+ self.vnf['inputs'].update(dict(
+ keystone_username=self.project.user.name))
+ self.vnf['inputs'].update(dict(
+ keystone_password=self.project.password))
+ self.vnf['inputs'].update(dict(
+ keystone_tenant_name=self.project.project.name))
+ self.vnf['inputs'].update(dict(
+ keystone_user_domain_name=os.environ.get(
+ 'OS_USER_DOMAIN_NAME', 'Default')))
+ self.vnf['inputs'].update(dict(
+ keystone_project_domain_name=os.environ.get(
+ 'OS_PROJECT_DOMAIN_NAME', 'Default')))
+ self.vnf['inputs'].update(dict(
+ region=os.environ.get('OS_REGION_NAME', 'RegionOne')))
+ self.vnf['inputs'].update(dict(
+ keystone_url=self.get_public_auth_url(self.orig_cloud)))
+
+ if self.deploy_vnf() and self.test_vnf():
+ self.result = 100
+ return 0
+ self.result = 1/3 * 100
+ return 1
def deploy_vnf(self):
start_time = time.time()
-
self.__logger.info("Upload VNFD")
- cfy_client = self.orchestrator['object']
descriptor = self.vnf['descriptor']
- self.deployment_name = descriptor.get('name')
-
- vrouter_blueprint_dir = os.path.join(self.data_dir,
- self.util.blueprint_dir)
- if not os.path.exists(vrouter_blueprint_dir):
- Repo.clone_from(descriptor.get('url'),
- vrouter_blueprint_dir,
- branch=descriptor.get('version'))
-
- cfy_client.blueprints.upload(vrouter_blueprint_dir +
- self.util.blueprint_file_name,
- descriptor.get('name'))
-
- self.__logger.info("Get or create flavor for vrouter")
- flavor_settings = FlavorConfig(
- name=self.vnf['requirements']['flavor']['name'],
- ram=self.vnf['requirements']['flavor']['ram_min'],
- disk=25,
- vcpus=1)
- flavor_creator = OpenStackFlavor(self.snaps_creds, flavor_settings)
- flavor = flavor_creator.create()
- self.created_object.append(flavor_creator)
-
- # set image name
- glance = glance_utils.glance_client(self.snaps_creds)
- image = glance_utils.get_image(glance,
- "vyos1.1.7")
- self.vnf['inputs'].update(dict(target_vnf_image_id=image.id))
- self.vnf['inputs'].update(dict(reference_vnf_image_id=image.id))
-
- # set flavor id
- self.vnf['inputs'].update(dict(target_vnf_flavor_id=flavor.id))
- self.vnf['inputs'].update(dict(reference_vnf_flavor_id=flavor.id))
-
- self.vnf['inputs'].update(dict(keystone_username=self.tenant_name))
- self.vnf['inputs'].update(dict(keystone_password=self.tenant_name))
- self.vnf['inputs'].update(dict(keystone_tenant_name=self.tenant_name))
- self.vnf['inputs'].update(
- dict(keystone_url=keystone_utils.get_endpoint(
- self.snaps_creds, 'identity')))
+ self.util_info["cfy"] = self.cfy_client
+ self.util_info["cfy_manager_ip"] = self.fip.floating_ip_address
+ self.util_info["deployment_name"] = descriptor.get('name')
+
+ self.cfy_client.blueprints.upload(
+ descriptor.get('file_name'), descriptor.get('name'))
self.__logger.info("Create VNF Instance")
- cfy_client.deployments.create(descriptor.get('name'),
- descriptor.get('name'),
- self.vnf.get('inputs'))
+ self.cfy_client.deployments.create(
+ descriptor.get('name'), descriptor.get('name'),
+ self.vnf.get('inputs'))
- wait_for_execution(cfy_client,
- get_execution_id(
- cfy_client, descriptor.get('name')),
- self.__logger,
- timeout=7200)
+ cloudify.wait_for_execution(
+ self.cfy_client, cloudify.get_execution_id(
+ self.cfy_client, descriptor.get('name')),
+ self.__logger, timeout=7200)
self.__logger.info("Start the VNF Instance deployment")
- execution = cfy_client.executions.start(descriptor.get('name'),
- 'install')
+ execution = self.cfy_client.executions.start(
+ descriptor.get('name'), 'install')
# Show execution log
- execution = wait_for_execution(cfy_client, execution, self.__logger)
+ execution = cloudify.wait_for_execution(
+ self.cfy_client, execution, self.__logger)
duration = time.time() - start_time
@@ -366,171 +211,24 @@ class CloudifyVrouter(vrouter_base.VrouterOnBoardingBase):
return result
def test_vnf(self):
- cfy_client = self.orchestrator['object']
- credentials = {"snaps_creds": self.snaps_creds,
- "username": self.snaps_creds.username,
- "password": self.snaps_creds.password,
- "auth_url": self.snaps_creds.auth_url,
- "tenant_name": self.snaps_creds.project_name}
-
- self.util_info = {"credentials": credentials,
- "cfy": cfy_client,
- "vnf_data_dir": self.util.vnf_data_dir}
-
start_time = time.time()
-
- result, test_result_data = super(CloudifyVrouter, self).test_vnf()
-
+ testing = vrouter_base.VrouterOnBoardingBase(self.util, self.util_info)
+ result, test_result_data = testing.test_vnf()
duration = time.time() - start_time
-
if result:
- self.details['test_vnf'].update(status='PASS',
- result='OK',
- full_result=test_result_data,
- duration=duration)
+ self.details['test_vnf'].update(
+ status='PASS', result='OK', full_result=test_result_data,
+ duration=duration)
else:
- self.details['test_vnf'].update(status='FAIL',
- result='NG',
- full_result=test_result_data,
- duration=duration)
-
+ self.details['test_vnf'].update(
+ status='FAIL', result='NG', full_result=test_result_data,
+ duration=duration)
return True
def clean(self):
- try:
- cfy_client = self.orchestrator['object']
- dep_name = self.vnf['descriptor'].get('name')
- # kill existing execution
- self.__logger.info('Deleting the current deployment')
- exec_list = cfy_client.executions.list(dep_name)
- for execution in exec_list:
- if execution['status'] == "started":
- try:
- cfy_client.executions.cancel(execution['id'],
- force=True)
- except: # pylint: disable=broad-except
- self.__logger.warn("Can't cancel the current exec")
-
- execution = cfy_client.executions.start(
- dep_name,
- 'uninstall',
- parameters=dict(ignore_failure=True))
-
- wait_for_execution(cfy_client, execution, self.__logger)
- cfy_client.deployments.delete(self.vnf['descriptor'].get('name'))
- cfy_client.blueprints.delete(self.vnf['descriptor'].get('name'))
- except: # pylint: disable=broad-except
- self.__logger.warn("Some issue during the undeployment ..")
- self.__logger.warn("Tenant clean continue ..")
-
- self.__logger.info('Remove the cloudify manager OS object ..')
- for creator in reversed(self.created_object):
- try:
- creator.clean()
- except Exception as exc:
- self.logger.error('Unexpected error cleaning - %s', exc)
-
- super(CloudifyVrouter, self).clean()
-
- def run(self, **kwargs):
- """Execute CloudifyVrouter test case."""
- return super(CloudifyVrouter, self).run(**kwargs)
-
- def get_vnf_info_list(self, target_vnf_name):
- return self.util.get_vnf_info_list(self.cfy_manager_ip,
- self.deployment_name,
- target_vnf_name)
-
-
-# ----------------------------------------------------------
-#
-# YAML UTILS
-#
-# -----------------------------------------------------------
-def get_config(parameter, file_path):
- """
- Get config parameter.
- Returns the value of a given parameter in file.yaml
- parameter must be given in string format with dots
- Example: general.openstack.image_name
- """
- with open(file_path) as config_file:
- file_yaml = yaml.safe_load(config_file)
- config_file.close()
- value = file_yaml
- for element in parameter.split("."):
- value = value.get(element)
- if value is None:
- raise ValueError("The parameter %s is not defined in"
- " reporting.yaml" % parameter)
- return value
-
-
-def wait_for_execution(client, execution, logger, timeout=7200, ):
- """Wait for a workflow execution on Cloudify Manager."""
- # if execution already ended - return without waiting
- if execution.status in Execution.END_STATES:
- return execution
-
- if timeout is not None:
- deadline = time.time() + timeout
-
- # Poll for execution status and execution logs, until execution ends
- # and we receive an event of type in WORKFLOW_END_TYPES
- offset = 0
- batch_size = 50
- event_list = []
- execution_ended = False
- while True:
- event_list = client.events.list(
- execution_id=execution.id,
- _offset=offset,
- _size=batch_size,
- include_logs=False,
- sort='@timestamp').items
-
- offset = offset + len(event_list)
- for event in event_list:
- logger.debug(event.get('message'))
-
- if timeout is not None:
- if time.time() > deadline:
- raise RuntimeError(
- 'execution of operation {0} for deployment {1} '
- 'timed out'.format(execution.workflow_id,
- execution.deployment_id))
- else:
- # update the remaining timeout
- timeout = deadline - time.time()
-
- if not execution_ended:
- execution = client.executions.get(execution.id)
- execution_ended = execution.status in Execution.END_STATES
-
- if execution_ended:
- break
-
- time.sleep(5)
-
- return execution
-
-
-def get_execution_id(client, deployment_id):
- """
- Get the execution id of a env preparation.
- network, security group, fip, VM creation
- """
- executions = client.executions.list(deployment_id=deployment_id)
- for execution in executions:
- if execution.workflow_id == 'create_deployment_environment':
- return execution
- raise RuntimeError('Failed to get create_deployment_environment '
- 'workflow execution.'
- 'Available executions: {0}'.format(executions))
-
-
-def run_blocking_ssh_command(ssh, cmd, error_msg="Unable to run this command"):
- """Command to run ssh command with the exit status."""
- (_, stdout, _) = ssh.exec_command(cmd)
- if stdout.channel.recv_exit_status() != 0:
- raise Exception(error_msg)
+ self.kill_existing_execution(self.vnf['descriptor'].get('name'))
+ if self.image_alt:
+ self.cloud.delete_image(self.image_alt)
+ if self.flavor_alt:
+ self.orig_cloud.delete_flavor(self.flavor_alt.id)
+ super().clean()
diff --git a/functest/opnfv_tests/vnf/router/cloudify_vrouter.yaml b/functest/opnfv_tests/vnf/router/cloudify_vrouter.yaml
index 58bdb66a3..2d98dffa5 100644
--- a/functest/opnfv_tests/vnf/router/cloudify_vrouter.yaml
+++ b/functest/opnfv_tests/vnf/router/cloudify_vrouter.yaml
@@ -3,27 +3,25 @@ tenant_images:
cloudify_manager_4.0:
/home/opnfv/functest/images/cloudify-manager-premium-4.0.1.qcow2
vyos1.1.7: /home/opnfv/functest/images/vyos-1.1.7.img
-test_data:
- url: 'https://github.com/oolorg/opnfv-vnf-data.git'
- branch: 'master'
orchestrator:
name: cloudify
version: '4.0'
requirements:
flavor:
- name: m1.medium
+ name: cloudify.medium
ram_min: 4096
os_image: 'cloudify_manager_4.0'
vnf:
name: vyos1.1.7
version: '1.1.7'
descriptor:
- url: https://github.com/oolorg/opnfv-vnf-vyos-blueprint/
+ file_name:
+ /src/opnfv-vnf-vyos-blueprint/function-test-openstack-blueprint.yaml
name: vrouter-opnfv
- version: 'master'
+ version: fraser
requirements:
flavor:
- name: m1.medium
+ name: cloudify.medium
ram_min: 2048
inputs:
external_network_name: admin_floating_net
diff --git a/functest/opnfv_tests/vnf/router/test_controller/function_test_exec.py b/functest/opnfv_tests/vnf/router/test_controller/function_test_exec.py
index d023d4796..9eb3c5d69 100644
--- a/functest/opnfv_tests/vnf/router/test_controller/function_test_exec.py
+++ b/functest/opnfv_tests/vnf/router/test_controller/function_test_exec.py
@@ -7,9 +7,12 @@
# which accompanies this distribution, and is available at
# http://www.apache.org/licenses/LICENSE-2.0
+# pylint: disable=missing-docstring
+
"""vrouter function test execution module"""
import logging
+import os
import time
import yaml
@@ -18,7 +21,7 @@ from functest.opnfv_tests.vnf.router.vnf_controller.vnf_controller import (
VnfController)
-class FunctionTestExec(object):
+class FunctionTestExec():
"""vrouter function test execution class"""
logger = logging.getLogger(__name__)
@@ -29,17 +32,16 @@ class FunctionTestExec(object):
credentials = util_info["credentials"]
self.vnf_ctrl = VnfController(util_info)
- test_cmd_map_file = open(self.util.vnf_data_dir +
- self.util.opnfv_vnf_data_dir +
- self.util.command_template_dir +
- self.util.test_cmd_map_yaml_file,
- 'r')
- self.test_cmd_map_yaml = yaml.safe_load(test_cmd_map_file)
- test_cmd_map_file.close()
+ with open(
+ os.path.join(
+ self.util.vnf_data_dir, self.util.command_template_dir,
+ self.util.test_cmd_map_yaml_file),
+ 'r', encoding='utf-8') as test_cmd_map_file:
+ self.test_cmd_map_yaml = yaml.safe_load(test_cmd_map_file)
- self.util.set_credentials(credentials["snaps_creds"])
+ self.util.set_credentials(credentials["cloud"])
- with open(self.util.test_env_config_yaml) as file_fd:
+ with open(self.util.test_env_config_yaml, encoding='utf-8') as file_fd:
test_env_config_yaml = yaml.safe_load(file_fd)
file_fd.close()
diff --git a/functest/opnfv_tests/vnf/router/utilvnf.py b/functest/opnfv_tests/vnf/router/utilvnf.py
index 9d196836e..111f20c1a 100644
--- a/functest/opnfv_tests/vnf/router/utilvnf.py
+++ b/functest/opnfv_tests/vnf/router/utilvnf.py
@@ -7,20 +7,17 @@
# which accompanies this distribution, and is available at
# http://www.apache.org/licenses/LICENSE-2.0
+# pylint: disable=missing-docstring
+
""" Utility module of vrouter testcase """
import json
import logging
import os
-import pkg_resources
import requests
import yaml
-from functest.utils.constants import CONST
-from git import Repo
-from requests.auth import HTTPBasicAuth
-from snaps.openstack.utils import nova_utils
-
+from functest.utils import config
RESULT_SPRIT_INDEX = {
"transfer": 8,
@@ -46,25 +43,19 @@ NUMBER_OF_DIGITS_FOR_AVG_JITTER = 3
NUMBER_OF_DIGITS_FOR_AVG_PKT_LOSS = 1
-class Utilvnf(object):
+class Utilvnf(): # pylint: disable=too-many-instance-attributes
""" Utility class of vrouter testcase """
logger = logging.getLogger(__name__)
def __init__(self):
- self.snaps_creds = ""
-
- data_dir = data_dir = CONST.__getattribute__('dir_router_data')
-
- self.vnf_data_dir = data_dir
- self.opnfv_vnf_data_dir = "opnfv-vnf-data/"
+ self.vnf_data_dir = getattr(config.CONF, 'dir_router_data')
self.command_template_dir = "command_template/"
self.test_scenario_yaml = "test_scenario.yaml"
test_env_config_yaml_file = "test_env_config.yaml"
self.test_cmd_map_yaml_file = "test_cmd_map.yaml"
self.test_env_config_yaml = os.path.join(
self.vnf_data_dir,
- self.opnfv_vnf_data_dir,
test_env_config_yaml_file)
self.blueprint_dir = "opnfv-vnf-vyos-blueprint/"
@@ -73,29 +64,7 @@ class Utilvnf(object):
if not os.path.exists(self.vnf_data_dir):
os.makedirs(self.vnf_data_dir)
- case_dir = pkg_resources.resource_filename(
- 'functest', 'opnfv_tests/vnf/router')
-
- config_file_name = CONST.__getattribute__(
- 'vnf_{}_config'.format("vyos_vrouter"))
-
- config_file = os.path.join(case_dir, config_file_name)
-
- with open(config_file) as file_fd:
- vrouter_config_yaml = yaml.safe_load(file_fd)
- file_fd.close()
-
- test_data = vrouter_config_yaml.get("test_data")
-
- self.logger.debug("Downloading the test data.")
- vrouter_data_path = self.vnf_data_dir + self.opnfv_vnf_data_dir
-
- if not os.path.exists(vrouter_data_path):
- Repo.clone_from(test_data['url'],
- vrouter_data_path,
- branch=test_data['branch'])
-
- with open(self.test_env_config_yaml) as file_fd:
+ with open(self.test_env_config_yaml, encoding='utf-8') as file_fd:
test_env_config_yaml = yaml.safe_load(file_fd)
file_fd.close()
@@ -107,77 +76,32 @@ class Utilvnf(object):
self.test_result_json_file = "test_result.json"
if os.path.isfile(self.test_result_json_file):
os.remove(self.test_result_json_file)
- self.logger.debug("removed %s" % self.test_result_json_file)
-
- def get_nova_client(self):
- nova_client = nova_utils.nova_client(self.snaps_creds)
+ self.logger.debug("removed %s", self.test_result_json_file)
- return nova_client
+ self.cloud = None
- def set_credentials(self, snaps_creds):
- self.snaps_creds = snaps_creds
+ def set_credentials(self, cloud):
+ self.cloud = cloud
def get_address(self, server_name, network_name):
- nova_client = self.get_nova_client()
- servers_list = nova_client.servers.list()
- server = None
-
- for server in servers_list:
- if server.name == server_name:
- break
-
+ server = self.cloud.get_server(server_name)
address = server.addresses[
- network_name][NOVA_CILENT_NETWORK_INFO_INDEX]["addr"]
+ network_name][NOVA_CILENT_NETWORK_INFO_INDEX]["addr"]
return address
def get_mac_address(self, server_name, network_name):
- nova_client = self.get_nova_client()
- servers_list = nova_client.servers.list()
- server = None
-
- for server in servers_list:
- if server.name == server_name:
- break
-
+ server = self.cloud.get_server(server_name)
mac_address = server.addresses[network_name][
- NOVA_CILENT_NETWORK_INFO_INDEX][
- "OS-EXT-IPS-MAC:mac_addr"]
+ NOVA_CILENT_NETWORK_INFO_INDEX]["OS-EXT-IPS-MAC:mac_addr"]
return mac_address
- def reboot_vm(self, server_name):
- nova_client = self.get_nova_client()
- servers_list = nova_client.servers.list()
- server = None
-
- for server in servers_list:
- if server.name == server_name:
- break
-
- server.reboot()
-
- return
-
- def delete_vm(self, server_name):
- nova_client = self.get_nova_client()
- servers_list = nova_client.servers.list()
- server = None
-
- for server in servers_list:
- if server.name == server_name:
- nova_client.servers.delete(server)
- break
-
- return
-
def get_blueprint_outputs(self, cfy_manager_ip, deployment_name):
- url = "http://%s/deployments/%s/outputs" % (
- cfy_manager_ip, deployment_name)
-
+ url = f"http://{cfy_manager_ip}/deployments/{deployment_name}/outputs"
response = requests.get(
url,
- auth=HTTPBasicAuth('admin', 'admin'),
+ auth=requests.auth.HTTPBasicAuth('admin', 'admin'),
headers={'Tenant': 'default_tenant'})
resp_data = response.json()
@@ -203,15 +127,10 @@ class Utilvnf(object):
network_list.append(networks[network_name])
return network_list
- def request_vnf_reboot(self, vnf_info_list):
- for vnf in vnf_info_list:
- self.logger.debug("reboot the " + vnf["vnf_name"])
- self.reboot_vm(vnf["vnf_name"])
-
def request_vm_delete(self, vnf_info_list):
for vnf in vnf_info_list:
- self.logger.debug("delete the " + vnf["vnf_name"])
- self.delete_vm(vnf["vnf_name"])
+ self.logger.debug("delete the %s", vnf["vnf_name"])
+ self.cloud.delete_server(vnf["vnf_name"])
def get_vnf_info_list(self, cfy_manager_ip, topology_deploy_name,
target_vnf_name):
@@ -226,12 +145,9 @@ class Utilvnf(object):
vnf["user"] = self.image["user"]
vnf["pass"] = self.image["pass"]
- if vnf_name == target_vnf_name:
- vnf["target_vnf_flag"] = True
- else:
- vnf["target_vnf_flag"] = False
+ vnf["target_vnf_flag"] = bool(vnf_name == target_vnf_name)
- self.logger.debug("vnf name : " + vnf_name)
+ self.logger.debug("vnf name : %s", vnf_name)
self.logger.debug(vnf_name + " floating ip address : " +
vnf["floating_ip"])
@@ -251,14 +167,16 @@ class Utilvnf(object):
return vnf_info_list
- def get_target_vnf(self, vnf_info_list):
+ @staticmethod
+ def get_target_vnf(vnf_info_list):
for vnf in vnf_info_list:
if vnf["target_vnf_flag"]:
return vnf
return None
- def get_reference_vnf_list(self, vnf_info_list):
+ @staticmethod
+ def get_reference_vnf_list(vnf_info_list):
reference_vnf_list = []
for vnf in vnf_info_list:
if not vnf["target_vnf_flag"]:
@@ -266,14 +184,16 @@ class Utilvnf(object):
return reference_vnf_list
- def get_vnf_info(self, vnf_info_list, vnf_name):
+ @staticmethod
+ def get_vnf_info(vnf_info_list, vnf_name):
for vnf in vnf_info_list:
if vnf["vnf_name"] == vnf_name:
return vnf
return None
- def convert_functional_test_result(self, result_data_list):
+ @staticmethod
+ def convert_functional_test_result(result_data_list):
result = {}
for result_data in result_data_list:
test_kind = result_data["test_kind"]
@@ -290,34 +210,38 @@ class Utilvnf(object):
def write_result_data(self, result_data):
test_result = []
if not os.path.isfile(self.test_result_json_file):
- file_fd = open(self.test_result_json_file, "w")
- file_fd.close()
+ with open(
+ self.test_result_json_file, "w",
+ encoding="utf-8") as file_fd:
+ pass
else:
- file_fd = open(self.test_result_json_file, "r")
- test_result = json.load(file_fd)
- file_fd.close()
+ with open(
+ self.test_result_json_file, "r",
+ encoding="utf-8") as file_fd:
+ test_result = json.load(file_fd)
test_result.append(result_data)
- file_fd = open(self.test_result_json_file, "w")
- json.dump(test_result, file_fd)
- file_fd.close()
+ with open(
+ self.test_result_json_file, "w",
+ encoding="utf-8") as file_fd:
+ json.dump(test_result, file_fd)
def output_test_result_json(self):
if os.path.isfile(self.test_result_json_file):
- file_fd = open(self.test_result_json_file, "r")
- test_result = json.load(file_fd)
- file_fd.close()
+ with open(
+ self.test_result_json_file, "r",
+ encoding="utf-8") as file_fd:
+ test_result = json.load(file_fd)
output_json_data = json.dumps(test_result,
sort_keys=True,
indent=4)
- self.logger.debug("test_result %s" % output_json_data)
+ self.logger.debug("test_result %s", output_json_data)
else:
- self.logger.debug("Not found %s" % self.test_result_json_file)
+ self.logger.debug("Not found %s", self.test_result_json_file)
- def get_test_scenario(self, file_path):
- test_scenario_file = open(file_path,
- 'r')
- test_scenario_yaml = yaml.safe_load(test_scenario_file)
- test_scenario_file.close()
+ @staticmethod
+ def get_test_scenario(file_path):
+ with open(file_path, "r", encoding="utf-8") as test_scenario_file:
+ test_scenario_yaml = yaml.safe_load(test_scenario_file)
return test_scenario_yaml["test_scenario_list"]
diff --git a/functest/opnfv_tests/vnf/router/vnf_controller/checker.py b/functest/opnfv_tests/vnf/router/vnf_controller/checker.py
index 198a5ffc9..d3a216ed0 100644
--- a/functest/opnfv_tests/vnf/router/vnf_controller/checker.py
+++ b/functest/opnfv_tests/vnf/router/vnf_controller/checker.py
@@ -7,6 +7,8 @@
# which accompanies this distribution, and is available at
# http://www.apache.org/licenses/LICENSE-2.0
+# pylint: disable=missing-docstring
+
"""vrouter test result check module"""
import json
@@ -16,7 +18,7 @@ import re
from jinja2 import Environment, FileSystemLoader
-class Checker(object):
+class Checker():
"""vrouter test result check class"""
logger = logging.getLogger(__name__)
@@ -24,7 +26,8 @@ class Checker(object):
def __init__(self):
self.logger.debug("init checker")
- def load_check_rule(self, rule_file_dir, rule_file_name, parameter):
+ @staticmethod
+ def load_check_rule(rule_file_dir, rule_file_name, parameter):
loader = FileSystemLoader(rule_file_dir,
encoding='utf8')
env = Environment(loader=loader)
@@ -33,7 +36,8 @@ class Checker(object):
check_rule_data = json.loads(check_rule)
return check_rule_data
- def regexp_information(self, response, rules):
+ @staticmethod
+ def regexp_information(response, rules):
status = False
result_data = {}
diff --git a/functest/opnfv_tests/vnf/router/vnf_controller/command_generator.py b/functest/opnfv_tests/vnf/router/vnf_controller/command_generator.py
index 98cb14cc0..a86a16485 100644
--- a/functest/opnfv_tests/vnf/router/vnf_controller/command_generator.py
+++ b/functest/opnfv_tests/vnf/router/vnf_controller/command_generator.py
@@ -7,13 +7,15 @@
# which accompanies this distribution, and is available at
# http://www.apache.org/licenses/LICENSE-2.0
+# pylint: disable=missing-docstring
+
"""command generator module for vrouter testing"""
import logging
from jinja2 import Environment, FileSystemLoader
-class CommandGenerator(object):
+class CommandGenerator():
"""command generator class for vrouter testing"""
logger = logging.getLogger(__name__)
@@ -21,12 +23,16 @@ class CommandGenerator(object):
def __init__(self):
self.logger.debug("init command generator")
- def load_template(self, template_dir, template):
+ @staticmethod
+ def load_template(template_dir, template):
+ # pylint disable=missing-docstring
loader = FileSystemLoader(template_dir,
encoding='utf8')
env = Environment(loader=loader)
return env.get_template(template)
- def command_create(self, template, parameter):
+ @staticmethod
+ def command_create(template, parameter):
+ # pylint disable=missing-docstring
commands = template.render(parameter)
return commands.split('\n')
diff --git a/functest/opnfv_tests/vnf/router/vnf_controller/ssh_client.py b/functest/opnfv_tests/vnf/router/vnf_controller/ssh_client.py
index c85a57351..269f6526b 100644
--- a/functest/opnfv_tests/vnf/router/vnf_controller/ssh_client.py
+++ b/functest/opnfv_tests/vnf/router/vnf_controller/ssh_client.py
@@ -10,10 +10,11 @@
"""ssh client module for vrouter testing"""
import logging
-import paramiko
import time
import yaml
+import paramiko
+
from functest.opnfv_tests.vnf.router.utilvnf import Utilvnf
RECEIVE_ROOP_WAIT = 1
@@ -23,7 +24,7 @@ DEFAULT_CONNECT_RETRY_COUNT = 10
DEFAULT_SEND_TIMEOUT = 10
-class SshClient(object):
+class SshClient(): # pylint: disable=too-many-instance-attributes
"""ssh client class for vrouter testing"""
logger = logging.getLogger(__name__)
@@ -42,7 +43,7 @@ class SshClient(object):
self.ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
self.util = Utilvnf()
- with open(self.util.test_env_config_yaml) as file_fd:
+ with open(self.util.test_env_config_yaml, encoding='utf-8') as file_fd:
test_env_config_yaml = yaml.safe_load(file_fd)
file_fd.close()
@@ -51,6 +52,7 @@ class SshClient(object):
def connect(self, time_out=DEFAULT_CONNECT_TIMEOUT,
retrycount=DEFAULT_CONNECT_RETRY_COUNT):
+ # pylint: disable=missing-docstring
while retrycount > 0:
try:
self.logger.info("SSH connect to %s.", self.ip_address)
@@ -72,15 +74,14 @@ class SshClient(object):
self.shell.recv(self.ssh_revieve_buff)
break
- except: # pylint: disable=broad-except
+ except Exception: # pylint: disable=broad-except
self.logger.info("SSH timeout for %s...", self.ip_address)
time.sleep(time_out)
retrycount -= 1
if retrycount == 0:
- self.logger.error("Cannot establish connection to IP '%s'. " +
- "Aborting",
- self.ip_address)
+ self.logger.warning(
+ "Cannot establish connection to IP '%s'", self.ip_address)
self.connected = False
return self.connected
@@ -88,13 +89,14 @@ class SshClient(object):
return self.connected
def send(self, cmd, prompt, timeout=DEFAULT_SEND_TIMEOUT):
+ # pylint: disable=missing-docstring
if self.connected is True:
self.shell.settimeout(timeout)
self.logger.debug("Commandset : '%s'", cmd)
try:
self.shell.send(cmd + '\n')
- except: # pylint: disable=broad-except
+ except Exception: # pylint: disable=broad-except
self.logger.error("ssh send timeout : Command : '%s'", cmd)
return None
@@ -103,27 +105,28 @@ class SshClient(object):
time.sleep(RECEIVE_ROOP_WAIT)
try:
res = self.shell.recv(self.ssh_revieve_buff)
- except: # pylint: disable=broad-except
+ except Exception: # pylint: disable=broad-except
self.logger.error("ssh receive timeout : Command : '%s'",
cmd)
break
- res_buff += res
+ res_buff += res.decode("utf-8")
self.logger.debug("Response : '%s'", res_buff)
return res_buff
- else:
- self.logger.error("Cannot connected to IP '%s'.", self.ip_address)
- return None
+ self.logger.error("Cannot connected to IP '%s'.", self.ip_address)
+ return None
def close(self):
+ # pylint: disable=missing-docstring
if self.connected is True:
self.ssh.close()
- def error_check(response, err_strs=["error",
- "warn",
- "unknown command",
- "already exist"]):
+ @staticmethod
+ def error_check(response, err_strs=None):
+ # pylint: disable=missing-docstring
+ if err_strs is None:
+ err_strs = ["error", "warn", "unknown command", "already exist"]
for err in err_strs:
if err in response:
return False
diff --git a/functest/opnfv_tests/vnf/router/vnf_controller/vm_controller.py b/functest/opnfv_tests/vnf/router/vnf_controller/vm_controller.py
index d1c2e3242..2210b3909 100644
--- a/functest/opnfv_tests/vnf/router/vnf_controller/vm_controller.py
+++ b/functest/opnfv_tests/vnf/router/vnf_controller/vm_controller.py
@@ -7,6 +7,8 @@
# which accompanies this distribution, and is available at
# http://www.apache.org/licenses/LICENSE-2.0
+# pylint: disable=missing-docstring
+
"""vm controll module"""
import logging
@@ -21,7 +23,7 @@ from functest.opnfv_tests.vnf.router.vnf_controller.ssh_client import (
SshClient)
-class VmController(object):
+class VmController():
"""vm controll class"""
logger = logging.getLogger(__name__)
@@ -32,14 +34,12 @@ class VmController(object):
credentials = util_info["credentials"]
self.util = Utilvnf()
- self.util.set_credentials(credentials["snaps_creds"])
+ self.util.set_credentials(credentials["cloud"])
- with open(self.util.test_env_config_yaml) as file_fd:
+ with open(self.util.test_env_config_yaml, encoding='utf-8') as file_fd:
test_env_config_yaml = yaml.safe_load(file_fd)
file_fd.close()
- self.reboot_wait = test_env_config_yaml.get("general").get(
- "reboot_wait")
self.command_wait = test_env_config_yaml.get("general").get(
"command_wait")
self.ssh_connect_timeout = test_env_config_yaml.get("general").get(
@@ -83,13 +83,10 @@ class VmController(object):
result = ssh.connect(self.ssh_connect_timeout,
self.ssh_connect_retry_count)
if not result:
- self.logger.debug("try to vm reboot.")
- self.util.reboot_vm(vm_info["vnf_name"])
- time.sleep(self.reboot_wait)
- result = ssh.connect(self.ssh_connect_timeout,
- self.ssh_connect_retry_count)
- if not result:
- return None
+ self.logger.error(
+ "Cannot establish connection to IP '%s'. Aborting!",
+ ssh.ip_address)
+ return None
(result, _) = self.command_create_and_execute(
ssh,
@@ -104,10 +101,8 @@ class VmController(object):
def command_create_and_execute(self, ssh, test_cmd_file_path,
cmd_input_param, prompt_file_path):
- prompt_file = open(prompt_file_path,
- 'r')
- prompt = yaml.safe_load(prompt_file)
- prompt_file.close()
+ with open(prompt_file_path, 'r', encoding='utf-8') as prompt_file:
+ prompt = yaml.safe_load(prompt_file)
config_mode_prompt = prompt["config_mode"]
commands = self.command_gen_from_template(test_cmd_file_path,
@@ -119,11 +114,11 @@ class VmController(object):
def command_list_execute(self, ssh, command_list, prompt):
res_data_list = []
for command in command_list:
- self.logger.debug("Command : " + command)
+ self.logger.debug("Command : %s", command)
(res, res_data) = self.command_execute(ssh,
command,
prompt)
- self.logger.debug("Response : " + res_data)
+ self.logger.debug("Response : %s", res_data)
res_data_list.append(res_data)
if not res:
return res, res_data_list
@@ -135,7 +130,7 @@ class VmController(object):
def command_execute(self, ssh, command, prompt):
res_data = ssh.send(command, prompt)
if res_data is None:
- self.logger.info("retry send command : " + command)
+ self.logger.info("retry send command : %s", command)
res_data = ssh.send(command,
prompt)
if not ssh.error_check(res_data):
diff --git a/functest/opnfv_tests/vnf/router/vnf_controller/vnf_controller.py b/functest/opnfv_tests/vnf/router/vnf_controller/vnf_controller.py
index 814e9e333..46584456f 100644
--- a/functest/opnfv_tests/vnf/router/vnf_controller/vnf_controller.py
+++ b/functest/opnfv_tests/vnf/router/vnf_controller/vnf_controller.py
@@ -7,14 +7,17 @@
# which accompanies this distribution, and is available at
# http://www.apache.org/licenses/LICENSE-2.0
+# pylint: disable=missing-docstring
+
"""vrouter controll module"""
import logging
import os
-import prettytable
import time
import yaml
+import prettytable
+
from functest.opnfv_tests.vnf.router.utilvnf import Utilvnf
from functest.opnfv_tests.vnf.router.vnf_controller.checker import Checker
from functest.opnfv_tests.vnf.router.vnf_controller.ssh_client import (
@@ -23,7 +26,7 @@ from functest.opnfv_tests.vnf.router.vnf_controller.vm_controller import (
VmController)
-class VnfController(object):
+class VnfController():
"""vrouter controll class"""
logger = logging.getLogger(__name__)
@@ -33,7 +36,7 @@ class VnfController(object):
self.util = Utilvnf()
self.vm_controller = VmController(util_info)
- with open(self.util.test_env_config_yaml) as file_fd:
+ with open(self.util.test_env_config_yaml, encoding='utf-8') as file_fd:
test_env_config_yaml = yaml.safe_load(file_fd)
file_fd.close()
@@ -45,10 +48,10 @@ class VnfController(object):
def config_vnf(self, source_vnf, destination_vnf, test_cmd_file_path,
parameter_file_path, prompt_file_path):
- parameter_file = open(parameter_file_path,
- 'r')
- cmd_input_param = yaml.safe_load(parameter_file)
- parameter_file.close()
+ # pylint: disable=too-many-arguments
+ with open(
+ parameter_file_path, 'r', encoding='utf-8') as parameter_file:
+ cmd_input_param = yaml.safe_load(parameter_file)
cmd_input_param["macaddress"] = source_vnf["data_plane_network_mac"]
cmd_input_param["source_ip"] = source_vnf["data_plane_network_ip"]
@@ -63,22 +66,20 @@ class VnfController(object):
def result_check(self, target_vnf, reference_vnf,
check_rule_file_path_list, parameter_file_path,
prompt_file_path):
+ # pylint: disable=too-many-arguments,too-many-locals
res_dict_data_list = []
- parameter_file = open(parameter_file_path,
- 'r')
- cmd_input_param = yaml.safe_load(parameter_file)
- parameter_file.close()
+ with open(
+ parameter_file_path, 'r', encoding='utf-8') as parameter_file:
+ cmd_input_param = yaml.safe_load(parameter_file)
cmd_input_param["source_ip"] = target_vnf["data_plane_network_ip"]
cmd_input_param["destination_ip"] = reference_vnf[
"data_plane_network_ip"]
- prompt_file = open(prompt_file_path,
- 'r')
- prompt = yaml.safe_load(prompt_file)
- prompt_file.close()
+ with open(prompt_file_path, 'r', encoding='utf-8') as prompt_file:
+ prompt = yaml.safe_load(prompt_file)
terminal_mode_prompt = prompt["terminal_mode"]
ssh = SshClient(target_vnf["floating_ip"],
@@ -93,8 +94,8 @@ class VnfController(object):
checker = Checker()
res_table = prettytable.PrettyTable(
- header_style='upper', padding_width=5,
- field_names=['test item', 'result'])
+ header_style='upper', padding_width=5,
+ field_names=['test item', 'result'])
status = True
res_data_list = []
diff --git a/functest/opnfv_tests/vnf/router/vrouter_base.py b/functest/opnfv_tests/vnf/router/vrouter_base.py
index a534f1f2f..932770b9c 100644
--- a/functest/opnfv_tests/vnf/router/vrouter_base.py
+++ b/functest/opnfv_tests/vnf/router/vrouter_base.py
@@ -7,46 +7,34 @@
# which accompanies this distribution, and is available at
# http://www.apache.org/licenses/LICENSE-2.0
+# pylint: disable=missing-docstring
+
"""vrouter testing base class module"""
import datetime
import json
import logging
import os
-import pkg_resources
import time
-import functest.core.vnf as vnf
-from functest.utils.constants import CONST
+import pkg_resources
+
from functest.opnfv_tests.vnf.router.test_controller import function_test_exec
-from functest.opnfv_tests.vnf.router.utilvnf import Utilvnf
__author__ = "Shuya Nakama <shuya.nakama@okinawaopenlabs.org>"
-REBOOT_WAIT = 30
-
-class VrouterOnBoardingBase(vnf.VnfOnBoarding):
+class VrouterOnBoardingBase():
"""vrouter testing base class"""
- def __init__(self, **kwargs):
+ def __init__(self, util, util_info):
self.logger = logging.getLogger(__name__)
- super(VrouterOnBoardingBase, self).__init__(**kwargs)
self.case_dir = pkg_resources.resource_filename(
'functest', 'opnfv_tests/vnf/router')
- self.data_dir = CONST.__getattribute__('dir_router_data')
- self.result_dir = os.path.join(CONST.__getattribute__('dir_results'),
- self.case_name)
- self.util = Utilvnf()
- self.util_info = {}
-
+ self.util = util
+ self.util_info = util_info
self.vnf_list = []
- if not os.path.exists(self.data_dir):
- os.makedirs(self.data_dir)
- if not os.path.exists(self.result_dir):
- os.makedirs(self.result_dir)
-
def test_vnf(self):
"""vrouter test execution"""
result = False
@@ -62,12 +50,11 @@ class VrouterOnBoardingBase(vnf.VnfOnBoarding):
test_list = function_test["test_list"]
target_vnf_name = function_test["target_vnf_name"]
for test_info in test_list:
- self.logger.info(test_info["protocol"] + " " +
- test_info["test_kind"] +
- " test.")
+ self.logger.info(
+ "%s %s test.", test_info["protocol"],
+ test_info["test_kind"])
(result, result_data) = self.function_test_vrouter(
- target_vnf_name,
- test_info)
+ target_vnf_name, test_info)
test_result_data_list.append(result_data)
if not result:
break
@@ -87,10 +74,6 @@ class VrouterOnBoardingBase(vnf.VnfOnBoarding):
vnf_info_list = self.get_vnf_info_list(target_vnf_name)
self.vnf_list = vnf_info_list
- self.logger.debug("request vnf's reboot.")
- self.util.request_vnf_reboot(vnf_info_list)
- time.sleep(REBOOT_WAIT)
-
target_vnf = self.util.get_target_vnf(vnf_info_list)
reference_vnf_list = self.util.get_reference_vnf_list(vnf_info_list)
@@ -115,5 +98,7 @@ class VrouterOnBoardingBase(vnf.VnfOnBoarding):
return result, test_result_data
def get_vnf_info_list(self, target_vnf_name):
- vnf_info_list = []
- return vnf_info_list
+ return self.util.get_vnf_info_list(
+ self.util_info["cfy_manager_ip"],
+ self.util_info["deployment_name"],
+ target_vnf_name)
diff --git a/functest/tests/unit/ci/__init__.py b/functest/tests/unit/ci/__init__.py
deleted file mode 100644
index e69de29bb..000000000
--- a/functest/tests/unit/ci/__init__.py
+++ /dev/null
diff --git a/functest/tests/unit/ci/test_check_deployment.py b/functest/tests/unit/ci/test_check_deployment.py
deleted file mode 100644
index fc6368e5a..000000000
--- a/functest/tests/unit/ci/test_check_deployment.py
+++ /dev/null
@@ -1,199 +0,0 @@
-#!/usr/bin/env python
-
-# Copyright (c) 2017 Ericsson and others.
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-
-import logging
-import mock
-import unittest
-
-from functest.ci import check_deployment
-
-__author__ = "Jose Lausuch <jose.lausuch@ericsson.com>"
-
-
-class CheckDeploymentTesting(unittest.TestCase):
- """The super class which testing classes could inherit."""
- # pylint: disable=missing-docstring
-
- logging.disable(logging.CRITICAL)
-
- def setUp(self):
- self.client_test = mock.Mock()
- self.deployment = check_deployment.CheckDeployment()
- self.service_test = 'compute'
- self.rc_file = self.deployment.rc_file
- self.endpoint_test = 'http://192.168.0.6:5000/v3'
- creds_attr = {'auth_url': self.endpoint_test,
- 'proxy_settings': ''}
- proxy_attr = {'host': '192.168.0.1', 'port': '5000'}
- proxy_settings = mock.Mock()
- proxy_settings.configure_mock(**proxy_attr)
- self.os_creds = mock.Mock()
- self.os_creds.configure_mock(**creds_attr)
- self.os_creds.proxy_settings = proxy_settings
- self.deployment.os_creds = self.os_creds
-
- def test_check_rc(self):
- with mock.patch('functest.ci.check_deployment.os.path.isfile',
- returns=True) as m, \
- mock.patch('six.moves.builtins.open',
- mock.mock_open(read_data='OS_AUTH_URL')):
- self.deployment.check_rc()
- self.assertTrue(m.called)
-
- def test_check_rc_missing_file(self):
- with mock.patch('functest.ci.check_deployment.os.path.isfile',
- return_value=False), \
- self.assertRaises(Exception) as context:
- msg = 'RC file {} does not exist!'.format(self.rc_file)
- self.deployment.check_rc(self.rc_file)
- self.assertTrue(msg in context)
-
- def test_check_rc_missing_os_auth(self):
- with mock.patch('six.moves.builtins.open',
- mock.mock_open(read_data='test')), \
- self.assertRaises(Exception) as context:
- msg = 'OS_AUTH_URL not defined in {}.'.format(self.rc_file)
- self.assertTrue(msg in context)
-
- def test_check_auth_endpoint(self):
- with mock.patch('functest.ci.check_deployment.verify_connectivity',
- return_value=True) as m,\
- mock.patch('functest.ci.check_deployment.get_auth_token',
- return_value='gAAAAABaOhXGS') as mock_token:
- self.deployment.check_auth_endpoint()
- self.assertTrue(m.called)
- self.assertTrue(mock_token.called)
-
- def test_check_auth_endpoint_not_reachable(self):
- with mock.patch('functest.ci.check_deployment.verify_connectivity',
- return_value=False) as m, \
- self.assertRaises(Exception) as context:
- endpoint = self.os_creds.auth_url
- self.deployment.check_auth_endpoint()
- msg = "OS_AUTH_URL {} is not reachable.".format(endpoint)
- self.assertTrue(m.called)
- self.assertTrue(msg in context)
-
- def test_check_public_endpoint(self):
- with mock.patch('functest.ci.check_deployment.verify_connectivity',
- return_value=True) as m, \
- mock.patch('functest.ci.check_deployment.keystone_utils.'
- 'get_endpoint') as n:
- self.deployment.check_public_endpoint()
- self.assertTrue(m.called)
- self.assertTrue(n.called)
-
- def test_check_public_endpoint_not_reachable(self):
- with mock.patch('functest.ci.check_deployment.verify_connectivity',
- return_value=False) as m, \
- mock.patch('functest.ci.check_deployment.keystone_utils.'
- 'get_endpoint',
- return_value=self.endpoint_test) as n, \
- self.assertRaises(Exception) as context:
- self.deployment.check_public_endpoint()
- msg = ("Public endpoint {} is not reachable."
- .format(self.mock_endpoint))
- self.assertTrue(m.called)
- self.assertTrue(n.called)
- self.assertTrue(msg in context)
-
- def test_check_service_endpoint(self):
- with mock.patch('functest.ci.check_deployment.verify_connectivity',
- return_value=True) as m, \
- mock.patch('functest.ci.check_deployment.keystone_utils.'
- 'get_endpoint') as n:
- self.deployment.check_service_endpoint(self.service_test)
- self.assertTrue(m.called)
- self.assertTrue(n.called)
-
- def test_check_service_endpoint_not_reachable(self):
- with mock.patch('functest.ci.check_deployment.verify_connectivity',
- return_value=False) as m, \
- mock.patch('functest.ci.check_deployment.keystone_utils.'
- 'get_endpoint',
- return_value=self.endpoint_test) as n, \
- self.assertRaises(Exception) as context:
- self.deployment.check_service_endpoint(self.service_test)
- msg = "{} endpoint {} is not reachable.".format(self.service_test,
- self.endpoint_test)
- self.assertTrue(m.called)
- self.assertTrue(n.called)
- self.assertTrue(msg in context)
-
- def test_check_nova(self):
- with mock.patch('functest.ci.check_deployment.nova_utils.nova_client',
- return_value=self.client_test) as m:
- self.deployment.check_nova()
- self.assertTrue(m.called)
-
- def test_check_nova_fail(self):
- with mock.patch('functest.ci.check_deployment.nova_utils.nova_client',
- return_value=self.client_test) as m, \
- mock.patch.object(self.client_test, 'servers.list',
- side_effect=Exception):
- self.deployment.check_nova()
- self.assertTrue(m.called)
- self.assertRaises(Exception)
-
- def test_check_neutron(self):
- with mock.patch('functest.ci.check_deployment.neutron_utils.'
- 'neutron_client', return_value=self.client_test) as m:
- self.deployment.check_neutron()
- self.assertTrue(m.called)
-
- def test_check_neutron_fail(self):
- with mock.patch('functest.ci.check_deployment.neutron_utils.'
- 'neutron_client',
- return_value=self.client_test) as m, \
- mock.patch.object(self.client_test, 'list_networks',
- side_effect=Exception), \
- self.assertRaises(Exception):
- self.deployment.check_neutron()
- self.assertRaises(Exception)
- self.assertTrue(m.called)
-
- def test_check_glance(self):
- with mock.patch('functest.ci.check_deployment.glance_utils.'
- 'glance_client', return_value=self.client_test) as m:
- self.deployment.check_glance()
- self.assertTrue(m.called)
-
- def test_check_glance_fail(self):
- with mock.patch('functest.ci.check_deployment.glance_utils.'
- 'glance_client', return_value=self.client_test) as m, \
- mock.patch.object(self.client_test, 'images.list',
- side_effect=Exception):
- self.deployment.check_glance()
- self.assertRaises(Exception)
- self.assertTrue(m.called)
-
- @mock.patch('functest.ci.check_deployment.LOGGER.info')
- @mock.patch('functest.opnfv_tests.openstack.snaps.snaps_utils.'
- 'get_ext_net_name')
- def test_check_extnet(self, mock_getext, mock_loginfo):
- test_network = 'ext-net'
- mock_getext.return_value = test_network
- self.deployment.check_ext_net()
- self.assertTrue(mock_getext.called)
- mock_loginfo.assert_called_once_with(
- "External network found: %s", test_network)
-
- @mock.patch('functest.opnfv_tests.openstack.snaps.snaps_utils.'
- 'get_ext_net_name', return_value='')
- def test_check_extnet_None(self, mock_getext):
- with self.assertRaises(Exception) as context:
- self.deployment.check_ext_net()
- self.assertTrue(mock_getext.called)
- msg = 'ERROR: No external networks in the deployment.'
- self.assertTrue(msg in context)
-
-
-if __name__ == "__main__":
- logging.disable(logging.CRITICAL)
- unittest.main(verbosity=2)
diff --git a/functest/tests/unit/ci/test_run_tests.py b/functest/tests/unit/ci/test_run_tests.py
deleted file mode 100644
index 93cbfccdf..000000000
--- a/functest/tests/unit/ci/test_run_tests.py
+++ /dev/null
@@ -1,250 +0,0 @@
-#!/usr/bin/env python
-
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-
-import logging
-import unittest
-
-import mock
-
-from functest.ci import run_tests
-from functest.utils.constants import CONST
-from functest.core.testcase import TestCase
-
-
-class FakeModule(TestCase):
-
- def run(self):
- return TestCase.EX_OK
-
- def push_to_db(self):
- return TestCase.EX_OK
-
- def is_successful(self):
- return TestCase.EX_OK
-
-
-class RunTestsTesting(unittest.TestCase):
-
- def setUp(self):
- self.runner = run_tests.Runner()
- mock_test_case = mock.Mock()
- mock_test_case.is_successful.return_value = TestCase.EX_OK
- self.runner.executed_test_cases['test1'] = mock_test_case
- self.runner.executed_test_cases['test2'] = mock_test_case
- self.sep = 'test_sep'
- self.creds = {'OS_AUTH_URL': 'http://test_ip:test_port/v2.0',
- 'OS_USERNAME': 'test_os_username',
- 'OS_TENANT_NAME': 'test_tenant',
- 'OS_PASSWORD': 'test_password'}
- self.test = {'test_name': 'test_name'}
- self.tier = mock.Mock()
- test1 = mock.Mock()
- test1.get_name.return_value = 'test1'
- test2 = mock.Mock()
- test2.get_name.return_value = 'test2'
- attrs = {'get_name.return_value': 'test_tier',
- 'get_tests.return_value': [test1, test2],
- 'get_ci_loop.return_value': 'test_ci_loop',
- 'get_test_names.return_value': ['test1', 'test2']}
- self.tier.configure_mock(**attrs)
-
- self.tiers = mock.Mock()
- attrs = {'get_tiers.return_value': [self.tier]}
- self.tiers.configure_mock(**attrs)
-
- self.run_tests_parser = run_tests.RunTestsParser()
-
- @mock.patch('functest.ci.run_tests.LOGGER.error')
- def test_source_rc_file_missing_file(self, mock_logger_error):
- with mock.patch('functest.ci.run_tests.os.path.isfile',
- return_value=False), \
- self.assertRaises(Exception):
- self.runner.source_rc_file()
-
- @mock.patch('functest.ci.run_tests.LOGGER.debug')
- @mock.patch('functest.ci.run_tests.os.path.isfile',
- return_value=True)
- def test_source_rc_file_default(self, *args):
- with mock.patch('functest.ci.run_tests.os_utils.source_credentials',
- return_value=self.creds):
- self.runner.source_rc_file()
-
- def test_get_run_dict_if_defined_default(self):
- mock_obj = mock.Mock()
- with mock.patch('functest.ci.run_tests.'
- 'ft_utils.get_dict_by_test',
- return_value={'run': mock_obj}):
- self.assertEqual(self.runner.get_run_dict('test_name'),
- mock_obj)
-
- @mock.patch('functest.ci.run_tests.LOGGER.error')
- def test_get_run_dict_if_defined_missing_config_option(self,
- mock_logger_error):
- with mock.patch('functest.ci.run_tests.'
- 'ft_utils.get_dict_by_test',
- return_value=None):
- testname = 'test_name'
- self.assertEqual(self.runner.get_run_dict(testname),
- None)
- mock_logger_error.assert_called_once_with(
- "Cannot get %s's config options", testname)
-
- with mock.patch('functest.ci.run_tests.'
- 'ft_utils.get_dict_by_test',
- return_value={}):
- testname = 'test_name'
- self.assertEqual(self.runner.get_run_dict(testname),
- None)
-
- @mock.patch('functest.ci.run_tests.LOGGER.exception')
- def test_get_run_dict_if_defined_exception(self,
- mock_logger_except):
- with mock.patch('functest.ci.run_tests.'
- 'ft_utils.get_dict_by_test',
- side_effect=Exception):
- testname = 'test_name'
- self.assertEqual(self.runner.get_run_dict(testname),
- None)
- mock_logger_except.assert_called_once_with(
- "Cannot get %s's config options", testname)
-
- def test_run_tests_import_test_class_exception(self):
- mock_test = mock.Mock()
- args = {'get_name.return_value': 'test_name',
- 'needs_clean.return_value': False}
- mock_test.configure_mock(**args)
- with mock.patch('functest.ci.run_tests.Runner.source_rc_file'), \
- mock.patch('functest.ci.run_tests.Runner.get_run_dict',
- return_value=None), \
- self.assertRaises(Exception) as context:
- self.runner(mock_test, 'tier_name')
- msg = "Cannot import the class for the test case."
- self.assertTrue(msg in context)
-
- @mock.patch('functest.ci.run_tests.Runner.source_rc_file')
- @mock.patch('importlib.import_module', name="module",
- return_value=mock.Mock(test_class=mock.Mock(
- side_effect=FakeModule)))
- @mock.patch('functest.utils.functest_utils.get_dict_by_test')
- def test_run_tests_default(self, *args):
- mock_test = mock.Mock()
- kwargs = {'get_name.return_value': 'test_name',
- 'needs_clean.return_value': True}
- mock_test.configure_mock(**kwargs)
- test_run_dict = {'module': 'test_module',
- 'class': 'test_class'}
- with mock.patch('functest.ci.run_tests.Runner.get_run_dict',
- return_value=test_run_dict):
- self.runner.clean_flag = True
- self.runner.run_test(mock_test)
- self.assertEqual(self.runner.overall_result,
- run_tests.Result.EX_OK)
-
- @mock.patch('functest.ci.run_tests.Runner.run_test',
- return_value=TestCase.EX_OK)
- def test_run_tier_default(self, *mock_methods):
- self.assertEqual(self.runner.run_tier(self.tier),
- run_tests.Result.EX_OK)
- mock_methods[0].assert_called_with(mock.ANY)
-
- @mock.patch('functest.ci.run_tests.LOGGER.info')
- def test_run_tier_missing_test(self, mock_logger_info):
- self.tier.get_tests.return_value = None
- self.assertEqual(self.runner.run_tier(self.tier),
- run_tests.Result.EX_ERROR)
- self.assertTrue(mock_logger_info.called)
-
- @mock.patch('functest.ci.run_tests.LOGGER.info')
- @mock.patch('functest.ci.run_tests.Runner.run_tier')
- @mock.patch('functest.ci.run_tests.Runner.summary')
- def test_run_all_default(self, *mock_methods):
- CONST.__setattr__('CI_LOOP', 'test_ci_loop')
- self.runner.run_all()
- mock_methods[1].assert_not_called()
- self.assertTrue(mock_methods[2].called)
-
- @mock.patch('functest.ci.run_tests.LOGGER.info')
- @mock.patch('functest.ci.run_tests.Runner.summary')
- def test_run_all_missing_tier(self, *mock_methods):
- CONST.__setattr__('CI_LOOP', 'loop_re_not_available')
- self.runner.run_all()
- self.assertTrue(mock_methods[1].called)
-
- @mock.patch('functest.ci.run_tests.Runner.source_rc_file',
- side_effect=Exception)
- @mock.patch('functest.ci.run_tests.Runner.summary')
- def test_main_failed(self, *mock_methods):
- kwargs = {'test': 'test_name', 'noclean': True, 'report': True}
- args = {'get_tier.return_value': False,
- 'get_test.return_value': False}
- self.runner._tiers = mock.Mock()
- self.runner._tiers.configure_mock(**args)
- self.assertEqual(self.runner.main(**kwargs),
- run_tests.Result.EX_ERROR)
- mock_methods[1].assert_called_once_with()
-
- @mock.patch('functest.ci.run_tests.Runner.source_rc_file')
- @mock.patch('functest.ci.run_tests.Runner.run_test',
- return_value=TestCase.EX_OK)
- @mock.patch('functest.ci.run_tests.Runner.summary')
- def test_main_tier(self, *mock_methods):
- mock_tier = mock.Mock()
- test_mock = mock.Mock()
- test_mock.get_name.return_value = 'test1'
- args = {'get_name.return_value': 'tier_name',
- 'get_tests.return_value': [test_mock]}
- mock_tier.configure_mock(**args)
- kwargs = {'test': 'tier_name', 'noclean': True, 'report': True}
- args = {'get_tier.return_value': mock_tier,
- 'get_test.return_value': None}
- self.runner._tiers = mock.Mock()
- self.runner._tiers.configure_mock(**args)
- self.assertEqual(self.runner.main(**kwargs),
- run_tests.Result.EX_OK)
- mock_methods[1].assert_called()
-
- @mock.patch('functest.ci.run_tests.Runner.source_rc_file')
- @mock.patch('functest.ci.run_tests.Runner.run_test',
- return_value=TestCase.EX_OK)
- def test_main_test(self, *mock_methods):
- kwargs = {'test': 'test_name', 'noclean': True, 'report': True}
- args = {'get_tier.return_value': None,
- 'get_test.return_value': 'test_name'}
- self.runner._tiers = mock.Mock()
- self.runner._tiers.configure_mock(**args)
- self.assertEqual(self.runner.main(**kwargs),
- run_tests.Result.EX_OK)
- mock_methods[0].assert_called_once_with('test_name')
-
- @mock.patch('functest.ci.run_tests.Runner.source_rc_file')
- @mock.patch('functest.ci.run_tests.Runner.run_all')
- @mock.patch('functest.ci.run_tests.Runner.summary')
- def test_main_all_tier(self, *mock_methods):
- kwargs = {'test': 'all', 'noclean': True, 'report': True}
- args = {'get_tier.return_value': None,
- 'get_test.return_value': None}
- self.runner._tiers = mock.Mock()
- self.runner._tiers.configure_mock(**args)
- self.assertEqual(self.runner.main(**kwargs),
- run_tests.Result.EX_OK)
- mock_methods[1].assert_called_once_with()
-
- @mock.patch('functest.ci.run_tests.Runner.source_rc_file')
- @mock.patch('functest.ci.run_tests.Runner.summary')
- def test_main_any_tier_test_ko(self, *mock_methods):
- kwargs = {'test': 'any', 'noclean': True, 'report': True}
- args = {'get_tier.return_value': None,
- 'get_test.return_value': None}
- self.runner._tiers = mock.Mock()
- self.runner._tiers.configure_mock(**args)
- self.assertEqual(self.runner.main(**kwargs),
- run_tests.Result.EX_ERROR)
-
-
-if __name__ == "__main__":
- logging.disable(logging.CRITICAL)
- unittest.main(verbosity=2)
diff --git a/functest/tests/unit/ci/test_tier_builder.py b/functest/tests/unit/ci/test_tier_builder.py
deleted file mode 100644
index d832ca3f0..000000000
--- a/functest/tests/unit/ci/test_tier_builder.py
+++ /dev/null
@@ -1,92 +0,0 @@
-#!/usr/bin/env python
-
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-
-# pylint: disable=missing-docstring
-
-import logging
-import unittest
-
-import mock
-
-from functest.ci import tier_builder
-
-
-class TierBuilderTesting(unittest.TestCase):
-
- def setUp(self):
- self.dependency = {'installer': 'test_installer',
- 'scenario': 'test_scenario'}
-
- self.testcase = {'dependencies': self.dependency,
- 'enabled': 'true',
- 'case_name': 'test_name',
- 'criteria': 'test_criteria',
- 'blocking': 'test_blocking',
- 'description': 'test_desc',
- 'project_name': 'project_name'}
-
- self.dic_tier = {'name': 'test_tier',
- 'order': 'test_order',
- 'ci_loop': 'test_ci_loop',
- 'description': 'test_desc',
- 'testcases': [self.testcase]}
-
- self.mock_yaml = mock.Mock()
- attrs = {'get.return_value': [self.dic_tier]}
- self.mock_yaml.configure_mock(**attrs)
-
- with mock.patch('functest.ci.tier_builder.yaml.safe_load',
- return_value=self.mock_yaml), \
- mock.patch('six.moves.builtins.open', mock.mock_open()):
- self.tierbuilder = tier_builder.TierBuilder('test_installer',
- 'test_scenario',
- 'testcases_file')
- self.tier_obj = self.tierbuilder.tier_objects[0]
-
- def test_get_tiers(self):
- self.assertEqual(self.tierbuilder.get_tiers(),
- [self.tier_obj])
-
- def test_get_tier_names(self):
- self.assertEqual(self.tierbuilder.get_tier_names(),
- ['test_tier'])
-
- def test_get_tier_present_tier(self):
- self.assertEqual(self.tierbuilder.get_tier('test_tier'),
- self.tier_obj)
-
- def test_get_tier_missing_tier(self):
- self.assertEqual(self.tierbuilder.get_tier('test_tier2'),
- None)
-
- def test_get_test_present_test(self):
- self.assertEqual(self.tierbuilder.get_test('test_name'),
- self.tier_obj.get_test('test_name'))
-
- def test_get_test_missing_test(self):
- self.assertEqual(self.tierbuilder.get_test('test_name2'),
- None)
-
- def test_get_tests_present_tier(self):
- self.assertEqual(self.tierbuilder.get_tests('test_tier'),
- self.tier_obj.tests_array)
-
- def test_get_tests_missing_tier(self):
- self.assertEqual(self.tierbuilder.get_tests('test_tier2'),
- None)
-
- def test_get_tier_name_ok(self):
- self.assertEqual(self.tierbuilder.get_tier_name('test_name'),
- 'test_tier')
-
- def test_get_tier_name_ko(self):
- self.assertEqual(self.tierbuilder.get_tier_name('test_name2'), None)
-
-
-if __name__ == "__main__":
- logging.disable(logging.CRITICAL)
- unittest.main(verbosity=2)
diff --git a/functest/tests/unit/ci/test_tier_handler.py b/functest/tests/unit/ci/test_tier_handler.py
deleted file mode 100644
index 871220db3..000000000
--- a/functest/tests/unit/ci/test_tier_handler.py
+++ /dev/null
@@ -1,142 +0,0 @@
-#!/usr/bin/env python
-
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-
-# pylint: disable=missing-docstring
-
-import logging
-import unittest
-
-import mock
-
-from functest.ci import tier_handler
-
-
-class TierHandlerTesting(unittest.TestCase):
-
- def setUp(self):
- self.test = mock.Mock()
- attrs = {'get_name.return_value': 'test_name'}
- self.test.configure_mock(**attrs)
-
- self.mock_depend = mock.Mock()
- attrs = {'get_scenario.return_value': 'test_scenario',
- 'get_installer.return_value': 'test_installer'}
- self.mock_depend.configure_mock(**attrs)
-
- self.tier = tier_handler.Tier('test_tier',
- 'test_order',
- 'test_ci_loop',
- description='test_desc')
- self.testcase = tier_handler.TestCase('test_name',
- 'true',
- self.mock_depend,
- 'test_criteria',
- 'test_blocking',
- description='test_desc')
-
- self.dependency = tier_handler.Dependency('test_installer',
- 'test_scenario')
-
- self.testcase.str = self.testcase.__str__()
- self.dependency.str = self.dependency.__str__()
- self.tier.str = self.tier.__str__()
-
- def test_split_text(self):
- test_str = 'this is for testing'
- self.assertEqual(tier_handler.split_text(test_str, 10),
- ['this is ', 'for ', 'testing '])
-
- def test_add_test(self):
- self.tier.add_test(self.test)
- self.assertEqual(self.tier.tests_array,
- [self.test])
-
- def test_get_tests(self):
- self.tier.tests_array = [self.test]
- self.assertEqual(self.tier.get_tests(),
- [self.test])
-
- def test_get_test_names(self):
- self.tier.tests_array = [self.test]
- self.assertEqual(self.tier.get_test_names(),
- ['test_name'])
-
- def test_get_test(self):
- self.tier.tests_array = [self.test]
- with mock.patch.object(self.tier, 'is_test',
- return_value=True):
- self.assertEqual(self.tier.get_test('test_name'),
- self.test)
-
- def test_get_test_missing_test(self):
- self.tier.tests_array = [self.test]
- with mock.patch.object(self.tier, 'is_test',
- return_value=False):
- self.assertEqual(self.tier.get_test('test_name'),
- None)
-
- def test_get_name(self):
- self.assertEqual(self.tier.get_name(),
- 'test_tier')
-
- def test_get_order(self):
- self.assertEqual(self.tier.get_order(),
- 'test_order')
-
- def test_get_ci_loop(self):
- self.assertEqual(self.tier.get_ci_loop(),
- 'test_ci_loop')
-
- def test_testcase_is_none_in_item(self):
- self.assertEqual(tier_handler.TestCase.is_none("item"),
- False)
-
- def test_testcase_is_none_no_item(self):
- self.assertEqual(tier_handler.TestCase.is_none(None),
- True)
-
- def test_testcase_is_compatible(self):
- self.assertEqual(self.testcase.is_compatible('test_installer',
- 'test_scenario'),
- True)
-
- def test_testcase_is_compatible_2(self):
- self.assertEqual(self.testcase.is_compatible('missing_installer',
- 'test_scenario'),
- False)
- self.assertEqual(self.testcase.is_compatible('test_installer',
- 'missing_scenario'),
- False)
-
- def test_testcase_get_name(self):
- self.assertEqual(self.tier.get_name(),
- 'test_tier')
-
- def test_testcase_is_enabled(self):
- self.assertEqual(self.testcase.is_enabled(),
- 'true')
-
- def test_testcase_get_criteria(self):
- self.assertEqual(self.tier.get_order(),
- 'test_order')
-
- def test_testcase_is_blocking(self):
- self.assertEqual(self.tier.get_ci_loop(),
- 'test_ci_loop')
-
- def test_dependency_get_installer(self):
- self.assertEqual(self.dependency.get_installer(),
- 'test_installer')
-
- def test_dependency_get_scenario(self):
- self.assertEqual(self.dependency.get_scenario(),
- 'test_scenario')
-
-
-if __name__ == "__main__":
- logging.disable(logging.CRITICAL)
- unittest.main(verbosity=2)
diff --git a/functest/tests/unit/cli/__init__.py b/functest/tests/unit/cli/__init__.py
deleted file mode 100644
index e69de29bb..000000000
--- a/functest/tests/unit/cli/__init__.py
+++ /dev/null
diff --git a/functest/tests/unit/cli/commands/__init__.py b/functest/tests/unit/cli/commands/__init__.py
deleted file mode 100644
index e69de29bb..000000000
--- a/functest/tests/unit/cli/commands/__init__.py
+++ /dev/null
diff --git a/functest/tests/unit/cli/commands/test_cli_env.py b/functest/tests/unit/cli/commands/test_cli_env.py
deleted file mode 100644
index d865d3803..000000000
--- a/functest/tests/unit/cli/commands/test_cli_env.py
+++ /dev/null
@@ -1,70 +0,0 @@
-#!/usr/bin/env python
-
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-
-import logging
-import unittest
-
-import mock
-
-from functest.cli.commands import cli_env
-from functest.utils.constants import CONST
-from functest.tests.unit import test_utils
-
-
-class CliEnvTesting(unittest.TestCase):
-
- def setUp(self):
- self.cli_environ = cli_env.CliEnv()
-
- def _test_show_missing_env_var(self, var, *args):
- if var == 'INSTALLER_TYPE':
- CONST.__setattr__('INSTALLER_TYPE', None)
- reg_string = "| INSTALLER: Unknown, \S+\s*|"
- elif var == 'INSTALLER_IP':
- CONST.__setattr__('INSTALLER_IP', None)
- reg_string = "| INSTALLER: \S+, Unknown\s*|"
- elif var == 'SCENARIO':
- CONST.__setattr__('DEPLOY_SCENARIO', None)
- reg_string = "| SCENARIO: Unknown\s*|"
- elif var == 'NODE':
- CONST.__setattr__('NODE_NAME', None)
- reg_string = "| POD: Unknown\s*|"
- elif var == 'BUILD_TAG':
- CONST.__setattr__('BUILD_TAG', None)
- reg_string = "| BUILD TAG: None|"
- elif var == 'DEBUG':
- CONST.__setattr__('CI_DEBUG', None)
- reg_string = "| DEBUG FLAG: false\s*|"
-
- with mock.patch('functest.cli.commands.cli_env.click.echo') \
- as mock_click_echo:
- self.cli_environ.show()
- mock_click_echo.assert_called_with(test_utils.
- RegexMatch(reg_string))
-
- def test_show_missing_ci_installer_type(self, *args):
- self._test_show_missing_env_var('INSTALLER_TYPE', *args)
-
- def test_show_missing_ci_installer_ip(self, *args):
- self._test_show_missing_env_var('INSTALLER_IP', *args)
-
- def test_show_missing_ci_scenario(self, *args):
- self._test_show_missing_env_var('SCENARIO', *args)
-
- def test_show_missing_ci_node(self, *args):
- self._test_show_missing_env_var('NODE', *args)
-
- def test_show_missing_ci_build_tag(self, *args):
- self._test_show_missing_env_var('BUILD_TAG', *args)
-
- def test_show_missing_ci_debug(self, *args):
- self._test_show_missing_env_var('DEBUG', *args)
-
-
-if __name__ == "__main__":
- logging.disable(logging.CRITICAL)
- unittest.main(verbosity=2)
diff --git a/functest/tests/unit/cli/commands/test_cli_os.py b/functest/tests/unit/cli/commands/test_cli_os.py
deleted file mode 100644
index b827e87ca..000000000
--- a/functest/tests/unit/cli/commands/test_cli_os.py
+++ /dev/null
@@ -1,80 +0,0 @@
-#!/usr/bin/env python
-#
-# jose.lausuch@ericsson.com
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-
-import logging
-import unittest
-import os
-
-import mock
-
-from functest.cli.commands import cli_os
-
-
-class CliOpenStackTesting(unittest.TestCase):
-
- def setUp(self):
- self.endpoint_ip = 'test_ip'
- self.os_auth_url = 'http://test_ip:test_port/v2.0'
- self.installer_type = 'test_installer_type'
- self.installer_ip = 'test_installer_ip'
- self.openstack_creds = 'test_openstack_creds'
- self.snapshot_file = 'test_snapshot_file'
- self.cli_os = cli_os.CliOpenStack()
-
- def test_ping_endpoint_default(self):
- self.cli_os.os_auth_url = self.os_auth_url
- self.cli_os.endpoint_ip = self.endpoint_ip
- with mock.patch('functest.cli.commands.cli_os.os.system',
- return_value=0):
- self.assertEqual(self.cli_os.ping_endpoint(), 0)
-
- @mock.patch('functest.cli.commands.cli_os.exit', side_effect=Exception)
- @mock.patch('functest.cli.commands.cli_os.click.echo')
- def test_ping_endpoint_missing_auth_url(self, mock_click_echo,
- mock_exit):
- with self.assertRaises(Exception):
- self.cli_os.os_auth_url = None
- self.cli_os.ping_endpoint()
- mock_click_echo.assert_called_once_with("Source the OpenStack "
- "credentials first '. "
- "$creds'")
-
- @mock.patch('functest.cli.commands.cli_os.exit')
- @mock.patch('functest.cli.commands.cli_os.click.echo')
- def test_ping_endpoint_os_system_fails(self, mock_click_echo,
- mock_exit):
- self.cli_os.os_auth_url = self.os_auth_url
- self.cli_os.endpoint_ip = self.endpoint_ip
- with mock.patch('functest.cli.commands.cli_os.os.system',
- return_value=1):
- self.cli_os.ping_endpoint()
- mock_click_echo.assert_called_once_with("Cannot talk to the "
- "endpoint %s\n" %
- self.endpoint_ip)
- mock_exit.assert_called_once_with(0)
-
- def test_check(self):
- with mock.patch.object(self.cli_os, 'ping_endpoint'), \
- mock.patch('functest.cli.commands.cli_os.check_deployment.'
- 'CheckDeployment') as mock_check_deployment:
- self.cli_os.check()
- self.assertTrue(mock_check_deployment.called)
-
- @mock.patch('functest.cli.commands.cli_os.click.echo')
- def test_show_credentials(self, mock_click_echo):
- key = 'OS_KEY'
- value = 'OS_VALUE'
- with mock.patch.dict(os.environ, {key: value}):
- self.cli_os.show_credentials()
- mock_click_echo.assert_any_call("{}={}".format(key, value))
-
-
-if __name__ == "__main__":
- logging.disable(logging.CRITICAL)
- unittest.main(verbosity=2)
diff --git a/functest/tests/unit/cli/commands/test_cli_testcase.py b/functest/tests/unit/cli/commands/test_cli_testcase.py
deleted file mode 100644
index f3648eb05..000000000
--- a/functest/tests/unit/cli/commands/test_cli_testcase.py
+++ /dev/null
@@ -1,81 +0,0 @@
-#!/usr/bin/env python
-
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-
-
-import logging
-import unittest
-
-import mock
-
-from functest.cli.commands import cli_testcase
-
-
-class CliTestCasesTesting(unittest.TestCase):
-
- def setUp(self):
- self.testname = 'testname'
- with mock.patch('functest.cli.commands.cli_testcase.tb'):
- self.cli_tests = cli_testcase.CliTestcase()
-
- @mock.patch('functest.cli.commands.cli_testcase.vacation.main')
- def test_run_vacation(self, mock_method):
- self.cli_tests.run('vacation')
- self.assertTrue(mock_method.called)
-
- @mock.patch('functest.cli.commands.cli_testcase.ft_utils.execute_command')
- def test_run_default(self, mock_ft_utils):
- cmd = "run_tests -n -r -t {}".format(self.testname)
- self.cli_tests.run(self.testname, noclean=True, report=True)
- mock_ft_utils.assert_called_with(cmd)
-
- @mock.patch('functest.cli.commands.cli_testcase.ft_utils.execute_command')
- def test_run_noclean_missing_report(self, mock_ft_utils):
- cmd = "run_tests -n -t {}".format(self.testname)
- self.cli_tests.run(self.testname, noclean=True, report=False)
- mock_ft_utils.assert_called_with(cmd)
-
- @mock.patch('functest.cli.commands.cli_testcase.ft_utils.execute_command')
- def test_run_report_missing_noclean(self, mock_ft_utils):
- cmd = "run_tests -r -t {}".format(self.testname)
- self.cli_tests.run(self.testname, noclean=False, report=True)
- mock_ft_utils.assert_called_with(cmd)
-
- @mock.patch('functest.cli.commands.cli_testcase.ft_utils.execute_command')
- def test_run_missing_noclean_report(self, mock_ft_utils):
- cmd = "run_tests -t {}".format(self.testname)
- self.cli_tests.run(self.testname, noclean=False, report=False)
- mock_ft_utils.assert_called_with(cmd)
-
- @mock.patch('functest.cli.commands.cli_testcase.click.echo')
- def test_list(self, mock_click_echo):
- with mock.patch.object(self.cli_tests.tiers, 'get_tiers',
- return_value=[]):
- self.cli_tests.list()
- mock_click_echo.assert_called_with("")
-
- @mock.patch('functest.cli.commands.cli_testcase.click.echo')
- def test_show_default_desc_none(self, mock_click_echo):
- with mock.patch.object(self.cli_tests.tiers, 'get_test',
- return_value=None):
- self.cli_tests.show(self.testname)
- mock_click_echo.assert_any_call("The test case '%s' "
- "does not exist or is"
- " not supported."
- % self.testname)
-
- @mock.patch('functest.cli.commands.cli_testcase.click.echo')
- def test_show_default(self, mock_click_echo):
- mock_obj = mock.Mock()
- with mock.patch.object(self.cli_tests.tiers, 'get_test',
- return_value=mock_obj):
- self.cli_tests.show(self.testname)
- mock_click_echo.assert_called_with(mock_obj)
-
-
-if __name__ == "__main__":
- logging.disable(logging.CRITICAL)
- unittest.main(verbosity=2)
diff --git a/functest/tests/unit/cli/commands/test_cli_tier.py b/functest/tests/unit/cli/commands/test_cli_tier.py
deleted file mode 100644
index a76d12049..000000000
--- a/functest/tests/unit/cli/commands/test_cli_tier.py
+++ /dev/null
@@ -1,104 +0,0 @@
-#!/usr/bin/env python
-
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-
-
-import logging
-import unittest
-
-import mock
-
-from functest.cli.commands import cli_tier
-
-
-class CliTierTesting(unittest.TestCase):
-
- def setUp(self):
- self.tiername = 'tiername'
- self.testnames = 'testnames'
- with mock.patch('functest.cli.commands.cli_tier.tb'):
- self.cli_tier = cli_tier.CliTier()
-
- @mock.patch('functest.cli.commands.cli_tier.click.echo')
- def test_list(self, mock_click_echo):
- with mock.patch.object(self.cli_tier.tiers, 'get_tiers',
- return_value=[]):
- self.cli_tier.list()
- mock_click_echo.assert_called_with("")
-
- @mock.patch('functest.cli.commands.cli_tier.click.echo')
- def test_show_default(self, mock_click_echo):
- with mock.patch.object(self.cli_tier.tiers, 'get_tier',
- return_value=self.tiername):
- self.cli_tier.show(self.tiername)
- mock_click_echo.assert_called_with(self.tiername)
-
- @mock.patch('functest.cli.commands.cli_tier.click.echo')
- def test_show_missing_tier(self, mock_click_echo):
- with mock.patch.object(self.cli_tier.tiers, 'get_tier',
- return_value=None), \
- mock.patch.object(self.cli_tier.tiers, 'get_tier_names',
- return_value='tiernames'):
- self.cli_tier.show(self.tiername)
- mock_click_echo.assert_called_with("The tier with name '%s' does "
- "not exist. Available tiers are"
- ":\n %s\n" % (self.tiername,
- 'tiernames'))
-
- @mock.patch('functest.cli.commands.cli_tier.click.echo')
- def test_gettests_default(self, mock_click_echo):
- mock_obj = mock.Mock()
- attrs = {'get_test_names.return_value': self.testnames}
- mock_obj.configure_mock(**attrs)
-
- with mock.patch.object(self.cli_tier.tiers, 'get_tier',
- return_value=mock_obj):
- self.cli_tier.gettests(self.tiername)
- mock_click_echo.assert_called_with("Test cases in tier "
- "'%s':\n %s\n" % (self.tiername,
- self.testnames
- ))
-
- @mock.patch('functest.cli.commands.cli_tier.click.echo')
- def test_gettests_missing_tier(self, mock_click_echo):
- with mock.patch.object(self.cli_tier.tiers, 'get_tier',
- return_value=None), \
- mock.patch.object(self.cli_tier.tiers, 'get_tier_names',
- return_value='tiernames'):
- self.cli_tier.gettests(self.tiername)
- mock_click_echo.assert_called_with("The tier with name '%s' does "
- "not exist. Available tiers are"
- ":\n %s\n" % (self.tiername,
- 'tiernames'))
-
- @mock.patch('functest.cli.commands.cli_tier.ft_utils.execute_command')
- def test_run_default(self, mock_ft_utils):
- cmd = "run_tests -n -r -t {}".format(self.tiername)
- self.cli_tier.run(self.tiername, noclean=True, report=True)
- mock_ft_utils.assert_called_with(cmd)
-
- @mock.patch('functest.cli.commands.cli_tier.ft_utils.execute_command')
- def test_run_report_missing_noclean(self, mock_ft_utils):
- cmd = "run_tests -r -t {}".format(self.tiername)
- self.cli_tier.run(self.tiername, noclean=False, report=True)
- mock_ft_utils.assert_called_with(cmd)
-
- @mock.patch('functest.cli.commands.cli_tier.ft_utils.execute_command')
- def test_run_noclean_missing_report(self, mock_ft_utils):
- cmd = "run_tests -n -t {}".format(self.tiername)
- self.cli_tier.run(self.tiername, noclean=True, report=False)
- mock_ft_utils.assert_called_with(cmd)
-
- @mock.patch('functest.cli.commands.cli_tier.ft_utils.execute_command')
- def test_run_missing_noclean_report(self, mock_ft_utils):
- cmd = "run_tests -t {}".format(self.tiername)
- self.cli_tier.run(self.tiername, noclean=False, report=False)
- mock_ft_utils.assert_called_with(cmd)
-
-
-if __name__ == "__main__":
- logging.disable(logging.CRITICAL)
- unittest.main(verbosity=2)
diff --git a/functest/tests/unit/cli/test_cli_base.py b/functest/tests/unit/cli/test_cli_base.py
deleted file mode 100644
index bc2ca903e..000000000
--- a/functest/tests/unit/cli/test_cli_base.py
+++ /dev/null
@@ -1,98 +0,0 @@
-#!/usr/bin/env python
-
-# Copyright (c) 2016 Orange and others.
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-
-import logging
-import unittest
-
-import mock
-from click.testing import CliRunner
-
-with mock.patch('functest.cli.commands.cli_testcase.CliTestcase.__init__',
- mock.Mock(return_value=None)), \
- mock.patch('functest.cli.commands.cli_tier.CliTier.__init__',
- mock.Mock(return_value=None)):
- from functest.cli import cli_base
-
-
-class CliBaseTesting(unittest.TestCase):
-
- def setUp(self):
- self.runner = CliRunner()
- self._openstack = cli_base._openstack
- self._env = cli_base._env
- self._testcase = cli_base._testcase
- self._tier = cli_base._tier
-
- def test_os_check(self):
- with mock.patch.object(self._openstack, 'check') as mock_method:
- result = self.runner.invoke(cli_base.os_check)
- self.assertEqual(result.exit_code, 0)
- self.assertTrue(mock_method.called)
-
- def test_os_show_credentials(self):
- with mock.patch.object(self._openstack, 'show_credentials') \
- as mock_method:
- result = self.runner.invoke(cli_base.os_show_credentials)
- self.assertEqual(result.exit_code, 0)
- self.assertTrue(mock_method.called)
-
- def test_env_show(self):
- with mock.patch.object(self._env, 'show') as mock_method:
- result = self.runner.invoke(cli_base.env_show)
- self.assertEqual(result.exit_code, 0)
- self.assertTrue(mock_method.called)
-
- def test_testcase_list(self):
- with mock.patch.object(self._testcase, 'list') as mock_method:
- result = self.runner.invoke(cli_base.testcase_list)
- self.assertEqual(result.exit_code, 0)
- self.assertTrue(mock_method.called)
-
- def test_testcase_show(self):
- with mock.patch.object(self._testcase, 'show') as mock_method:
- result = self.runner.invoke(cli_base.testcase_show, ['testname'])
- self.assertEqual(result.exit_code, 0)
- self.assertTrue(mock_method.called)
-
- def test_testcase_run(self):
- with mock.patch.object(self._testcase, 'run') as mock_method:
- result = self.runner.invoke(cli_base.testcase_run,
- ['testname', '--noclean'])
- self.assertEqual(result.exit_code, 0)
- self.assertTrue(mock_method.called)
-
- def test_tier_list(self):
- with mock.patch.object(self._tier, 'list') as mock_method:
- result = self.runner.invoke(cli_base.tier_list)
- self.assertEqual(result.exit_code, 0)
- self.assertTrue(mock_method.called)
-
- def test_tier_show(self):
- with mock.patch.object(self._tier, 'show') as mock_method:
- result = self.runner.invoke(cli_base.tier_show, ['tiername'])
- self.assertEqual(result.exit_code, 0)
- self.assertTrue(mock_method.called)
-
- def test_tier_gettests(self):
- with mock.patch.object(self._tier, 'gettests') as mock_method:
- result = self.runner.invoke(cli_base.tier_gettests, ['tiername'])
- self.assertEqual(result.exit_code, 0)
- self.assertTrue(mock_method.called)
-
- def test_tier_run(self):
- with mock.patch.object(self._tier, 'run') as mock_method:
- result = self.runner.invoke(cli_base.tier_run,
- ['tiername', '--noclean'])
- self.assertEqual(result.exit_code, 0)
- self.assertTrue(mock_method.called)
-
-
-if __name__ == "__main__":
- logging.disable(logging.CRITICAL)
- unittest.main(verbosity=2)
diff --git a/functest/tests/unit/core/__init__.py b/functest/tests/unit/core/__init__.py
deleted file mode 100644
index e69de29bb..000000000
--- a/functest/tests/unit/core/__init__.py
+++ /dev/null
diff --git a/functest/tests/unit/core/test_feature.py b/functest/tests/unit/core/test_feature.py
deleted file mode 100644
index 8c73bb5d5..000000000
--- a/functest/tests/unit/core/test_feature.py
+++ /dev/null
@@ -1,114 +0,0 @@
-#!/usr/bin/env python
-
-# Copyright (c) 2017 Orange and others.
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-
-# pylint: disable=missing-docstring
-
-import logging
-import unittest
-
-import mock
-
-from functest.core import feature
-from functest.core import testcase
-
-
-class FeatureTestingBase(unittest.TestCase):
-
- _case_name = "foo"
- _project_name = "bar"
- _repo = "dir_repo_bar"
- _cmd = "run_bar_tests.py"
- _output_file = '/home/opnfv/functest/results/foo.log'
- feature = None
-
- @mock.patch('time.time', side_effect=[1, 2])
- def _test_run(self, status, mock_method=None):
- self.assertEqual(self.feature.run(cmd=self._cmd), status)
- if status == testcase.TestCase.EX_OK:
- self.assertEqual(self.feature.result, 100)
- else:
- self.assertEqual(self.feature.result, 0)
- mock_method.assert_has_calls([mock.call(), mock.call()])
- self.assertEqual(self.feature.start_time, 1)
- self.assertEqual(self.feature.stop_time, 2)
-
- def test_logger_module_ko(self):
- with mock.patch('six.moves.builtins.open'):
- self.feature = feature.Feature(
- project_name=self._project_name, case_name=self._case_name)
- self.assertEqual(self.feature.logger.name, self._case_name)
-
- def test_logger_module(self):
- with mock.patch('six.moves.builtins.open'):
- self.feature = feature.Feature(
- project_name=self._project_name, case_name=self._case_name,
- run={'module': 'bar'})
- self.assertEqual(self.feature.logger.name, 'bar')
-
-
-class FeatureTesting(FeatureTestingBase):
-
- def setUp(self):
- with mock.patch('six.moves.builtins.open'):
- self.feature = feature.Feature(
- project_name=self._project_name, case_name=self._case_name)
-
- def test_run_exc(self):
- # pylint: disable=bad-continuation
- with mock.patch.object(
- self.feature, 'execute',
- side_effect=Exception) as mock_method:
- self._test_run(testcase.TestCase.EX_RUN_ERROR)
- mock_method.assert_called_once_with(cmd=self._cmd)
-
- def test_run(self):
- self._test_run(testcase.TestCase.EX_RUN_ERROR)
-
-
-class BashFeatureTesting(FeatureTestingBase):
-
- def setUp(self):
- with mock.patch('six.moves.builtins.open'):
- self.feature = feature.BashFeature(
- project_name=self._project_name, case_name=self._case_name)
-
- @mock.patch('subprocess.Popen')
- def test_run_no_cmd(self, mock_subproc):
- self.assertEqual(
- self.feature.run(), testcase.TestCase.EX_RUN_ERROR)
- mock_subproc.assert_not_called()
-
- @mock.patch('subprocess.Popen')
- def test_run_ko(self, mock_subproc):
- with mock.patch('six.moves.builtins.open', mock.mock_open()) as mopen:
- mock_obj = mock.Mock()
- attrs = {'wait.return_value': 1}
- mock_obj.configure_mock(**attrs)
-
- mock_subproc.return_value = mock_obj
- self._test_run(testcase.TestCase.EX_RUN_ERROR)
- mopen.assert_called_once_with(self._output_file, "w+")
-
- @mock.patch('subprocess.Popen')
- def test_run(self, mock_subproc):
- with mock.patch('six.moves.builtins.open', mock.mock_open()) as mopen:
- mock_obj = mock.Mock()
- attrs = {'wait.return_value': 0}
- mock_obj.configure_mock(**attrs)
-
- mock_subproc.return_value = mock_obj
- self._test_run(testcase.TestCase.EX_OK)
- mopen.assert_called_once_with(self._output_file, "w+")
-
-
-if __name__ == "__main__":
- # logging must be disabled else it calls time.time()
- # what will break these unit tests.
- logging.disable(logging.CRITICAL)
- unittest.main(verbosity=2)
diff --git a/functest/tests/unit/core/test_robotframework.py b/functest/tests/unit/core/test_robotframework.py
deleted file mode 100644
index 38e9039b2..000000000
--- a/functest/tests/unit/core/test_robotframework.py
+++ /dev/null
@@ -1,191 +0,0 @@
-#!/usr/bin/env python
-
-# Copyright (c) 2017 Orange and others.
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-
-"""Define the classes required to fully cover robot."""
-
-import errno
-import logging
-import os
-import unittest
-
-import mock
-from robot.errors import DataError, RobotError
-from robot.result import model
-from robot.utils.robottime import timestamp_to_secs
-
-from functest.core import robotframework
-
-__author__ = "Cedric Ollivier <cedric.ollivier@orange.com>"
-
-
-class ResultVisitorTesting(unittest.TestCase):
-
- """The class testing ResultVisitor."""
- # pylint: disable=missing-docstring
-
- def setUp(self):
- self.visitor = robotframework.ResultVisitor()
-
- def test_empty(self):
- self.assertFalse(self.visitor.get_data())
-
- def test_ok(self):
- data = {'name': 'foo',
- 'parent': 'bar',
- 'status': 'PASS',
- 'starttime': "20161216 16:00:00.000",
- 'endtime': "20161216 16:00:01.000",
- 'elapsedtime': 1000,
- 'text': 'Hello, World!',
- 'critical': True}
- test = model.TestCase(
- name=data['name'], status=data['status'], message=data['text'],
- starttime=data['starttime'], endtime=data['endtime'])
- test.parent = mock.Mock()
- config = {'name': data['parent'],
- 'criticality.test_is_critical.return_value': data[
- 'critical']}
- test.parent.configure_mock(**config)
- self.visitor.visit_test(test)
- self.assertEqual(self.visitor.get_data(), [data])
-
-
-class ParseResultTesting(unittest.TestCase):
-
- """The class testing RobotFramework.parse_results()."""
- # pylint: disable=missing-docstring
-
- _config = {'name': 'dummy', 'starttime': '20161216 16:00:00.000',
- 'endtime': '20161216 16:00:01.000'}
-
- def setUp(self):
- self.test = robotframework.RobotFramework(
- case_name='robot', project_name='functest')
-
- @mock.patch('robot.api.ExecutionResult', side_effect=DataError)
- def test_raises_exc(self, mock_method):
- with self.assertRaises(DataError):
- self.test.parse_results()
- mock_method.assert_called_once_with(
- os.path.join(self.test.res_dir, 'output.xml'))
-
- def _test_result(self, config, result):
- suite = mock.Mock()
- suite.configure_mock(**config)
- with mock.patch('robot.api.ExecutionResult',
- return_value=mock.Mock(suite=suite)):
- self.test.parse_results()
- self.assertEqual(self.test.result, result)
- self.assertEqual(self.test.start_time,
- timestamp_to_secs(config['starttime']))
- self.assertEqual(self.test.stop_time,
- timestamp_to_secs(config['endtime']))
- self.assertEqual(self.test.details,
- {'description': config['name'], 'tests': []})
-
- def test_null_passed(self):
- self._config.update({'statistics.critical.passed': 0,
- 'statistics.critical.total': 20})
- self._test_result(self._config, 0)
-
- def test_no_test(self):
- self._config.update({'statistics.critical.passed': 20,
- 'statistics.critical.total': 0})
- self._test_result(self._config, 0)
-
- def test_half_success(self):
- self._config.update({'statistics.critical.passed': 10,
- 'statistics.critical.total': 20})
- self._test_result(self._config, 50)
-
- def test_success(self):
- self._config.update({'statistics.critical.passed': 20,
- 'statistics.critical.total': 20})
- self._test_result(self._config, 100)
-
-
-class RunTesting(unittest.TestCase):
-
- """The class testing RobotFramework.run()."""
- # pylint: disable=missing-docstring
-
- suites = ["foo"]
- variable = []
-
- def setUp(self):
- self.test = robotframework.RobotFramework(
- case_name='robot', project_name='functest')
-
- def test_exc_key_error(self):
- self.assertEqual(self.test.run(), self.test.EX_RUN_ERROR)
-
- @mock.patch('robot.run')
- def _test_makedirs_exc(self, *args):
- with mock.patch.object(self.test, 'parse_results') as mock_method:
- self.assertEqual(
- self.test.run(suites=self.suites, variable=self.variable),
- self.test.EX_RUN_ERROR)
- args[0].assert_not_called()
- mock_method.asser_not_called()
-
- @mock.patch('os.makedirs', side_effect=Exception)
- def test_makedirs_exc(self, *args):
- self._test_makedirs_exc()
- args[0].assert_called_once_with(self.test.res_dir)
-
- @mock.patch('os.makedirs', side_effect=OSError)
- def test_makedirs_oserror(self, *args):
- self._test_makedirs_exc()
- args[0].assert_called_once_with(self.test.res_dir)
-
- @mock.patch('robot.run')
- def _test_makedirs(self, *args):
- with mock.patch.object(self.test, 'parse_results') as mock_method:
- self.assertEqual(
- self.test.run(suites=self.suites, variable=self.variable),
- self.test.EX_OK)
- args[0].assert_called_once_with(
- *self.suites, log='NONE', output=self.test.xml_file,
- report='NONE', stdout=mock.ANY, variable=self.variable)
- mock_method.assert_called_once_with()
-
- @mock.patch('os.makedirs', side_effect=OSError(errno.EEXIST, ''))
- def test_makedirs_oserror17(self, *args):
- self._test_makedirs()
- args[0].assert_called_once_with(self.test.res_dir)
-
- @mock.patch('os.makedirs')
- def test_makedirs(self, *args):
- self._test_makedirs()
- args[0].assert_called_once_with(self.test.res_dir)
-
- @mock.patch('robot.run')
- def _test_parse_results(self, status, *args):
- self.assertEqual(
- self.test.run(suites=self.suites, variable=self.variable), status)
- args[0].assert_called_once_with(
- *self.suites, log='NONE', output=self.test.xml_file,
- report='NONE', stdout=mock.ANY, variable=self.variable)
-
- def test_parse_results_exc(self):
- with mock.patch.object(self.test, 'parse_results',
- side_effect=Exception) as mock_method:
- self._test_parse_results(self.test.EX_RUN_ERROR)
- mock_method.assert_called_once_with()
-
- def test_parse_results_robot_error(self):
- with mock.patch.object(self.test, 'parse_results',
- side_effect=RobotError('foo')) as mock_method:
- self._test_parse_results(self.test.EX_RUN_ERROR)
- mock_method.assert_called_once_with()
-
-
-if __name__ == "__main__":
- logging.disable(logging.CRITICAL)
- unittest.main(verbosity=2)
diff --git a/functest/tests/unit/core/test_testcase.py b/functest/tests/unit/core/test_testcase.py
deleted file mode 100644
index 73ed3470a..000000000
--- a/functest/tests/unit/core/test_testcase.py
+++ /dev/null
@@ -1,232 +0,0 @@
-#!/usr/bin/env python
-
-# Copyright (c) 2016 Orange and others.
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-
-"""Define the class required to fully cover testcase."""
-
-import logging
-import unittest
-
-from functest.core import testcase
-
-import mock
-
-
-__author__ = "Cedric Ollivier <cedric.ollivier@orange.com>"
-
-
-class TestCaseTesting(unittest.TestCase):
- """The class testing TestCase."""
-
- # pylint: disable=missing-docstring,too-many-public-methods
-
- _case_name = "base"
- _project_name = "functest"
- _published_result = "PASS"
-
- def setUp(self):
- self.test = testcase.TestCase(case_name=self._case_name,
- project_name=self._project_name)
- self.test.start_time = "1"
- self.test.stop_time = "2"
- self.test.result = 100
- self.test.details = {"Hello": "World"}
-
- def test_run_unimplemented(self):
- self.assertEqual(self.test.run(),
- testcase.TestCase.EX_RUN_ERROR)
-
- @mock.patch('functest.utils.functest_utils.push_results_to_db',
- return_value=False)
- def _test_missing_attribute(self, mock_function=None):
- self.assertEqual(self.test.push_to_db(),
- testcase.TestCase.EX_PUSH_TO_DB_ERROR)
- mock_function.assert_not_called()
-
- def test_missing_project_name(self):
- self.test.project_name = None
- self._test_missing_attribute()
-
- def test_missing_case_name(self):
- self.test.case_name = None
- self._test_missing_attribute()
-
- def test_missing_start_time(self):
- self.test.start_time = None
- self._test_missing_attribute()
-
- def test_missing_stop_time(self):
- self.test.stop_time = None
- self._test_missing_attribute()
-
- @mock.patch('functest.utils.functest_utils.push_results_to_db',
- return_value=True)
- def test_missing_details(self, mock_function=None):
- self.test.details = None
- self.assertEqual(self.test.push_to_db(),
- testcase.TestCase.EX_OK)
- mock_function.assert_called_once_with(
- self._project_name, self._case_name, self.test.start_time,
- self.test.stop_time, self._published_result, self.test.details)
-
- @mock.patch('functest.utils.functest_utils.push_results_to_db',
- return_value=False)
- def test_push_to_db_failed(self, mock_function=None):
- self.assertEqual(self.test.push_to_db(),
- testcase.TestCase.EX_PUSH_TO_DB_ERROR)
- mock_function.assert_called_once_with(
- self._project_name, self._case_name, self.test.start_time,
- self.test.stop_time, self._published_result, self.test.details)
-
- @mock.patch('functest.utils.functest_utils.push_results_to_db',
- return_value=True)
- def test_push_to_db(self, mock_function=None):
- self.assertEqual(self.test.push_to_db(),
- testcase.TestCase.EX_OK)
- mock_function.assert_called_once_with(
- self._project_name, self._case_name, self.test.start_time,
- self.test.stop_time, self._published_result, self.test.details)
-
- @mock.patch('functest.utils.functest_utils.push_results_to_db',
- return_value=True)
- def test_push_to_db_res_ko(self, mock_function=None):
- self.test.result = 0
- self.assertEqual(self.test.push_to_db(),
- testcase.TestCase.EX_OK)
- mock_function.assert_called_once_with(
- self._project_name, self._case_name, self.test.start_time,
- self.test.stop_time, 'FAIL', self.test.details)
-
- @mock.patch('functest.utils.functest_utils.push_results_to_db',
- return_value=True)
- def test_push_to_db_both_ko(self, mock_function=None):
- self.test.result = 0
- self.test.criteria = 0
- self.assertEqual(self.test.push_to_db(),
- testcase.TestCase.EX_OK)
- mock_function.assert_called_once_with(
- self._project_name, self._case_name, self.test.start_time,
- self.test.stop_time, 'FAIL', self.test.details)
-
- def test_check_criteria_missing(self):
- self.test.criteria = None
- self.assertEqual(self.test.is_successful(),
- testcase.TestCase.EX_TESTCASE_FAILED)
-
- def test_check_result_missing(self):
- self.test.result = None
- self.assertEqual(self.test.is_successful(),
- testcase.TestCase.EX_TESTCASE_FAILED)
-
- def test_check_result_failed(self):
- # Backward compatibility
- # It must be removed as soon as TestCase subclasses
- # stop setting result = 'PASS' or 'FAIL'.
- self.test.result = 'FAIL'
- self.assertEqual(self.test.is_successful(),
- testcase.TestCase.EX_TESTCASE_FAILED)
-
- def test_check_result_pass(self):
- # Backward compatibility
- # It must be removed as soon as TestCase subclasses
- # stop setting result = 'PASS' or 'FAIL'.
- self.test.result = 'PASS'
- self.assertEqual(self.test.is_successful(),
- testcase.TestCase.EX_OK)
-
- def test_check_result_lt(self):
- self.test.result = 50
- self.assertEqual(self.test.is_successful(),
- testcase.TestCase.EX_TESTCASE_FAILED)
-
- def test_check_result_eq(self):
- self.test.result = 100
- self.assertEqual(self.test.is_successful(),
- testcase.TestCase.EX_OK)
-
- def test_check_result_gt(self):
- self.test.criteria = 50
- self.test.result = 100
- self.assertEqual(self.test.is_successful(),
- testcase.TestCase.EX_OK)
-
- def test_check_result_zero(self):
- self.test.criteria = 0
- self.test.result = 0
- self.assertEqual(self.test.is_successful(),
- testcase.TestCase.EX_TESTCASE_FAILED)
-
- def test_get_duration_start_ko(self):
- self.test.start_time = None
- self.assertEqual(self.test.get_duration(), "XX:XX")
- self.test.start_time = 0
- self.assertEqual(self.test.get_duration(), "XX:XX")
-
- def test_get_duration_end_ko(self):
- self.test.stop_time = None
- self.assertEqual(self.test.get_duration(), "XX:XX")
- self.test.stop_time = 0
- self.assertEqual(self.test.get_duration(), "XX:XX")
-
- def test_get_invalid_duration(self):
- self.test.start_time = 2
- self.test.stop_time = 1
- self.assertEqual(self.test.get_duration(), "XX:XX")
-
- def test_get_zero_duration(self):
- self.test.start_time = 2
- self.test.stop_time = 2
- self.assertEqual(self.test.get_duration(), "00:00")
-
- def test_get_duration(self):
- self.test.start_time = 1
- self.test.stop_time = 180
- self.assertEqual(self.test.get_duration(), "02:59")
-
- def test_str_project_name_ko(self):
- self.test.project_name = None
- self.assertIn("<functest.core.testcase.TestCase object at",
- str(self.test))
-
- def test_str_case_name_ko(self):
- self.test.case_name = None
- self.assertIn("<functest.core.testcase.TestCase object at",
- str(self.test))
-
- def test_str_pass(self):
- duration = '01:01'
- with mock.patch.object(self.test, 'get_duration',
- return_value=duration), \
- mock.patch.object(self.test, 'is_successful',
- return_value=testcase.TestCase.EX_OK):
- message = str(self.test)
- self.assertIn(self._project_name, message)
- self.assertIn(self._case_name, message)
- self.assertIn(duration, message)
- self.assertIn('PASS', message)
-
- def test_str_fail(self):
- duration = '00:59'
- with mock.patch.object(self.test, 'get_duration',
- return_value=duration), \
- mock.patch.object(
- self.test, 'is_successful',
- return_value=testcase.TestCase.EX_TESTCASE_FAILED):
- message = str(self.test)
- self.assertIn(self._project_name, message)
- self.assertIn(self._case_name, message)
- self.assertIn(duration, message)
- self.assertIn('FAIL', message)
-
- def test_clean(self):
- self.assertEqual(self.test.clean(), None)
-
-
-if __name__ == "__main__":
- logging.disable(logging.CRITICAL)
- unittest.main(verbosity=2)
diff --git a/functest/tests/unit/core/test_unit.py b/functest/tests/unit/core/test_unit.py
deleted file mode 100644
index ca73de672..000000000
--- a/functest/tests/unit/core/test_unit.py
+++ /dev/null
@@ -1,98 +0,0 @@
-#!/usr/bin/env python
-
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-
-# pylint: disable=missing-docstring
-
-import logging
-import unittest
-
-import mock
-
-from functest.core import unit
-from functest.core import testcase
-
-
-class PyTestSuiteRunnerTesting(unittest.TestCase):
-
- def setUp(self):
- self.psrunner = unit.Suite()
- self.psrunner.suite = "foo"
-
- @mock.patch('unittest.TestLoader')
- def _test_run(self, mock_class=None, result=mock.Mock(),
- status=testcase.TestCase.EX_OK):
- with mock.patch('functest.core.unit.unittest.TextTestRunner.run',
- return_value=result):
- self.assertEqual(self.psrunner.run(), status)
- mock_class.assert_not_called()
-
- def test_check_suite_null(self):
- self.assertEqual(unit.Suite().suite, None)
- self.psrunner.suite = None
- self._test_run(result=mock.Mock(),
- status=testcase.TestCase.EX_RUN_ERROR)
-
- def test_run_no_ut(self):
- mock_result = mock.Mock(testsRun=0, errors=[], failures=[])
- self._test_run(result=mock_result,
- status=testcase.TestCase.EX_RUN_ERROR)
- self.assertEqual(self.psrunner.result, 0)
- self.assertEqual(self.psrunner.details,
- {'errors': 0, 'failures': 0, 'stream': '',
- 'testsRun': 0})
- self.assertEqual(self.psrunner.is_successful(),
- testcase.TestCase.EX_TESTCASE_FAILED)
-
- def test_run_result_ko(self):
- self.psrunner.criteria = 100
- mock_result = mock.Mock(testsRun=50, errors=[('test1', 'error_msg1')],
- failures=[('test2', 'failure_msg1')])
- self._test_run(result=mock_result)
- self.assertEqual(self.psrunner.result, 96)
- self.assertEqual(self.psrunner.details,
- {'errors': 1, 'failures': 1, 'stream': '',
- 'testsRun': 50})
- self.assertEqual(self.psrunner.is_successful(),
- testcase.TestCase.EX_TESTCASE_FAILED)
-
- def test_run_result_ok(self):
- mock_result = mock.Mock(testsRun=50, errors=[],
- failures=[])
- self._test_run(result=mock_result)
- self.assertEqual(self.psrunner.result, 100)
- self.assertEqual(self.psrunner.details,
- {'errors': 0, 'failures': 0, 'stream': '',
- 'testsRun': 50})
- self.assertEqual(self.psrunner.is_successful(),
- testcase.TestCase.EX_OK)
-
- @mock.patch('unittest.TestLoader')
- def test_run_name_exc(self, mock_class=None):
- mock_obj = mock.Mock(side_effect=ImportError)
- mock_class.side_effect = mock_obj
- self.assertEqual(self.psrunner.run(name='foo'),
- testcase.TestCase.EX_RUN_ERROR)
- mock_class.assert_called_once_with()
- mock_obj.assert_called_once_with()
-
- @mock.patch('unittest.TestLoader')
- def test_run_name(self, mock_class=None):
- mock_result = mock.Mock(testsRun=50, errors=[],
- failures=[])
- mock_obj = mock.Mock()
- mock_class.side_effect = mock_obj
- with mock.patch('functest.core.unit.unittest.TextTestRunner.run',
- return_value=mock_result):
- self.assertEqual(self.psrunner.run(name='foo'),
- testcase.TestCase.EX_OK)
- mock_class.assert_called_once_with()
- mock_obj.assert_called_once_with()
-
-
-if __name__ == "__main__":
- logging.disable(logging.CRITICAL)
- unittest.main(verbosity=2)
diff --git a/functest/tests/unit/core/test_vnf.py b/functest/tests/unit/core/test_vnf.py
deleted file mode 100644
index e0eee1a19..000000000
--- a/functest/tests/unit/core/test_vnf.py
+++ /dev/null
@@ -1,194 +0,0 @@
-#!/usr/bin/env python
-
-# Copyright (c) 2016 Orange and others.
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-
-# pylint: disable=missing-docstring
-
-import logging
-import unittest
-
-import mock
-
-from functest.core import vnf
-from functest.core import testcase
-from functest.utils import constants
-
-from snaps.openstack.os_credentials import OSCreds
-
-
-class VnfBaseTesting(unittest.TestCase):
- """The class testing VNF."""
- # pylint: disable=missing-docstring,too-many-public-methods
-
- tenant_name = 'test_tenant_name'
- tenant_description = 'description'
-
- def setUp(self):
- constants.CONST.__setattr__("vnf_foo_tenant_name", self.tenant_name)
- constants.CONST.__setattr__(
- "vnf_foo_tenant_description", self.tenant_description)
- self.test = vnf.VnfOnBoarding(project='functest', case_name='foo')
-
- def test_run_deploy_orch_exc(self):
- with mock.patch.object(self.test, 'prepare'), \
- mock.patch.object(self.test, 'deploy_orchestrator',
- side_effect=Exception) as mock_method, \
- mock.patch.object(self.test, 'deploy_vnf',
- return_value=True), \
- mock.patch.object(self.test, 'test_vnf',
- return_value=True):
- self.assertEqual(self.test.run(),
- testcase.TestCase.EX_TESTCASE_FAILED)
- mock_method.assert_called_with()
-
- def test_run_deploy_vnf_exc(self):
- with mock.patch.object(self.test, 'prepare'),\
- mock.patch.object(self.test, 'deploy_orchestrator',
- return_value=True), \
- mock.patch.object(self.test, 'deploy_vnf',
- side_effect=Exception) as mock_method:
- self.assertEqual(self.test.run(),
- testcase.TestCase.EX_TESTCASE_FAILED)
- mock_method.assert_called_with()
-
- def test_run_test_vnf_exc(self):
- with mock.patch.object(self.test, 'prepare'),\
- mock.patch.object(self.test, 'deploy_orchestrator',
- return_value=True), \
- mock.patch.object(self.test, 'deploy_vnf', return_value=True), \
- mock.patch.object(self.test, 'test_vnf',
- side_effect=Exception) as mock_method:
- self.assertEqual(self.test.run(),
- testcase.TestCase.EX_TESTCASE_FAILED)
- mock_method.assert_called_with()
-
- def test_run_deploy_orch_ko(self):
- with mock.patch.object(self.test, 'prepare'),\
- mock.patch.object(self.test, 'deploy_orchestrator',
- return_value=False), \
- mock.patch.object(self.test, 'deploy_vnf',
- return_value=True), \
- mock.patch.object(self.test, 'test_vnf',
- return_value=True):
- self.assertEqual(self.test.run(),
- testcase.TestCase.EX_TESTCASE_FAILED)
-
- def test_run_vnf_deploy_ko(self):
- with mock.patch.object(self.test, 'prepare'),\
- mock.patch.object(self.test, 'deploy_orchestrator',
- return_value=True), \
- mock.patch.object(self.test, 'deploy_vnf',
- return_value=False), \
- mock.patch.object(self.test, 'test_vnf',
- return_value=True):
- self.assertEqual(self.test.run(),
- testcase.TestCase.EX_TESTCASE_FAILED)
-
- def test_run_vnf_test_ko(self):
- with mock.patch.object(self.test, 'prepare'),\
- mock.patch.object(self.test, 'deploy_orchestrator',
- return_value=True), \
- mock.patch.object(self.test, 'deploy_vnf',
- return_value=True), \
- mock.patch.object(self.test, 'test_vnf',
- return_value=False):
- self.assertEqual(self.test.run(),
- testcase.TestCase.EX_TESTCASE_FAILED)
-
- def test_run_default(self):
- with mock.patch.object(self.test, 'prepare'),\
- mock.patch.object(self.test, 'deploy_orchestrator',
- return_value=True), \
- mock.patch.object(self.test, 'deploy_vnf',
- return_value=True), \
- mock.patch.object(self.test, 'test_vnf',
- return_value=True):
- self.assertEqual(self.test.run(), testcase.TestCase.EX_OK)
-
- @mock.patch('functest.core.vnf.OpenStackUser')
- @mock.patch('functest.core.vnf.OpenStackProject')
- @mock.patch('snaps.openstack.tests.openstack_tests.get_credentials',
- side_effect=Exception)
- def test_prepare_exc1(self, *args):
- with self.assertRaises(Exception):
- self.test.prepare()
- args[0].assert_called_with(
- os_env_file=constants.CONST.__getattribute__('openstack_creds'))
- args[1].assert_not_called()
- args[2].assert_not_called()
-
- @mock.patch('functest.core.vnf.OpenStackUser')
- @mock.patch('functest.core.vnf.OpenStackProject', side_effect=Exception)
- @mock.patch('snaps.openstack.tests.openstack_tests.get_credentials')
- def test_prepare_exc2(self, *args):
- with self.assertRaises(Exception):
- self.test.prepare()
- args[0].assert_called_with(
- os_env_file=constants.CONST.__getattribute__('openstack_creds'))
- args[1].assert_called_with(mock.ANY, mock.ANY)
- args[2].assert_not_called()
-
- @mock.patch('functest.core.vnf.OpenStackUser', side_effect=Exception)
- @mock.patch('functest.core.vnf.OpenStackProject')
- @mock.patch('snaps.openstack.tests.openstack_tests.get_credentials')
- def test_prepare_exc3(self, *args):
- with self.assertRaises(Exception):
- self.test.prepare()
- args[0].assert_called_with(
- os_env_file=constants.CONST.__getattribute__('openstack_creds'))
- args[1].assert_called_with(mock.ANY, mock.ANY)
- args[2].assert_called_with(mock.ANY, mock.ANY)
-
- @mock.patch('functest.core.vnf.OpenStackUser')
- @mock.patch('functest.core.vnf.OpenStackProject')
- @mock.patch('snaps.openstack.tests.openstack_tests.get_credentials')
- def test_prepare_default(self, *args):
- self.assertEqual(self.test.prepare(), testcase.TestCase.EX_OK)
- args[0].assert_called_with(
- os_env_file=constants.CONST.__getattribute__('openstack_creds'))
- args[1].assert_called_with(mock.ANY, mock.ANY)
- args[2].assert_called_with(mock.ANY, mock.ANY)
-
- def test_deploy_vnf_unimplemented(self):
- with self.assertRaises(vnf.VnfDeploymentException):
- self.test.deploy_vnf()
-
- def test_test_vnf_unimplemented(self):
- with self.assertRaises(vnf.VnfTestException):
- self.test.test_vnf()
-
- def test_deploy_orch_unimplemented(self):
- self.assertTrue(self.test.deploy_orchestrator())
-
- @mock.patch('snaps.openstack.tests.openstack_tests.get_credentials',
- return_value=OSCreds(
- username='user', password='pass',
- auth_url='http://foo.com:5000/v3', project_name='bar'),
- side_effect=Exception)
- def test_prepare_keystone_client_ko(self, *args):
- with self.assertRaises(vnf.VnfPreparationException):
- self.test.prepare()
- args[0].assert_called_once()
-
- def test_vnf_clean_exc(self):
- obj = mock.Mock()
- obj.clean.side_effect = Exception
- self.test.created_object = [obj]
- self.test.clean()
- obj.clean.assert_called_with()
-
- def test_vnf_clean(self):
- obj = mock.Mock()
- self.test.created_object = [obj]
- self.test.clean()
- obj.clean.assert_called_with()
-
-
-if __name__ == "__main__":
- logging.disable(logging.CRITICAL)
- unittest.main(verbosity=2)
diff --git a/functest/tests/unit/energy/__init__.py b/functest/tests/unit/energy/__init__.py
deleted file mode 100644
index e69de29bb..000000000
--- a/functest/tests/unit/energy/__init__.py
+++ /dev/null
diff --git a/functest/tests/unit/energy/test_functest_energy.py b/functest/tests/unit/energy/test_functest_energy.py
deleted file mode 100644
index f0711ca0c..000000000
--- a/functest/tests/unit/energy/test_functest_energy.py
+++ /dev/null
@@ -1,385 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: UTF-8 -*-
-
-# Copyright (c) 2017 Orange and others.
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-
-"""Unitary test for energy module."""
-# pylint: disable=unused-argument
-import logging
-import requests
-import unittest
-
-import mock
-
-from functest.energy.energy import EnergyRecorder
-import functest.energy.energy as energy
-from functest.utils.constants import CONST
-
-CASE_NAME = "UNIT_TEST_CASE"
-STEP_NAME = "UNIT_TEST_STEP"
-
-PREVIOUS_SCENARIO = "previous_scenario"
-PREVIOUS_STEP = "previous_step"
-
-
-class MockHttpResponse(object): # pylint: disable=too-few-public-methods
- """Mock response for Energy recorder API."""
-
- def __init__(self, text, status_code):
- """Create an instance of MockHttpResponse."""
- self.text = text
- self.status_code = status_code
-
-
-API_OK = MockHttpResponse(
- '{"status": "OK"}',
- 200
-)
-API_KO = MockHttpResponse(
- '{"message": "API-KO"}',
- 500
-)
-
-RECORDER_OK = MockHttpResponse(
- '{"environment": "UNIT_TEST",'
- ' "step": "string",'
- ' "scenario": "' + CASE_NAME + '"}',
- 200
-)
-RECORDER_KO = MockHttpResponse(
- '{"message": "An unhandled API exception occurred (MOCK)"}',
- 500
-)
-RECORDER_NOT_FOUND = MockHttpResponse(
- '{"message": "Recorder not found (MOCK)"}',
- 404
-)
-
-
-def config_loader_mock(config_key):
- """Return mocked config values."""
- if config_key == "energy_recorder.api_url":
- return "http://pod-uri:8888"
- elif config_key == "energy_recorder.api_user":
- return "user"
- elif config_key == "energy_recorder.api_password":
- return "password"
-
-
-def config_loader_mock_no_creds(config_key):
- """Return mocked config values."""
- if config_key == "energy_recorder.api_url":
- return "http://pod-uri:8888"
- elif config_key == "energy_recorder.api_user":
- return ""
- elif config_key == "energy_recorder.api_password":
- return ""
-
-
-# pylint: disable=too-many-public-methods
-class EnergyRecorderTest(unittest.TestCase):
- """Energy module unitary test suite."""
-
- case_name = CASE_NAME
- request_headers = {'content-type': 'application/json'}
- returned_value_to_preserve = "value"
- exception_message_to_preserve = "exception_message"
-
- @mock.patch('functest.energy.energy.requests.post',
- return_value=RECORDER_OK)
- def test_start(self, post_mock=None, get_mock=None):
- """EnergyRecorder.start method (regular case)."""
- self.test_load_config()
- self.assertTrue(EnergyRecorder.start(self.case_name))
- post_mock.assert_called_once_with(
- EnergyRecorder.energy_recorder_api["uri"],
- auth=EnergyRecorder.energy_recorder_api["auth"],
- data=mock.ANY,
- headers=self.request_headers,
- timeout=EnergyRecorder.CONNECTION_TIMEOUT
- )
-
- @mock.patch('functest.energy.energy.requests.post',
- side_effect=Exception("Internal execution error (MOCK)"))
- def test_start_error(self, post_mock=None):
- """EnergyRecorder.start method (error in method)."""
- self.test_load_config()
- self.assertFalse(EnergyRecorder.start(self.case_name))
- post_mock.assert_called_once_with(
- EnergyRecorder.energy_recorder_api["uri"],
- auth=EnergyRecorder.energy_recorder_api["auth"],
- data=mock.ANY,
- headers=self.request_headers,
- timeout=EnergyRecorder.CONNECTION_TIMEOUT
- )
-
- @mock.patch('functest.energy.energy.EnergyRecorder.load_config',
- side_effect=Exception("Internal execution error (MOCK)"))
- def test_start_exception(self, conf_loader_mock=None):
- """EnergyRecorder.start test with exception during execution."""
- start_status = EnergyRecorder.start(CASE_NAME)
- self.assertFalse(start_status)
-
- @mock.patch('functest.energy.energy.requests.post',
- return_value=RECORDER_KO)
- def test_start_api_error(self, post_mock=None):
- """EnergyRecorder.start method (API error)."""
- self.test_load_config()
- self.assertFalse(EnergyRecorder.start(self.case_name))
- post_mock.assert_called_once_with(
- EnergyRecorder.energy_recorder_api["uri"],
- auth=EnergyRecorder.energy_recorder_api["auth"],
- data=mock.ANY,
- headers=self.request_headers,
- timeout=EnergyRecorder.CONNECTION_TIMEOUT
- )
-
- @mock.patch('functest.energy.energy.requests.post',
- return_value=RECORDER_OK)
- def test_set_step(self, post_mock=None):
- """EnergyRecorder.set_step method (regular case)."""
- self.test_load_config()
- self.assertTrue(EnergyRecorder.set_step(STEP_NAME))
- post_mock.assert_called_once_with(
- EnergyRecorder.energy_recorder_api["uri"] + "/step",
- auth=EnergyRecorder.energy_recorder_api["auth"],
- data=mock.ANY,
- headers=self.request_headers,
- timeout=EnergyRecorder.CONNECTION_TIMEOUT
- )
-
- @mock.patch('functest.energy.energy.requests.post',
- return_value=RECORDER_KO)
- def test_set_step_api_error(self, post_mock=None):
- """EnergyRecorder.set_step method (API error)."""
- self.test_load_config()
- self.assertFalse(EnergyRecorder.set_step(STEP_NAME))
- post_mock.assert_called_once_with(
- EnergyRecorder.energy_recorder_api["uri"] + "/step",
- auth=EnergyRecorder.energy_recorder_api["auth"],
- data=mock.ANY,
- headers=self.request_headers,
- timeout=EnergyRecorder.CONNECTION_TIMEOUT
- )
-
- @mock.patch('functest.energy.energy.requests.post',
- side_effect=Exception("Internal execution error (MOCK)"))
- def test_set_step_error(self, post_mock=None):
- """EnergyRecorder.set_step method (method error)."""
- self.test_load_config()
- self.assertFalse(EnergyRecorder.set_step(STEP_NAME))
- post_mock.assert_called_once_with(
- EnergyRecorder.energy_recorder_api["uri"] + "/step",
- auth=EnergyRecorder.energy_recorder_api["auth"],
- data=mock.ANY,
- headers=self.request_headers,
- timeout=EnergyRecorder.CONNECTION_TIMEOUT
- )
-
- @mock.patch('functest.energy.energy.EnergyRecorder.load_config',
- side_effect=requests.exceptions.ConnectionError())
- def test_set_step_connection_error(self, conf_loader_mock=None):
- """EnergyRecorder.start test with exception during execution."""
- step_status = EnergyRecorder.set_step(STEP_NAME)
- self.assertFalse(step_status)
-
- @mock.patch('functest.energy.energy.requests.delete',
- return_value=RECORDER_OK)
- def test_stop(self, delete_mock=None):
- """EnergyRecorder.stop method (regular case)."""
- self.test_load_config()
- self.assertTrue(EnergyRecorder.stop())
- delete_mock.assert_called_once_with(
- EnergyRecorder.energy_recorder_api["uri"],
- auth=EnergyRecorder.energy_recorder_api["auth"],
- headers=self.request_headers,
- timeout=EnergyRecorder.CONNECTION_TIMEOUT
- )
-
- @mock.patch('functest.energy.energy.requests.delete',
- return_value=RECORDER_KO)
- def test_stop_api_error(self, delete_mock=None):
- """EnergyRecorder.stop method (API Error)."""
- self.test_load_config()
- self.assertFalse(EnergyRecorder.stop())
- delete_mock.assert_called_once_with(
- EnergyRecorder.energy_recorder_api["uri"],
- auth=EnergyRecorder.energy_recorder_api["auth"],
- headers=self.request_headers,
- timeout=EnergyRecorder.CONNECTION_TIMEOUT
- )
-
- @mock.patch('functest.energy.energy.requests.delete',
- side_effect=Exception("Internal execution error (MOCK)"))
- def test_stop_error(self, delete_mock=None):
- """EnergyRecorder.stop method (method error)."""
- self.test_load_config()
- self.assertFalse(EnergyRecorder.stop())
- delete_mock.assert_called_once_with(
- EnergyRecorder.energy_recorder_api["uri"],
- auth=EnergyRecorder.energy_recorder_api["auth"],
- headers=self.request_headers,
- timeout=EnergyRecorder.CONNECTION_TIMEOUT
- )
-
- @energy.enable_recording
- def __decorated_method(self):
- """Call with to energy recorder decorators."""
- return self.returned_value_to_preserve
-
- @energy.enable_recording
- def __decorated_method_with_ex(self):
- """Call with to energy recorder decorators."""
- raise Exception(self.exception_message_to_preserve)
-
- @mock.patch("functest.energy.energy.EnergyRecorder.get_current_scenario",
- return_value=None)
- @mock.patch("functest.energy.energy.EnergyRecorder")
- def test_decorators(self,
- recorder_mock=None,
- cur_scenario_mock=None):
- """Test energy module decorators."""
- self.__decorated_method()
- calls = [mock.call.start(self.case_name),
- mock.call.stop()]
- recorder_mock.assert_has_calls(calls)
-
- @mock.patch("functest.energy.energy.EnergyRecorder.get_current_scenario",
- return_value={"scenario": PREVIOUS_SCENARIO,
- "step": PREVIOUS_STEP})
- @mock.patch("functest.energy.energy.EnergyRecorder")
- @mock.patch("functest.utils.functest_utils.get_functest_config",
- side_effect=config_loader_mock)
- def test_decorators_with_previous(self,
- loader_mock=None,
- recorder_mock=None,
- cur_scenario_mock=None):
- """Test energy module decorators."""
- CONST.__setattr__('NODE_NAME', 'MOCK_POD')
- self.__decorated_method()
- calls = [mock.call.start(self.case_name),
- mock.call.submit_scenario(PREVIOUS_SCENARIO,
- PREVIOUS_STEP)]
- recorder_mock.assert_has_calls(calls, True)
-
- def test_decorator_preserve_return(self):
- """Test that decorator preserve method returned value."""
- self.test_load_config()
- self.assertTrue(
- self.__decorated_method() == self.returned_value_to_preserve
- )
-
- @mock.patch(
- "functest.energy.energy.finish_session")
- def test_decorator_preserve_ex(self, finish_mock=None):
- """Test that decorator preserve method exceptions."""
- self.test_load_config()
- with self.assertRaises(Exception) as context:
- self.__decorated_method_with_ex()
- self.assertTrue(
- self.exception_message_to_preserve in str(context.exception)
- )
- self.assertTrue(finish_mock.called)
-
- @mock.patch("functest.utils.functest_utils.get_functest_config",
- side_effect=config_loader_mock)
- @mock.patch("functest.energy.energy.requests.get",
- return_value=API_OK)
- def test_load_config(self, loader_mock=None, get_mock=None):
- """Test load config."""
- CONST.__setattr__('NODE_NAME', 'MOCK_POD')
- EnergyRecorder.energy_recorder_api = None
- EnergyRecorder.load_config()
-
- self.assertEquals(
- EnergyRecorder.energy_recorder_api["auth"],
- ("user", "password")
- )
- self.assertEquals(
- EnergyRecorder.energy_recorder_api["uri"],
- "http://pod-uri:8888/recorders/environment/MOCK_POD"
- )
-
- @mock.patch("functest.utils.functest_utils.get_functest_config",
- side_effect=config_loader_mock_no_creds)
- @mock.patch("functest.energy.energy.requests.get",
- return_value=API_OK)
- def test_load_config_no_creds(self, loader_mock=None, get_mock=None):
- """Test load config without creds."""
- CONST.__setattr__('NODE_NAME', 'MOCK_POD')
- EnergyRecorder.energy_recorder_api = None
- EnergyRecorder.load_config()
- self.assertEquals(EnergyRecorder.energy_recorder_api["auth"], None)
- self.assertEquals(
- EnergyRecorder.energy_recorder_api["uri"],
- "http://pod-uri:8888/recorders/environment/MOCK_POD"
- )
-
- @mock.patch("functest.utils.functest_utils.get_functest_config",
- return_value=None)
- @mock.patch("functest.energy.energy.requests.get",
- return_value=API_OK)
- def test_load_config_ex(self, loader_mock=None, get_mock=None):
- """Test load config with exception."""
- CONST.__setattr__('NODE_NAME', 'MOCK_POD')
- with self.assertRaises(AssertionError):
- EnergyRecorder.energy_recorder_api = None
- EnergyRecorder.load_config()
- self.assertEquals(EnergyRecorder.energy_recorder_api, None)
-
- @mock.patch("functest.utils.functest_utils.get_functest_config",
- side_effect=config_loader_mock)
- @mock.patch("functest.energy.energy.requests.get",
- return_value=API_KO)
- def test_load_config_api_ko(self, loader_mock=None, get_mock=None):
- """Test load config with API unavailable."""
- CONST.__setattr__('NODE_NAME', 'MOCK_POD')
- EnergyRecorder.energy_recorder_api = None
- EnergyRecorder.load_config()
- self.assertEquals(EnergyRecorder.energy_recorder_api["available"],
- False)
-
- @mock.patch("functest.utils.functest_utils.get_functest_config",
- return_value=None)
- @mock.patch('functest.energy.energy.requests.get',
- return_value=RECORDER_OK)
- def test_get_current_scenario(self, loader_mock=None, get_mock=None):
- """Test get_current_scenario."""
- CONST.__setattr__('NODE_NAME', 'MOCK_POD')
- self.test_load_config()
- scenario = EnergyRecorder.get_current_scenario()
- self.assertTrue(scenario is not None)
-
- @mock.patch('functest.energy.energy.requests.get',
- return_value=RECORDER_NOT_FOUND)
- def test_current_scenario_not_found(self, get_mock=None):
- """Test get current scenario not existing."""
- CONST.__setattr__('NODE_NAME', 'MOCK_POD')
- self.test_load_config()
- scenario = EnergyRecorder.get_current_scenario()
- self.assertTrue(scenario is None)
-
- @mock.patch('functest.energy.energy.requests.get',
- return_value=RECORDER_KO)
- def test_current_scenario_api_error(self, get_mock=None):
- """Test get current scenario with API error."""
- CONST.__setattr__('NODE_NAME', 'MOCK_POD')
- self.test_load_config()
- scenario = EnergyRecorder.get_current_scenario()
- self.assertTrue(scenario is None)
-
- @mock.patch('functest.energy.energy.EnergyRecorder.load_config',
- side_effect=Exception("Internal execution error (MOCK)"))
- def test_current_scenario_exception(self, get_mock=None):
- """Test get current scenario with exception."""
- scenario = EnergyRecorder.get_current_scenario()
- self.assertTrue(scenario is None)
-
-if __name__ == "__main__":
- logging.disable(logging.CRITICAL)
- unittest.main(verbosity=2)
diff --git a/functest/tests/unit/odl/test_odl.py b/functest/tests/unit/odl/test_odl.py
index 1a3f79503..c675c2988 100644
--- a/functest/tests/unit/odl/test_odl.py
+++ b/functest/tests/unit/odl/test_odl.py
@@ -13,13 +13,13 @@ import logging
import os
import unittest
-from keystoneauth1.exceptions import auth_plugins
import mock
+import munch
from robot.errors import RobotError
import six
from six.moves import urllib
+from xtesting.core import testcase
-from functest.core import testcase
from functest.opnfv_tests.sdn.odl import odl
__author__ = "Cedric Ollivier <cedric.ollivier@orange.com>"
@@ -33,9 +33,10 @@ class ODLTesting(unittest.TestCase):
logging.disable(logging.CRITICAL)
_keystone_ip = "127.0.0.1"
- _neutron_url = "http://127.0.0.2:9696"
+ _neutron_url = "https://127.0.0.1:9696"
+ _neutron_id = "dummy"
_sdn_controller_ip = "127.0.0.3"
- _os_auth_url = "http://{}:5000/v3".format(_keystone_ip)
+ _os_auth_url = f"http://{_keystone_ip}:5000/v3"
_os_projectname = "admin"
_os_username = "admin"
_os_password = "admin"
@@ -45,9 +46,10 @@ class ODLTesting(unittest.TestCase):
_odl_password = "admin"
_os_userdomainname = 'Default'
_os_projectdomainname = 'Default'
+ _os_interface = "public"
def setUp(self):
- for var in ("INSTALLER_TYPE", "SDN_CONTROLLER", "SDN_CONTROLLER_IP"):
+ for var in ("SDN_CONTROLLER", "SDN_CONTROLLER_IP"):
if var in os.environ:
del os.environ[var]
os.environ["OS_AUTH_URL"] = self._os_auth_url
@@ -57,11 +59,11 @@ class ODLTesting(unittest.TestCase):
os.environ["OS_PROJECT_NAME"] = self._os_projectname
os.environ["OS_PROJECT_DOMAIN_NAME"] = self._os_projectdomainname
os.environ["OS_PASSWORD"] = self._os_password
+ os.environ["OS_INTERFACE"] = self._os_interface
self.test = odl.ODLTests(case_name='odl', project_name='functest')
self.defaultargs = {'odlusername': self._odl_username,
'odlpassword': self._odl_password,
- 'neutronurl': "http://{}:9696".format(
- self._keystone_ip),
+ 'neutronurl': f"http://{self._keystone_ip}:9696",
'osauthurl': self._os_auth_url,
'osusername': self._os_username,
'osuserdomainname': self._os_userdomainname,
@@ -102,7 +104,7 @@ class ODLRobotTesting(ODLTesting):
mock_method.assert_called_once_with(
os.path.join(odl.ODLTests.odl_test_repo,
'csit/variables/Variables.robot'), inplace=True)
- self.assertEqual(args[0].getvalue(), "{}\n".format(msg2))
+ self.assertEqual(args[0].getvalue(), f"{msg2}\n")
def test_set_vars_auth_default(self):
self._test_set_vars(
@@ -153,31 +155,30 @@ class ODLMainTesting(ODLTesting):
def _test_run_suites(self, status, *args):
kwargs = self._get_run_suites_kwargs()
self.assertEqual(self.test.run_suites(**kwargs), status)
- if len(args) > 0:
+ if args:
args[0].assert_called_once_with(self.test.odl_variables_file)
if len(args) > 1:
variable = [
- 'KEYSTONEURL:{}://{}'.format(
- urllib.parse.urlparse(self._os_auth_url).scheme,
- urllib.parse.urlparse(self._os_auth_url).netloc),
- 'NEUTRONURL:{}'.format(self._neutron_url),
- 'OS_AUTH_URL:"{}"'.format(self._os_auth_url),
- 'OSUSERNAME:"{}"'.format(self._os_username),
- 'OSUSERDOMAINNAME:"{}"'.format(self._os_userdomainname),
- 'OSTENANTNAME:"{}"'.format(self._os_projectname),
- 'OSPROJECTDOMAINNAME:"{}"'.format(self._os_projectdomainname),
- 'OSPASSWORD:"{}"'.format(self._os_password),
- 'ODL_SYSTEM_IP:{}'.format(self._sdn_controller_ip),
- 'PORT:{}'.format(self._odl_webport),
- 'RESTCONFPORT:{}'.format(self._odl_restconfport)]
+ ('KEYSTONEURL:'
+ f'{urllib.parse.urlparse(self._os_auth_url).scheme}://'
+ f'{urllib.parse.urlparse(self._os_auth_url).netloc}'),
+ f'NEUTRONURL:{self._neutron_url}',
+ f'OS_AUTH_URL:"{self._os_auth_url}"',
+ f'OSUSERNAME:"{self._os_username}"',
+ f'OSUSERDOMAINNAME:"{self._os_userdomainname}"',
+ f'OSTENANTNAME:"{self._os_projectname}"',
+ f'OSPROJECTDOMAINNAME:"{self._os_projectdomainname}"',
+ f'OSPASSWORD:"{self._os_password}"',
+ f'ODL_SYSTEM_IP:{self._sdn_controller_ip}',
+ f'PORT:{self._odl_webport}',
+ f'RESTCONFPORT:{self._odl_restconfport}']
args[1].assert_called_once_with(
- odl.ODLTests.basic_suite_dir,
- odl.ODLTests.neutron_suite_dir,
+ odl.ODLTests.basic_suite_dir, odl.ODLTests.neutron_suite_dir,
+ include=[],
log='NONE',
output=os.path.join(self.test.res_dir, 'output.xml'),
- report='NONE',
- stdout=mock.ANY,
- variable=variable)
+ report='NONE', stdout=mock.ANY, variable=variable,
+ variablefile=[])
def _test_no_keyword(self, key):
kwargs = self._get_run_suites_kwargs(key)
@@ -223,6 +224,7 @@ class ODLMainTesting(ODLTesting):
self._odl_username, self._odl_password)
args[0].assert_called_once_with(self.test.odl_variables_file)
+ @mock.patch('os.makedirs')
@mock.patch('robot.run', side_effect=RobotError)
@mock.patch('os.path.isfile', return_value=True)
def test_run_ko(self, *args):
@@ -231,6 +233,7 @@ class ODLMainTesting(ODLTesting):
self.assertRaises(RobotError):
self._test_run_suites(testcase.TestCase.EX_RUN_ERROR, *args)
+ @mock.patch('os.makedirs')
@mock.patch('robot.run')
@mock.patch('os.path.isfile', return_value=True)
def test_parse_results_ko(self, *args):
@@ -240,97 +243,214 @@ class ODLMainTesting(ODLTesting):
side_effect=RobotError):
self._test_run_suites(testcase.TestCase.EX_RUN_ERROR, *args)
+ @mock.patch('os.makedirs')
+ @mock.patch('robot.run')
+ @mock.patch('os.path.isfile', return_value=True)
+ def test_generate_report_ko(self, *args):
+ with mock.patch.object(self.test, 'set_robotframework_vars',
+ return_value=True), \
+ mock.patch.object(self.test, 'parse_results'), \
+ mock.patch.object(self.test, 'generate_report',
+ return_value=1):
+ self._test_run_suites(testcase.TestCase.EX_OK, *args)
+
+ @mock.patch('os.makedirs')
+ @mock.patch('robot.run')
+ @mock.patch('os.path.isfile', return_value=True)
+ def test_generate_report_exc(self, *args):
+ with mock.patch.object(self.test, 'set_robotframework_vars',
+ return_value=True), \
+ mock.patch.object(self.test, 'parse_results'), \
+ mock.patch.object(self.test, 'generate_report',
+ side_effect=Exception):
+ self._test_run_suites(testcase.TestCase.EX_RUN_ERROR, *args)
+
+ @mock.patch('os.makedirs')
@mock.patch('robot.run')
@mock.patch('os.path.isfile', return_value=True)
def test_ok(self, *args):
with mock.patch.object(self.test, 'set_robotframework_vars',
return_value=True), \
- mock.patch.object(self.test, 'parse_results'):
+ mock.patch.object(self.test, 'parse_results'), \
+ mock.patch.object(self.test, 'generate_report',
+ return_value=0):
self._test_run_suites(testcase.TestCase.EX_OK, *args)
+ @mock.patch('os.makedirs')
@mock.patch('robot.run')
@mock.patch('os.path.isfile', return_value=False)
def test_ok_no_creds(self, *args):
with mock.patch.object(self.test, 'set_robotframework_vars',
return_value=True) as mock_method, \
- mock.patch.object(self.test, 'parse_results'):
+ mock.patch.object(self.test, 'parse_results'), \
+ mock.patch.object(self.test, 'generate_report',
+ return_value=0):
self._test_run_suites(testcase.TestCase.EX_OK, *args)
mock_method.assert_not_called()
+ @mock.patch('os.makedirs')
@mock.patch('robot.run', return_value=1)
@mock.patch('os.path.isfile', return_value=True)
def test_testcases_in_failure(self, *args):
with mock.patch.object(self.test, 'set_robotframework_vars',
return_value=True), \
- mock.patch.object(self.test, 'parse_results'):
+ mock.patch.object(self.test, 'parse_results'), \
+ mock.patch.object(self.test, 'generate_report',
+ return_value=0):
self._test_run_suites(testcase.TestCase.EX_OK, *args)
class ODLRunTesting(ODLTesting):
-
"""The class testing ODLTests.run()."""
- # pylint: disable=missing-docstring
-
- def _test_no_env_var(self, var):
- with mock.patch('functest.utils.openstack_utils.get_endpoint',
- return_value=ODLTesting._neutron_url):
- del os.environ[var]
- self.assertEqual(self.test.run(),
- testcase.TestCase.EX_RUN_ERROR)
-
+ # pylint: disable=too-many-public-methods,missing-docstring
+
+ @mock.patch('os_client_config.make_shade', side_effect=Exception)
+ def test_no_cloud(self, *args):
+ self.assertEqual(self.test.run(), testcase.TestCase.EX_RUN_ERROR)
+ args[0].assert_called_once_with()
+
+ @mock.patch('os_client_config.make_shade')
+ def test_no_service1(self, *args):
+ args[0].return_value.search_services.return_value = None
+ self.assertEqual(self.test.run(), testcase.TestCase.EX_RUN_ERROR)
+ args[0].return_value.search_services.assert_called_once_with('neutron')
+ args[0].return_value.search_endpoints.assert_not_called()
+
+ @mock.patch('os_client_config.make_shade')
+ def test_no_service2(self, *args):
+ args[0].return_value.search_services.return_value = []
+ self.assertEqual(self.test.run(), testcase.TestCase.EX_RUN_ERROR)
+ args[0].return_value.search_services.assert_called_once_with('neutron')
+ args[0].return_value.search_endpoints.assert_not_called()
+
+ @mock.patch('os_client_config.make_shade')
+ def test_no_service3(self, *args):
+ args[0].return_value.search_services.return_value = [
+ munch.Munch()]
+ self.assertEqual(self.test.run(), testcase.TestCase.EX_RUN_ERROR)
+ args[0].return_value.search_services.assert_called_once_with('neutron')
+ args[0].return_value.search_endpoints.assert_not_called()
+
+ @mock.patch('os_client_config.make_shade')
+ def test_no_endpoint1(self, *args):
+ args[0].return_value.search_services.return_value = [
+ munch.Munch(id=self._neutron_id)]
+ args[0].return_value.search_endpoints.return_value = None
+ self.assertEqual(self.test.run(), testcase.TestCase.EX_RUN_ERROR)
+ args[0].return_value.search_services.assert_called_once_with('neutron')
+ args[0].return_value.search_endpoints.assert_called_once_with(
+ filters={'interface': self._os_interface,
+ 'service_id': self._neutron_id})
+
+ @mock.patch('os_client_config.make_shade')
+ def test_no_endpoint2(self, *args):
+ args[0].return_value.search_services.return_value = [
+ munch.Munch(id=self._neutron_id)]
+ args[0].return_value.search_endpoints.return_value = []
+ self.assertEqual(self.test.run(), testcase.TestCase.EX_RUN_ERROR)
+ args[0].return_value.search_services.assert_called_once_with('neutron')
+ args[0].return_value.search_endpoints.assert_called_once_with(
+ filters={'interface': self._os_interface,
+ 'service_id': self._neutron_id})
+
+ @mock.patch('os_client_config.make_shade')
+ def test_no_endpoint3(self, *args):
+ args[0].return_value.search_services.return_value = [
+ munch.Munch(id=self._neutron_id)]
+ args[0].return_value.search_endpoints.return_value = [munch.Munch()]
+ self.assertEqual(self.test.run(), testcase.TestCase.EX_RUN_ERROR)
+ args[0].return_value.search_services.assert_called_once_with('neutron')
+ args[0].return_value.search_endpoints.assert_called_once_with(
+ filters={'interface': self._os_interface,
+ 'service_id': self._neutron_id})
+
+ @mock.patch('os_client_config.make_shade')
+ def test_endpoint_interface(self, *args):
+ args[0].return_value.search_services.return_value = [
+ munch.Munch(id=self._neutron_id)]
+ args[0].return_value.search_endpoints.return_value = [munch.Munch()]
+ self.assertEqual(self.test.run(), testcase.TestCase.EX_RUN_ERROR)
+ args[0].return_value.search_services.assert_called_once_with('neutron')
+ args[0].return_value.search_endpoints.assert_called_once_with(
+ filters={'interface': self._os_interface,
+ 'service_id': self._neutron_id})
+
+ @mock.patch('os_client_config.make_shade')
+ def _test_no_env_var(self, var, *args):
+ del os.environ[var]
+ self.assertEqual(self.test.run(), testcase.TestCase.EX_RUN_ERROR)
+ args[0].assert_called_once_with()
+
+ @mock.patch('os_client_config.make_shade')
+ def _test_missing_value(self, *args):
+ self.assertEqual(self.test.run(), testcase.TestCase.EX_RUN_ERROR)
+ args[0].assert_called_once_with()
+
+ @mock.patch('os_client_config.make_shade')
def _test_run(self, status=testcase.TestCase.EX_OK,
- exception=None, **kwargs):
+ exception=None, *args, **kwargs):
+ # pylint: disable=keyword-arg-before-vararg
+ args[0].return_value.search_services.return_value = [
+ munch.Munch(id=self._neutron_id)]
+ args[0].return_value.search_endpoints.return_value = [
+ munch.Munch(url=self._neutron_url)]
odlip = kwargs['odlip'] if 'odlip' in kwargs else '127.0.0.3'
odlwebport = kwargs['odlwebport'] if 'odlwebport' in kwargs else '8080'
odlrestconfport = (kwargs['odlrestconfport']
if 'odlrestconfport' in kwargs else '8181')
-
- with mock.patch('functest.utils.openstack_utils.get_endpoint',
- return_value=ODLTesting._neutron_url):
- if exception:
- self.test.run_suites = mock.Mock(side_effect=exception)
- else:
- self.test.run_suites = mock.Mock(return_value=status)
- self.assertEqual(self.test.run(), status)
- self.test.run_suites.assert_called_once_with(
- odl.ODLTests.default_suites,
- neutronurl=self._neutron_url,
- odlip=odlip, odlpassword=self._odl_password,
- odlrestconfport=odlrestconfport,
- odlusername=self._odl_username, odlwebport=odlwebport,
- osauthurl=self._os_auth_url,
- ospassword=self._os_password,
- osprojectname=self._os_projectname,
- osusername=self._os_username,
- osprojectdomainname=self._os_projectdomainname,
- osuserdomainname=self._os_userdomainname)
-
+ if exception:
+ self.test.run_suites = mock.Mock(side_effect=exception)
+ else:
+ self.test.run_suites = mock.Mock(return_value=status)
+ self.assertEqual(self.test.run(), status)
+ self.test.run_suites.assert_called_once_with(
+ odl.ODLTests.default_suites, neutronurl=self._neutron_url,
+ odlip=odlip, odlpassword=self._odl_password,
+ odlrestconfport=odlrestconfport, odlusername=self._odl_username,
+ odlwebport=odlwebport, osauthurl=self._os_auth_url,
+ ospassword=self._os_password, osprojectname=self._os_projectname,
+ osusername=self._os_username,
+ osprojectdomainname=self._os_projectdomainname,
+ osuserdomainname=self._os_userdomainname)
+ args[0].assert_called_once_with()
+ args[0].return_value.search_services.assert_called_once_with('neutron')
+ args[0].return_value.search_endpoints.assert_called_once_with(
+ filters={
+ 'interface': os.environ.get(
+ "OS_INTERFACE", "public").replace('URL', ''),
+ 'service_id': self._neutron_id})
+
+ @mock.patch('os_client_config.make_shade')
def _test_multiple_suites(self, suites,
- status=testcase.TestCase.EX_OK, **kwargs):
+ status=testcase.TestCase.EX_OK, *args, **kwargs):
+ # pylint: disable=keyword-arg-before-vararg
+ args[0].return_value.search_endpoints.return_value = [
+ munch.Munch(url=self._neutron_url)]
+ args[0].return_value.search_services.return_value = [
+ munch.Munch(id=self._neutron_id)]
odlip = kwargs['odlip'] if 'odlip' in kwargs else '127.0.0.3'
odlwebport = kwargs['odlwebport'] if 'odlwebport' in kwargs else '8080'
odlrestconfport = (kwargs['odlrestconfport']
if 'odlrestconfport' in kwargs else '8181')
- with mock.patch('functest.utils.openstack_utils.get_endpoint',
- return_value=ODLTesting._neutron_url):
- self.test.run_suites = mock.Mock(return_value=status)
- self.assertEqual(self.test.run(suites=suites), status)
- self.test.run_suites.assert_called_once_with(
- suites,
- neutronurl=self._neutron_url,
- odlip=odlip, odlpassword=self._odl_password,
- odlrestconfport=odlrestconfport,
- odlusername=self._odl_username, odlwebport=odlwebport,
- osauthurl=self._os_auth_url,
- ospassword=self._os_password,
- osprojectname=self._os_projectname,
- osusername=self._os_username,
- osprojectdomainname=self._os_projectdomainname,
- osuserdomainname=self._os_userdomainname)
+ self.test.run_suites = mock.Mock(return_value=status)
+ self.assertEqual(self.test.run(suites=suites), status)
+ self.test.run_suites.assert_called_once_with(
+ suites, neutronurl=self._neutron_url, odlip=odlip,
+ odlpassword=self._odl_password, odlrestconfport=odlrestconfport,
+ odlusername=self._odl_username, odlwebport=odlwebport,
+ osauthurl=self._os_auth_url, ospassword=self._os_password,
+ osprojectname=self._os_projectname, osusername=self._os_username,
+ osprojectdomainname=self._os_projectdomainname,
+ osuserdomainname=self._os_userdomainname)
+ args[0].assert_called_once_with()
+ args[0].return_value.search_services.assert_called_once_with('neutron')
+ args[0].return_value.search_endpoints.assert_called_once_with(
+ filters={'interface': os.environ.get("OS_INTERFACE", "public"),
+ 'service_id': self._neutron_id})
def test_exc(self):
- with mock.patch('functest.utils.openstack_utils.get_endpoint',
- side_effect=auth_plugins.MissingAuthPlugin()):
+ with mock.patch('os_client_config.make_shade',
+ side_effect=Exception()):
self.assertEqual(self.test.run(),
testcase.TestCase.EX_RUN_ERROR)
@@ -348,105 +468,69 @@ class ODLRunTesting(ODLTesting):
def test_run_suites_false(self):
os.environ["SDN_CONTROLLER_IP"] = self._sdn_controller_ip
- self._test_run(testcase.TestCase.EX_RUN_ERROR,
+ self._test_run(testcase.TestCase.EX_RUN_ERROR, None,
odlip=self._sdn_controller_ip,
odlwebport=self._odl_webport)
def test_run_suites_exc(self):
with self.assertRaises(Exception):
os.environ["SDN_CONTROLLER_IP"] = self._sdn_controller_ip
- self._test_run(status=testcase.TestCase.EX_RUN_ERROR,
- exception=Exception(),
+ self._test_run(testcase.TestCase.EX_RUN_ERROR,
+ Exception(),
odlip=self._sdn_controller_ip,
odlwebport=self._odl_webport)
def test_no_sdn_controller_ip(self):
- with mock.patch('functest.utils.openstack_utils.get_endpoint',
- return_value=ODLTesting._neutron_url):
- self.assertEqual(self.test.run(),
- testcase.TestCase.EX_RUN_ERROR)
+ self._test_missing_value()
def test_without_installer_type(self):
os.environ["SDN_CONTROLLER_IP"] = self._sdn_controller_ip
- self._test_run(testcase.TestCase.EX_OK,
+ self._test_run(testcase.TestCase.EX_OK, None,
odlip=self._sdn_controller_ip,
odlwebport=self._odl_webport)
- def test_suites(self):
+ def test_without_os_interface(self):
+ del os.environ["OS_INTERFACE"]
os.environ["SDN_CONTROLLER_IP"] = self._sdn_controller_ip
- self._test_multiple_suites(
- [odl.ODLTests.basic_suite_dir],
- testcase.TestCase.EX_OK,
- odlip=self._sdn_controller_ip,
- odlwebport=self._odl_webport)
+ self._test_run(testcase.TestCase.EX_OK, None,
+ odlip=self._sdn_controller_ip,
+ odlwebport=self._odl_webport)
- def test_fuel(self):
- os.environ["INSTALLER_TYPE"] = "fuel"
- self._test_run(testcase.TestCase.EX_OK,
- odlip=urllib.parse.urlparse(self._neutron_url).hostname,
- odlwebport='8181',
- odlrestconfport='8282')
-
- def test_apex_no_controller_ip(self):
- with mock.patch('functest.utils.openstack_utils.get_endpoint',
- return_value=ODLTesting._neutron_url):
- os.environ["INSTALLER_TYPE"] = "apex"
- self.assertEqual(self.test.run(),
- testcase.TestCase.EX_RUN_ERROR)
+ def test_os_interface_public(self):
+ os.environ["OS_INTERFACE"] = "public"
+ os.environ["SDN_CONTROLLER_IP"] = self._sdn_controller_ip
+ self._test_run(testcase.TestCase.EX_OK, None,
+ odlip=self._sdn_controller_ip,
+ odlwebport=self._odl_webport)
- def test_apex(self):
+ def test_os_interface_publicurl(self):
+ os.environ["OS_INTERFACE"] = "publicURL"
os.environ["SDN_CONTROLLER_IP"] = self._sdn_controller_ip
- os.environ["INSTALLER_TYPE"] = "apex"
- self._test_run(testcase.TestCase.EX_OK,
- odlip=self._sdn_controller_ip, odlwebport='8081',
- odlrestconfport='8081')
-
- def test_netvirt_no_controller_ip(self):
- with mock.patch('functest.utils.openstack_utils.get_endpoint',
- return_value=ODLTesting._neutron_url):
- os.environ["INSTALLER_TYPE"] = "netvirt"
- self.assertEqual(self.test.run(),
- testcase.TestCase.EX_RUN_ERROR)
+ self._test_run(testcase.TestCase.EX_OK, None,
+ odlip=self._sdn_controller_ip,
+ odlwebport=self._odl_webport)
- def test_netvirt(self):
+ def test_os_interface_internal(self):
+ os.environ["OS_INTERFACE"] = "internal"
os.environ["SDN_CONTROLLER_IP"] = self._sdn_controller_ip
- os.environ["INSTALLER_TYPE"] = "netvirt"
- self._test_run(testcase.TestCase.EX_OK,
- odlip=self._sdn_controller_ip, odlwebport='8081',
- odlrestconfport='8081')
-
- def test_joid_no_controller_ip(self):
- with mock.patch('functest.utils.openstack_utils.get_endpoint',
- return_value=ODLTesting._neutron_url):
- os.environ["INSTALLER_TYPE"] = "joid"
- self.assertEqual(self.test.run(),
- testcase.TestCase.EX_RUN_ERROR)
+ self._test_run(testcase.TestCase.EX_OK, None,
+ odlip=self._sdn_controller_ip,
+ odlwebport=self._odl_webport)
- def test_joid(self):
- os.environ["SDN_CONTROLLER"] = self._sdn_controller_ip
- os.environ["INSTALLER_TYPE"] = "joid"
- self._test_run(testcase.TestCase.EX_OK,
- odlip=self._sdn_controller_ip, odlwebport='8080')
-
- def test_compass(self):
- os.environ["INSTALLER_TYPE"] = "compass"
- self._test_run(testcase.TestCase.EX_OK,
- odlip=urllib.parse.urlparse(self._neutron_url).hostname,
- odlrestconfport='8080')
-
- def test_daisy_no_controller_ip(self):
- with mock.patch('functest.utils.openstack_utils.get_endpoint',
- return_value=ODLTesting._neutron_url):
- os.environ["INSTALLER_TYPE"] = "daisy"
- self.assertEqual(self.test.run(),
- testcase.TestCase.EX_RUN_ERROR)
+ def test_os_interface_admin(self):
+ os.environ["OS_INTERFACE"] = "admin"
+ os.environ["SDN_CONTROLLER_IP"] = self._sdn_controller_ip
+ self._test_run(testcase.TestCase.EX_OK, None,
+ odlip=self._sdn_controller_ip,
+ odlwebport=self._odl_webport)
- def test_daisy(self):
+ def test_suites(self):
os.environ["SDN_CONTROLLER_IP"] = self._sdn_controller_ip
- os.environ["INSTALLER_TYPE"] = "daisy"
- self._test_run(testcase.TestCase.EX_OK,
- odlip=self._sdn_controller_ip, odlwebport='8181',
- odlrestconfport='8087')
+ self._test_multiple_suites(
+ [odl.ODLTests.basic_suite_dir],
+ testcase.TestCase.EX_OK,
+ odlip=self._sdn_controller_ip,
+ odlwebport=self._odl_webport)
class ODLArgParserTesting(ODLTesting):
@@ -456,7 +540,7 @@ class ODLArgParserTesting(ODLTesting):
def setUp(self):
self.parser = odl.ODLParser()
- super(ODLArgParserTesting, self).setUp()
+ super().setUp()
def test_default(self):
self.assertEqual(self.parser.parse_args(), self.defaultargs)
@@ -466,8 +550,8 @@ class ODLArgParserTesting(ODLTesting):
self.defaultargs['odlip'] = self._sdn_controller_ip
self.assertEqual(
self.parser.parse_args(
- ["--neutronurl={}".format(self._neutron_url),
- "--odlip={}".format(self._sdn_controller_ip)]),
+ [f"--neutronurl={self._neutron_url}",
+ f"--odlip={self._sdn_controller_ip}"]),
self.defaultargs)
@mock.patch('sys.stderr', new_callable=six.StringIO)
@@ -480,7 +564,7 @@ class ODLArgParserTesting(ODLTesting):
def _test_arg(self, arg, value):
self.defaultargs[arg] = value
self.assertEqual(
- self.parser.parse_args(["--{}={}".format(arg, value)]),
+ self.parser.parse_args([f"--{arg}={value}"]),
self.defaultargs)
def test_odlusername(self):
@@ -521,7 +605,7 @@ class ODLArgParserTesting(ODLTesting):
def test_pushtodb(self):
self.defaultargs['pushtodb'] = True
- self.assertEqual(self.parser.parse_args(["--{}".format('pushtodb')]),
+ self.assertEqual(self.parser.parse_args(["--pushtodb"]),
self.defaultargs)
def test_multiple_args(self):
@@ -529,8 +613,8 @@ class ODLArgParserTesting(ODLTesting):
self.defaultargs['odlip'] = self._sdn_controller_ip
self.assertEqual(
self.parser.parse_args(
- ["--neutronurl={}".format(self._neutron_url),
- "--odlip={}".format(self._sdn_controller_ip)]),
+ [f"--neutronurl={self._neutron_url}",
+ f"--odlip={self._sdn_controller_ip}"]),
self.defaultargs)
diff --git a/functest/cli/__init__.py b/functest/tests/unit/openstack/cinder/__init__.py
index e69de29bb..e69de29bb 100644
--- a/functest/cli/__init__.py
+++ b/functest/tests/unit/openstack/cinder/__init__.py
diff --git a/functest/tests/unit/openstack/cinder/test_cinder.py b/functest/tests/unit/openstack/cinder/test_cinder.py
new file mode 100644
index 000000000..d3c9cabb6
--- /dev/null
+++ b/functest/tests/unit/openstack/cinder/test_cinder.py
@@ -0,0 +1,270 @@
+#!/usr/bin/env python
+
+# Copyright (c) 2018 Enea AB and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+
+# pylint: disable=missing-docstring
+
+
+import logging
+import unittest
+
+import pkg_resources
+import mock
+import munch
+import shade
+
+from functest.opnfv_tests.openstack.cinder import cinder_test
+from functest.utils import config
+from functest.utils import env
+
+
+class CinderTesting(unittest.TestCase):
+
+ def setUp(self):
+ with mock.patch('functest.core.singlevm.SingleVm2.__init__'):
+ self.cinder = cinder_test.CinderCheck()
+ self.cinder.cloud = mock.Mock()
+ self.cinder.case_name = 'cinder'
+ self.cinder.guid = '1'
+
+ @mock.patch('functest.opnfv_tests.openstack.cinder.cinder_test.'
+ 'CinderCheck.connect')
+ @mock.patch('functest.core.singlevm.SingleVm2.prepare',
+ side_effect=Exception)
+ def test_prepare_exc1(self, *args):
+ self.cinder.cloud.boot_vm = mock.Mock()
+ with self.assertRaises(Exception):
+ self.cinder.prepare()
+ args[0].assert_called_once_with()
+ args[1].assert_not_called()
+ self.cinder.cloud.boot_vm.assert_not_called()
+ self.cinder.cloud.create_volume.assert_not_called()
+
+ @mock.patch('functest.opnfv_tests.openstack.cinder.cinder_test.'
+ 'CinderCheck.connect')
+ @mock.patch('functest.opnfv_tests.openstack.cinder.cinder_test.'
+ 'CinderCheck.boot_vm',
+ side_effect=Exception)
+ @mock.patch('functest.core.singlevm.SingleVm2.prepare')
+ def test_prepare_exc2(self, *args):
+ self.cinder.sec = munch.Munch(id='foo')
+ self.cinder.keypair = munch.Munch(id='foo')
+ self.cinder.volume_timeout = munch.Munch(id='foo')
+ with self.assertRaises(Exception):
+ self.cinder.prepare()
+ args[0].assert_called_with()
+ args[1].assert_called_once_with(
+ f'{self.cinder.case_name}-vm2_{self.cinder.guid}',
+ security_groups=[self.cinder.sec.id],
+ key_name=self.cinder.keypair.id)
+ self.cinder.cloud.create_volume.assert_not_called()
+ args[2].assert_not_called()
+
+ @mock.patch('functest.opnfv_tests.openstack.cinder.cinder_test.'
+ 'CinderCheck.boot_vm', return_value=munch.Munch(id='vm2'))
+ @mock.patch('functest.core.singlevm.SingleVm2.prepare')
+ def test_prepare(self, *args):
+ self.cinder.sec = munch.Munch(id='foo')
+ self.cinder.keypair = munch.Munch(id='foo')
+ self.cinder.ext_net = mock.Mock(id='foo')
+ self.cinder.ssh2 = mock.Mock()
+ self.cinder.fip2 = munch.Munch(id='fip2')
+ self.cinder.connect = mock.Mock(
+ return_value=(self.cinder.fip2, self.cinder.ssh2))
+ self.cinder.cloud.create_volume = mock.Mock(
+ return_value=munch.Munch())
+ self.cinder.prepare()
+ args[0].assert_called_once_with()
+ args[1].assert_called_once_with(
+ f'{self.cinder.case_name}-vm2_{self.cinder.guid}',
+ security_groups=[self.cinder.sec.id],
+ key_name=self.cinder.keypair.id)
+ self.cinder.connect.assert_called_once_with(args[1].return_value)
+ self.cinder.cloud.create_volume.assert_called_once_with(
+ name=f'{self.cinder.case_name}-volume_{self.cinder.guid}',
+ size='2', timeout=self.cinder.volume_timeout, wait=True)
+
+ @mock.patch('scp.SCPClient.put')
+ def test_write(self, *args):
+ # pylint: disable=protected-access
+ self.cinder.ssh = mock.Mock()
+ self.cinder.sshvm = mock.Mock(id='foo')
+ self.cinder.volume = mock.Mock(id='volume')
+ stdout = mock.Mock()
+ stdout.channel.recv_exit_status.return_value = 0
+ self.cinder.ssh.exec_command.return_value = (None, stdout, mock.Mock())
+ self.assertEqual(self.cinder._write_data(), 0)
+ self.cinder.ssh.exec_command.assert_called_once_with(
+ f"sh ~/write_data.sh {env.get('VOLUME_DEVICE_NAME')}")
+ self.cinder.cloud.attach_volume.assert_called_once_with(
+ self.cinder.sshvm, self.cinder.volume,
+ timeout=self.cinder.volume_timeout)
+ self.cinder.cloud.detach_volume.assert_called_once_with(
+ self.cinder.sshvm, self.cinder.volume,
+ timeout=self.cinder.volume_timeout)
+ args[0].assert_called_once_with(
+ pkg_resources.resource_filename(
+ 'functest.opnfv_tests.openstack.cinder', 'write_data.sh'),
+ remote_path="~/")
+
+ @mock.patch('scp.SCPClient.put', side_effect=Exception)
+ def test_write_exc1(self, *args):
+ # pylint: disable=protected-access
+ self.cinder.ssh = mock.Mock()
+ self.cinder.sshvm = mock.Mock(id='foo')
+ self.cinder.cloud.attach_volume = mock.Mock()
+ self.assertEqual(
+ self.cinder._write_data(), self.cinder.EX_RUN_ERROR)
+ args[0].assert_called_once_with(
+ pkg_resources.resource_filename(
+ 'functest.opnfv_tests.openstack.cinder', 'write_data.sh'),
+ remote_path="~/")
+
+ @mock.patch('scp.SCPClient.put')
+ def test_read(self, *args):
+ # pylint: disable=protected-access
+ self.cinder.ssh2 = mock.Mock()
+ self.cinder.vm2 = mock.Mock(id='foo')
+ self.cinder.volume = mock.Mock(id='volume')
+ stdout = mock.Mock()
+ self.cinder.ssh2.exec_command.return_value = (
+ None, stdout, mock.Mock())
+ stdout.channel.recv_exit_status.return_value = 0
+ self.assertEqual(self.cinder._read_data(), 0)
+ self.cinder.ssh2.exec_command.assert_called_once_with(
+ f"sh ~/read_data.sh {env.get('VOLUME_DEVICE_NAME')}")
+ self.cinder.cloud.attach_volume.assert_called_once_with(
+ self.cinder.vm2, self.cinder.volume,
+ timeout=self.cinder.volume_timeout)
+ self.cinder.cloud.detach_volume.assert_called_once_with(
+ self.cinder.vm2, self.cinder.volume,
+ timeout=self.cinder.volume_timeout)
+ args[0].assert_called_once_with(
+ pkg_resources.resource_filename(
+ 'functest.opnfv_tests.openstack.cinder', 'read_data.sh'),
+ remote_path="~/")
+
+ @mock.patch('scp.SCPClient.put', side_effect=Exception)
+ def test_read_exc1(self, *args):
+ # pylint: disable=protected-access
+ self.cinder.ssh = mock.Mock()
+ self.cinder.ssh2 = mock.Mock()
+ self.cinder.sshvm = mock.Mock(id='foo')
+ self.cinder.cloud.attach_volume = mock.Mock()
+ self.assertEqual(
+ self.cinder._read_data(), self.cinder.EX_RUN_ERROR)
+ args[0].assert_called_once_with(
+ pkg_resources.resource_filename(
+ 'functest.opnfv_tests.openstack.cinder', 'read_data.sh'),
+ remote_path="~/")
+
+ def test_execute_exc1(self):
+ # pylint: disable=protected-access
+ self.cinder._write_data = mock.Mock(side_effect=Exception)
+ self.cinder._read_data = mock.Mock()
+ with self.assertRaises(Exception):
+ self.cinder.execute()
+ self.cinder._write_data.assert_called_once_with()
+ self.cinder._read_data.assert_not_called()
+
+ def test_execute_exc2(self):
+ # pylint: disable=protected-access
+ self.cinder._write_data = mock.Mock(return_value=0)
+ self.cinder._read_data = mock.Mock(side_effect=Exception)
+ with self.assertRaises(Exception):
+ self.cinder.execute()
+ self.cinder._write_data.assert_called_once_with()
+ self.cinder._read_data.assert_called_once_with()
+
+ def test_execute_res1(self):
+ # pylint: disable=protected-access
+ self.cinder._write_data = mock.Mock(return_value=1)
+ self.cinder._read_data = mock.Mock()
+ self.assertEqual(self.cinder.execute(), 1)
+ self.cinder._write_data.assert_called_once_with()
+ self.cinder._read_data.assert_not_called()
+
+ def test_execute_res2(self):
+ # pylint: disable=protected-access
+ self.cinder._write_data = mock.Mock(return_value=0)
+ self.cinder._read_data = mock.Mock(return_value=1)
+ self.assertEqual(self.cinder.execute(), 1)
+ self.cinder._write_data.assert_called_once_with()
+ self.cinder._read_data.assert_called_once_with()
+
+ def test_execute_res3(self):
+ # pylint: disable=protected-access
+ self.cinder._write_data = mock.Mock(return_value=0)
+ self.cinder._read_data = mock.Mock(return_value=0)
+ self.assertEqual(self.cinder.execute(), 0)
+ self.cinder._write_data.assert_called_once_with()
+ self.cinder._read_data.assert_called_once_with()
+
+ def test_clean_exc1(self):
+ self.cinder.cloud = None
+ with self.assertRaises(AssertionError):
+ self.cinder.clean()
+
+ @mock.patch('functest.core.singlevm.SingleVm2.clean')
+ def test_clean_exc2(self, *args):
+ self.cinder.vm2 = munch.Munch(id='vm2')
+ self.cinder.cloud.delete_server = mock.Mock(
+ side_effect=shade.OpenStackCloudException("Foo"))
+ with self.assertRaises(shade.OpenStackCloudException):
+ self.cinder.clean()
+ self.cinder.cloud.delete_server.assert_called_once_with(
+ self.cinder.vm2, wait=True,
+ timeout=getattr(config.CONF, 'vping_vm_delete_timeout'))
+ self.cinder.cloud.delete_floating_ip.assert_not_called()
+ self.cinder.cloud.delete_volume.assert_not_called()
+ args[0].assert_not_called()
+
+ @mock.patch('functest.core.singlevm.SingleVm2.clean',
+ side_effect=Exception)
+ def test_clean_exc3(self, mock_clean):
+ self.cinder.vm2 = munch.Munch(id='vm2')
+ self.cinder.volume = munch.Munch(id='volume')
+ self.cinder.fip2 = munch.Munch(id='fip2')
+ with self.assertRaises(Exception):
+ self.cinder.clean()
+ self.cinder.cloud.delete_server.assert_called_once_with(
+ self.cinder.vm2, wait=True,
+ timeout=getattr(config.CONF, 'vping_vm_delete_timeout'))
+ self.cinder.cloud.delete_floating_ip.assert_called_once_with(
+ self.cinder.fip2.id)
+ self.cinder.cloud.delete_volume.assert_called_once_with(
+ self.cinder.volume.id)
+ mock_clean.prepare()
+
+ @mock.patch('functest.core.singlevm.SingleVm2.clean')
+ def test_clean(self, *args):
+ self.cinder.vm2 = munch.Munch(id='vm2')
+ self.cinder.volume = munch.Munch(id='volume')
+ self.cinder.fip2 = munch.Munch(id='fip2')
+ self.cinder.clean()
+ self.cinder.cloud.delete_server.assert_called_once_with(
+ self.cinder.vm2, wait=True,
+ timeout=getattr(config.CONF, 'vping_vm_delete_timeout'))
+ self.cinder.cloud.delete_floating_ip.assert_called_once_with(
+ self.cinder.fip2.id)
+ self.cinder.cloud.delete_volume.assert_called_once_with(
+ self.cinder.volume.id)
+ args[0].assert_called_once_with()
+
+ @mock.patch('functest.core.singlevm.SingleVm2.clean')
+ def test_clean2(self, *args):
+ self.cinder.clean()
+ self.cinder.cloud.delete_server.assert_not_called()
+ self.cinder.cloud.delete_floating_ip.assert_not_called()
+ self.cinder.cloud.delete_volume.assert_not_called()
+ args[0].assert_called_once_with()
+
+
+if __name__ == '__main__':
+ logging.disable(logging.CRITICAL)
+ unittest.main(verbosity=2)
diff --git a/functest/tests/unit/openstack/rally/test_rally.py b/functest/tests/unit/openstack/rally/test_rally.py
index 450eb85bc..f3c2e7cf6 100644
--- a/functest/tests/unit/openstack/rally/test_rally.py
+++ b/functest/tests/unit/openstack/rally/test_rally.py
@@ -5,46 +5,52 @@
# which accompanies this distribution, and is available at
# http://www.apache.org/licenses/LICENSE-2.0
+# pylint: disable=missing-docstring,protected-access,invalid-name
+
import json
import logging
import os
+import subprocess
import unittest
import mock
+import munch
+from xtesting.core import testcase
-from functest.core import testcase
from functest.opnfv_tests.openstack.rally import rally
-from functest.utils.constants import CONST
-
-from snaps.openstack.os_credentials import OSCreds
+from functest.utils import config
class OSRallyTesting(unittest.TestCase):
+ # pylint: disable=too-many-public-methods
def setUp(self):
- os_creds = OSCreds(
- username='user', password='pass',
- auth_url='http://foo.com:5000/v3', project_name='bar')
- with mock.patch('snaps.openstack.tests.openstack_tests.'
- 'get_credentials', return_value=os_creds) as m:
+ with mock.patch('os_client_config.get_config') as mock_get_config, \
+ mock.patch('shade.OpenStackCloud') as mock_shade, \
+ mock.patch('functest.core.tenantnetwork.NewProject') \
+ as mock_new_project:
self.rally_base = rally.RallyBase()
- self.polling_iter = 2
- self.assertTrue(m.called)
+ self.rally_base.image = munch.Munch(name='foo')
+ self.rally_base.flavor = munch.Munch(name='foo')
+ self.rally_base.flavor_alt = munch.Munch(name='bar')
+ self.assertTrue(mock_get_config.called)
+ self.assertTrue(mock_shade.called)
+ self.assertTrue(mock_new_project.called)
def test_build_task_args_missing_floating_network(self):
- CONST.__setattr__('OS_AUTH_URL', None)
- self.rally_base.ext_net_name = ''
- task_args = self.rally_base._build_task_args('test_file_name')
+ os.environ['OS_AUTH_URL'] = ''
+ self.rally_base.ext_net = None
+ task_args = self.rally_base.build_task_args('test_name')
self.assertEqual(task_args['floating_network'], '')
def test_build_task_args_missing_net_id(self):
- CONST.__setattr__('OS_AUTH_URL', None)
- self.rally_base.priv_net_id = ''
- task_args = self.rally_base._build_task_args('test_file_name')
+ os.environ['OS_AUTH_URL'] = ''
+ self.rally_base.network = None
+ task_args = self.rally_base.build_task_args('test_name')
self.assertEqual(task_args['netid'], '')
@staticmethod
def check_scenario_file(value):
- yaml_file = 'opnfv-{}.yaml'.format('test_file_name')
+ yaml_file = 'opnfv-test_file_name.yaml'
if yaml_file in value:
return False
return True
@@ -58,126 +64,128 @@ class OSRallyTesting(unittest.TestCase):
@staticmethod
def check_temp_dir(value):
- yaml_file = 'opnfv-{}.yaml'.format('test_file_name')
+ yaml_file = 'opnfv-test_file_name.yaml'
if yaml_file in value:
return True
return False
+ @mock.patch('functest.opnfv_tests.openstack.rally.rally.'
+ 'RallyBase.get_verifier_deployment_id', return_value='foo')
+ @mock.patch('subprocess.check_output')
+ def test_create_rally_deployment(self, mock_exec, mock_get_id):
+ # pylint: disable=unused-argument
+ self.assertEqual(rally.RallyBase.create_rally_deployment(), 'foo')
+ calls = [
+ mock.call(['rally', 'deployment', 'destroy', '--deployment',
+ str(getattr(config.CONF, 'rally_deployment_name'))]),
+ mock.call().decode("utf-8"),
+ mock.call(['rally', 'deployment', 'create', '--fromenv', '--name',
+ str(getattr(config.CONF, 'rally_deployment_name'))],
+ env=None),
+ mock.call().decode("utf-8"),
+ mock.call(['rally', 'deployment', 'check']),
+ mock.call().decode("utf-8")]
+ mock_exec.assert_has_calls(calls)
+
@mock.patch('functest.opnfv_tests.openstack.rally.rally.os.path.exists')
@mock.patch('functest.opnfv_tests.openstack.rally.rally.os.makedirs')
@mock.patch('functest.opnfv_tests.openstack.rally.rally.RallyBase.'
- '_apply_blacklist')
+ 'apply_blacklist')
def test_prepare_test_list_missing_temp_dir(
self, mock_method, mock_os_makedirs, mock_path_exists):
mock_path_exists.side_effect = self.check_temp_dir
- yaml_file = 'opnfv-{}.yaml'.format('test_file_name')
- ret_val = os.path.join(self.rally_base.TEMP_DIR, yaml_file)
+ yaml_file = 'opnfv-test_file_name.yaml'
+ ret_val = os.path.join(self.rally_base.temp_dir, yaml_file)
self.assertEqual(self.rally_base._prepare_test_list('test_file_name'),
ret_val)
mock_path_exists.assert_called()
mock_method.assert_called()
mock_os_makedirs.assert_called()
- def test_get_task_id_default(self):
- cmd_raw = 'Task 1: started'
- self.assertEqual(self.rally_base.get_task_id(cmd_raw),
- '1')
+ @mock.patch('subprocess.check_output', return_value=b'1\n')
+ def test_get_task_id_default(self, *args):
+ tag = 'nova'
+ self.assertEqual(self.rally_base.get_task_id(tag), '1')
+ args[0].assert_called_with(
+ ['rally', 'task', 'list', '--tag', tag, '--uuids-only'])
- def test_get_task_id_missing_id(self):
- cmd_raw = ''
- self.assertEqual(self.rally_base.get_task_id(cmd_raw),
- None)
+ @mock.patch('subprocess.check_output', return_value=b'\n')
+ def test_get_task_id_missing_id(self, *args):
+ tag = 'nova'
+ self.assertEqual(self.rally_base.get_task_id(tag), '')
+ args[0].assert_called_with(
+ ['rally', 'task', 'list', '--tag', tag, '--uuids-only'])
def test_task_succeed_fail(self):
- json_raw = json.dumps([None])
+ json_raw = json.dumps({})
self.assertEqual(self.rally_base.task_succeed(json_raw),
False)
- json_raw = json.dumps([{'result': [{'error': ['test_error']}]}])
+ json_raw = json.dumps({'tasks': [{'status': 'crashed'}]})
self.assertEqual(self.rally_base.task_succeed(json_raw),
False)
def test_task_succeed_success(self):
- json_raw = json.dumps('')
+ json_raw = json.dumps({'tasks': [{'status': 'finished',
+ 'pass_sla': True}]})
self.assertEqual(self.rally_base.task_succeed(json_raw),
True)
- def polling(self):
- if self.polling_iter == 0:
- return "something"
- self.polling_iter -= 1
- return None
-
- def test_get_cmd_output(self):
- proc = mock.Mock()
- attrs = {'poll.side_effect': self.polling,
- 'stdout.readline.return_value': 'line'}
- proc.configure_mock(**attrs)
- self.assertEqual(self.rally_base.get_cmd_output(proc),
- 'lineline')
-
- @mock.patch('__builtin__.open', mock.mock_open())
+ @mock.patch('six.moves.builtins.open', mock.mock_open())
@mock.patch('functest.opnfv_tests.openstack.rally.rally.yaml.safe_load',
return_value={'scenario': [
{'scenarios': ['test_scenario'],
- 'installers': ['test_installer'],
'tests': ['test']},
{'scenarios': ['other_scenario'],
- 'installers': ['test_installer'],
'tests': ['other_test']}]})
def test_excl_scenario_default(self, mock_func):
- CONST.__setattr__('INSTALLER_TYPE', 'test_installer')
- CONST.__setattr__('DEPLOY_SCENARIO', 'test_scenario')
+ os.environ['INSTALLER_TYPE'] = 'test_installer'
+ os.environ['DEPLOY_SCENARIO'] = 'test_scenario'
self.assertEqual(self.rally_base.excl_scenario(), ['test'])
mock_func.assert_called()
- @mock.patch('__builtin__.open', mock.mock_open())
+ @mock.patch('six.moves.builtins.open', mock.mock_open())
@mock.patch('functest.opnfv_tests.openstack.rally.rally.yaml.safe_load',
return_value={'scenario': [
{'scenarios': ['^os-[^-]+-featT-modeT$'],
- 'installers': ['test_installer'],
'tests': ['test1']},
{'scenarios': ['^os-ctrlT-[^-]+-modeT$'],
- 'installers': ['test_installer'],
'tests': ['test2']},
{'scenarios': ['^os-ctrlT-featT-[^-]+$'],
- 'installers': ['test_installer'],
'tests': ['test3']},
{'scenarios': ['^os-'],
- 'installers': ['test_installer'],
'tests': ['test4']},
{'scenarios': ['other_scenario'],
- 'installers': ['test_installer'],
'tests': ['test0a']},
{'scenarios': [''], # empty scenario
- 'installers': ['test_installer'],
'tests': ['test0b']}]})
def test_excl_scenario_regex(self, mock_func):
- CONST.__setattr__('INSTALLER_TYPE', 'test_installer')
- CONST.__setattr__('DEPLOY_SCENARIO', 'os-ctrlT-featT-modeT')
+ os.environ['DEPLOY_SCENARIO'] = 'os-ctrlT-featT-modeT'
self.assertEqual(self.rally_base.excl_scenario(),
['test1', 'test2', 'test3', 'test4'])
mock_func.assert_called()
- @mock.patch('__builtin__.open', side_effect=Exception)
+ @mock.patch('six.moves.builtins.open', side_effect=Exception)
def test_excl_scenario_exception(self, mock_open):
self.assertEqual(self.rally_base.excl_scenario(), [])
mock_open.assert_called()
- @mock.patch('__builtin__.open', mock.mock_open())
+ @mock.patch('six.moves.builtins.open', mock.mock_open())
@mock.patch('functest.opnfv_tests.openstack.rally.rally.yaml.safe_load',
return_value={'functionality': [
{'functions': ['no_migration'], 'tests': ['test']}]})
@mock.patch('functest.opnfv_tests.openstack.rally.rally.RallyBase.'
'_migration_supported', return_value=False)
- def test_excl_func_default(self, mock_func, mock_yaml_load):
- CONST.__setattr__('INSTALLER_TYPE', 'test_installer')
- CONST.__setattr__('DEPLOY_SCENARIO', 'test_scenario')
+ @mock.patch('functest.opnfv_tests.openstack.rally.rally.RallyBase.'
+ '_network_trunk_supported', return_value=False)
+ def test_excl_func_default(self, mock_trunk, mock_func, mock_yaml_load):
+ os.environ['DEPLOY_SCENARIO'] = 'test_scenario'
self.assertEqual(self.rally_base.excl_func(), ['test'])
mock_func.assert_called()
+ mock_trunk.assert_called()
mock_yaml_load.assert_called()
- @mock.patch('__builtin__.open', side_effect=Exception)
+ @mock.patch('six.moves.builtins.open', side_effect=Exception)
def test_excl_func_exception(self, mock_open):
self.assertEqual(self.rally_base.excl_func(), [])
mock_open.assert_called()
@@ -200,61 +208,51 @@ class OSRallyTesting(unittest.TestCase):
return_value=False)
def test_run_task_missing_task_file(self, mock_path_exists):
with self.assertRaises(Exception):
- self.rally_base._run_task('test_name')
+ self.rally_base.prepare_run()
mock_path_exists.assert_called()
- @mock.patch('functest.opnfv_tests.openstack.rally.rally.os.path.exists',
- return_value=True)
@mock.patch('functest.opnfv_tests.openstack.rally.rally.RallyBase.'
'_prepare_test_list', return_value='test_file_name')
@mock.patch('functest.opnfv_tests.openstack.rally.rally.RallyBase.'
'file_is_empty', return_value=True)
@mock.patch('functest.opnfv_tests.openstack.rally.rally.LOGGER.info')
- def test_run_task_no_tests_for_scenario(self, mock_logger_info,
- mock_file_empty, mock_prep_list,
- mock_path_exists):
- self.rally_base._run_task('test_name')
+ def test_prepare_task_no_tests_for_scenario(
+ self, mock_logger_info, mock_file_empty, mock_prep_list):
+ self.rally_base.prepare_task('test_name')
mock_logger_info.assert_any_call('No tests for scenario \"%s\"',
'test_name')
mock_file_empty.assert_called()
mock_prep_list.assert_called()
- mock_path_exists.assert_called()
@mock.patch('functest.opnfv_tests.openstack.rally.rally.RallyBase.'
'_prepare_test_list', return_value='test_file_name')
@mock.patch('functest.opnfv_tests.openstack.rally.rally.RallyBase.'
'file_is_empty', return_value=False)
@mock.patch('functest.opnfv_tests.openstack.rally.rally.RallyBase.'
- '_build_task_args', return_value={})
- @mock.patch('functest.opnfv_tests.openstack.rally.rally.RallyBase.'
- '_get_output')
+ 'build_task_args', return_value={})
@mock.patch('functest.opnfv_tests.openstack.rally.rally.RallyBase.'
'get_task_id', return_value=None)
- @mock.patch('functest.opnfv_tests.openstack.rally.rally.RallyBase.'
- 'get_cmd_output', return_value='')
@mock.patch('functest.opnfv_tests.openstack.rally.rally.os.path.exists',
return_value=True)
@mock.patch('functest.opnfv_tests.openstack.rally.rally.subprocess.Popen')
@mock.patch('functest.opnfv_tests.openstack.rally.rally.LOGGER.error')
def test_run_task_taskid_missing(self, mock_logger_error, *args):
- self.rally_base._run_task('test_name')
- text = 'Failed to retrieve task_id, validating task...'
+ # pylint: disable=unused-argument
+ with self.assertRaises(Exception):
+ self.rally_base.run_task('test_name')
+ text = 'Failed to retrieve task_id'
mock_logger_error.assert_any_call(text)
- @mock.patch('__builtin__.open', mock.mock_open())
+ @mock.patch('six.moves.builtins.open', mock.mock_open())
@mock.patch('functest.opnfv_tests.openstack.rally.rally.RallyBase.'
'_prepare_test_list', return_value='test_file_name')
@mock.patch('functest.opnfv_tests.openstack.rally.rally.RallyBase.'
'file_is_empty', return_value=False)
@mock.patch('functest.opnfv_tests.openstack.rally.rally.RallyBase.'
- '_build_task_args', return_value={})
- @mock.patch('functest.opnfv_tests.openstack.rally.rally.RallyBase.'
- '_get_output')
+ 'build_task_args', return_value={})
@mock.patch('functest.opnfv_tests.openstack.rally.rally.RallyBase.'
'get_task_id', return_value='1')
@mock.patch('functest.opnfv_tests.openstack.rally.rally.RallyBase.'
- 'get_cmd_output', return_value='')
- @mock.patch('functest.opnfv_tests.openstack.rally.rally.RallyBase.'
'task_succeed', return_value=True)
@mock.patch('functest.opnfv_tests.openstack.rally.rally.os.path.exists',
return_value=True)
@@ -262,174 +260,207 @@ class OSRallyTesting(unittest.TestCase):
@mock.patch('functest.opnfv_tests.openstack.rally.rally.os.makedirs')
@mock.patch('functest.opnfv_tests.openstack.rally.rally.LOGGER.info')
@mock.patch('functest.opnfv_tests.openstack.rally.rally.LOGGER.error')
- def test_run_task_default(self, mock_logger_error, mock_logger_info,
- *args):
- self.rally_base._run_task('test_name')
- text = 'Test scenario: "test_name" OK.\n'
- mock_logger_info.assert_any_call(text)
- mock_logger_error.assert_not_called()
-
- def test_prepare_env_testname_invalid(self):
- self.rally_base.TESTS = ['test1', 'test2']
- self.rally_base.test_name = 'test'
- with self.assertRaises(Exception):
- self.rally_base._prepare_env()
-
- @mock.patch('functest.opnfv_tests.openstack.snaps.snaps_utils.'
- 'get_active_compute_cnt')
- @mock.patch('functest.opnfv_tests.openstack.snaps.snaps_utils.'
- 'get_ext_net_name', return_value='test_net_name')
- @mock.patch('snaps.openstack.utils.deploy_utils.create_image',
- return_value=None)
- def test_prepare_env_image_missing(
- self, mock_get_img, mock_get_net, mock_get_comp_cnt):
- self.rally_base.TESTS = ['test1', 'test2']
- self.rally_base.test_name = 'test1'
- with self.assertRaises(Exception):
- self.rally_base._prepare_env()
- mock_get_img.assert_called()
- mock_get_net.assert_called()
- mock_get_comp_cnt.assert_called()
-
- @mock.patch('functest.opnfv_tests.openstack.snaps.snaps_utils.'
- 'get_active_compute_cnt')
- @mock.patch('functest.opnfv_tests.openstack.snaps.snaps_utils.'
- 'get_ext_net_name', return_value='test_net_name')
- @mock.patch('snaps.openstack.utils.deploy_utils.create_image')
- @mock.patch('snaps.openstack.utils.deploy_utils.create_network',
- return_value=None)
- def test_prepare_env_network_creation_failed(
- self, mock_create_net, mock_get_img, mock_get_net,
- mock_get_comp_cnt):
- self.rally_base.TESTS = ['test1', 'test2']
- self.rally_base.test_name = 'test1'
- with self.assertRaises(Exception):
- self.rally_base._prepare_env()
- mock_create_net.assert_called()
- mock_get_img.assert_called()
- mock_get_net.assert_called()
- mock_get_comp_cnt.assert_called()
-
- @mock.patch('functest.opnfv_tests.openstack.snaps.snaps_utils.'
- 'get_active_compute_cnt')
- @mock.patch('functest.opnfv_tests.openstack.snaps.snaps_utils.'
- 'get_ext_net_name', return_value='test_net_name')
- @mock.patch('snaps.openstack.utils.deploy_utils.create_image')
- @mock.patch('snaps.openstack.utils.deploy_utils.create_network')
- @mock.patch('snaps.openstack.utils.deploy_utils.create_router',
- return_value=None)
- def test_prepare_env_router_creation_failed(
- self, mock_create_router, mock_create_net, mock_get_img,
- mock_get_net, mock_get_comp_cnt):
- self.rally_base.TESTS = ['test1', 'test2']
- self.rally_base.test_name = 'test1'
- with self.assertRaises(Exception):
- self.rally_base._prepare_env()
- mock_create_net.assert_called()
- mock_get_img.assert_called()
- mock_get_net.assert_called()
- mock_create_router.assert_called()
- mock_get_comp_cnt.assert_called()
-
- @mock.patch('functest.opnfv_tests.openstack.snaps.snaps_utils.'
- 'get_active_compute_cnt')
- @mock.patch('functest.opnfv_tests.openstack.snaps.snaps_utils.'
- 'get_ext_net_name', return_value='test_net_name')
- @mock.patch('snaps.openstack.utils.deploy_utils.create_image')
- @mock.patch('snaps.openstack.utils.deploy_utils.create_network')
- @mock.patch('snaps.openstack.utils.deploy_utils.create_router')
- @mock.patch('snaps.openstack.create_flavor.OpenStackFlavor.create',
- return_value=None)
- def test_prepare_env_flavor_creation_failed(
- self, mock_create_flavor, mock_create_router, mock_create_net,
- mock_get_img, mock_get_net, mock_get_comp_cnt):
- self.rally_base.TESTS = ['test1', 'test2']
- self.rally_base.test_name = 'test1'
- with self.assertRaises(Exception):
- self.rally_base._prepare_env()
- mock_create_net.assert_called()
- mock_get_img.assert_called()
- mock_get_net.assert_called()
- mock_create_router.assert_called()
- mock_get_comp_cnt.assert_called()
- mock_create_flavor.assert_called_once()
-
- @mock.patch('functest.opnfv_tests.openstack.snaps.snaps_utils.'
- 'get_active_compute_cnt')
- @mock.patch('functest.opnfv_tests.openstack.snaps.snaps_utils.'
- 'get_ext_net_name', return_value='test_net_name')
- @mock.patch('snaps.openstack.utils.deploy_utils.create_image')
- @mock.patch('snaps.openstack.utils.deploy_utils.create_network')
- @mock.patch('snaps.openstack.utils.deploy_utils.create_router')
- @mock.patch('snaps.openstack.create_flavor.OpenStackFlavor.create',
- side_effect=[mock.Mock, None])
- def test_prepare_env_flavor_alt_creation_failed(
- self, mock_create_flavor, mock_create_router, mock_create_net,
- mock_get_img, mock_get_net, mock_get_comp_cnt):
- self.rally_base.TESTS = ['test1', 'test2']
- self.rally_base.test_name = 'test1'
+ @mock.patch('functest.opnfv_tests.openstack.rally.rally.RallyBase.'
+ '_save_results')
+ def test_run_task_default(self, mock_save_res, *args):
+ # pylint: disable=unused-argument
+ self.rally_base.run_task('test_name')
+ mock_save_res.assert_called()
+
+ @mock.patch('six.moves.builtins.open', mock.mock_open())
+ @mock.patch('functest.opnfv_tests.openstack.rally.rally.RallyBase.'
+ 'task_succeed', return_value=True)
+ @mock.patch('functest.opnfv_tests.openstack.rally.rally.os.path.exists',
+ return_value=True)
+ @mock.patch('subprocess.check_output')
+ @mock.patch('functest.opnfv_tests.openstack.rally.rally.os.makedirs')
+ @mock.patch('functest.opnfv_tests.openstack.rally.rally.LOGGER.info')
+ @mock.patch('functest.opnfv_tests.openstack.rally.rally.LOGGER.debug')
+ @mock.patch('functest.opnfv_tests.openstack.rally.rally.RallyBase.'
+ '_append_summary')
+ def test_save_results(self, mock_summary, *args):
+ # pylint: disable=unused-argument
+ self.rally_base._save_results('test_name', '1234')
+ mock_summary.assert_called()
+
+ def test_prepare_run_testname_invalid(self):
+ self.rally_base.stests = ['test1', 'test2']
with self.assertRaises(Exception):
- self.rally_base._prepare_env()
- mock_create_net.assert_called()
- mock_get_img.assert_called()
- mock_get_net.assert_called()
- mock_create_router.assert_called()
- mock_get_comp_cnt.assert_called()
- self.assertEqual(mock_create_flavor.call_count, 2)
-
- @mock.patch('functest.opnfv_tests.openstack.rally.rally.RallyBase.'
- '_run_task')
- def test_run_tests_all(self, mock_run_task):
- self.rally_base.TESTS = ['test1', 'test2']
- self.rally_base.test_name = 'all'
- self.rally_base._run_tests()
+ self.rally_base.prepare_run(tests=['test'])
+
+ @mock.patch('functest.opnfv_tests.openstack.rally.rally.os.path.exists')
+ @mock.patch('functest.opnfv_tests.openstack.rally.rally.shutil.copyfile')
+ @mock.patch('functest.opnfv_tests.openstack.rally.rally.shutil.copytree')
+ @mock.patch('functest.opnfv_tests.openstack.rally.rally.shutil.rmtree')
+ def test_prepare_run_flavor_alt_creation_failed(self, *args):
+ # pylint: disable=unused-argument
+ self.rally_base.stests = ['test1', 'test2']
+ with mock.patch.object(self.rally_base, 'count_hypervisors') \
+ as mock_list_hyperv, \
+ mock.patch.object(self.rally_base, 'create_flavor_alt',
+ side_effect=Exception) \
+ as mock_create_flavor:
+ with self.assertRaises(Exception):
+ self.rally_base.prepare_run(tests=['test1'])
+ mock_list_hyperv.assert_called_once()
+ mock_create_flavor.assert_called_once()
+
+ @mock.patch('functest.opnfv_tests.openstack.rally.rally.RallyBase.'
+ 'prepare_task', return_value=True)
+ @mock.patch('functest.opnfv_tests.openstack.rally.rally.RallyBase.'
+ 'run_task')
+ def test_run_tests_all(self, mock_run_task, mock_prepare_task):
+ self.rally_base.tests = ['test1', 'test2']
+ self.rally_base.run_tests()
+ mock_prepare_task.assert_any_call('test1')
+ mock_prepare_task.assert_any_call('test2')
mock_run_task.assert_any_call('test1')
mock_run_task.assert_any_call('test2')
@mock.patch('functest.opnfv_tests.openstack.rally.rally.RallyBase.'
- '_run_task')
- def test_run_tests_default(self, mock_run_task):
- self.rally_base.TESTS = ['test1', 'test2']
- self.rally_base.test_name = 'test1'
- self.rally_base._run_tests()
+ 'prepare_task', return_value=True)
+ @mock.patch('functest.opnfv_tests.openstack.rally.rally.RallyBase.'
+ 'run_task')
+ def test_run_tests_default(self, mock_run_task, mock_prepare_task):
+ self.rally_base.tests = ['test1', 'test2']
+ self.rally_base.run_tests()
+ mock_prepare_task.assert_any_call('test1')
+ mock_prepare_task.assert_any_call('test2')
mock_run_task.assert_any_call('test1')
+ mock_run_task.assert_any_call('test2')
- def test_clean_up_default(self):
- creator1 = mock.Mock()
- creator2 = mock.Mock()
- self.rally_base.creators = [creator1, creator2]
- self.rally_base._clean_up()
- self.assertTrue(creator1.clean.called)
- self.assertTrue(creator2.clean.called)
+ @mock.patch('functest.opnfv_tests.openstack.rally.rally.RallyBase.'
+ 'clean_rally_logs')
+ def test_clean_up_default(self, *args):
+ with mock.patch.object(self.rally_base.orig_cloud,
+ 'delete_flavor') as mock_delete_flavor:
+ self.rally_base.flavor_alt = mock.Mock()
+ self.rally_base.clean()
+ self.assertEqual(mock_delete_flavor.call_count, 1)
+ args[0].assert_called_once_with()
- @mock.patch('functest.opnfv_tests.openstack.tempest.conf_utils.'
+ @mock.patch('functest.opnfv_tests.openstack.rally.rally.RallyBase.'
+ 'update_rally_logs')
+ @mock.patch('functest.opnfv_tests.openstack.rally.rally.RallyBase.'
'create_rally_deployment')
@mock.patch('functest.opnfv_tests.openstack.rally.rally.RallyBase.'
- '_prepare_env')
+ 'prepare_run')
@mock.patch('functest.opnfv_tests.openstack.rally.rally.RallyBase.'
- '_run_tests')
+ 'run_tests')
@mock.patch('functest.opnfv_tests.openstack.rally.rally.RallyBase.'
'_generate_report')
@mock.patch('functest.opnfv_tests.openstack.rally.rally.RallyBase.'
- '_clean_up')
+ 'export_task')
def test_run_default(self, *args):
self.assertEqual(self.rally_base.run(), testcase.TestCase.EX_OK)
- map(lambda m: m.assert_called(), args)
+ for func in args:
+ func.assert_called()
- @mock.patch('functest.opnfv_tests.openstack.tempest.conf_utils.'
+ @mock.patch('functest.opnfv_tests.openstack.rally.rally.RallyBase.'
+ 'update_rally_logs')
+ @mock.patch('functest.opnfv_tests.openstack.rally.rally.RallyBase.'
'create_rally_deployment', side_effect=Exception)
- def test_run_exception_create_rally_dep(self, mock_create_rally_dep):
+ def test_run_exception_create_rally_dep(self, *args):
self.assertEqual(self.rally_base.run(), testcase.TestCase.EX_RUN_ERROR)
- mock_create_rally_dep.assert_called()
+ args[0].assert_called()
+ args[1].assert_called_once_with(self.rally_base.res_dir)
@mock.patch('functest.opnfv_tests.openstack.rally.rally.RallyBase.'
- '_prepare_env', side_effect=Exception)
- @mock.patch('functest.opnfv_tests.openstack.tempest.conf_utils.'
+ 'update_rally_logs')
+ @mock.patch('functest.opnfv_tests.openstack.rally.rally.RallyBase.'
'create_rally_deployment', return_value=mock.Mock())
- def test_run_exception_prepare_env(self, mock_create_rally_dep,
- mock_prep_env):
+ @mock.patch('functest.opnfv_tests.openstack.rally.rally.RallyBase.'
+ 'prepare_run', side_effect=Exception)
+ def test_run_exception_prepare_run(self, mock_prep_env, *args):
+ # pylint: disable=unused-argument
self.assertEqual(self.rally_base.run(), testcase.TestCase.EX_RUN_ERROR)
mock_prep_env.assert_called()
+ args[1].assert_called_once_with(self.rally_base.res_dir)
+
+ def test_append_summary(self):
+ json_dict = {
+ 'tasks': [{
+ 'subtasks': [{
+ 'title': 'sub_task',
+ 'workloads': [{
+ 'full_duration': 1.23,
+ 'data': [{
+ 'error': []
+ }]
+ }, {
+ 'full_duration': 2.78,
+ 'data': [{
+ 'error': ['err']
+ }]
+ }]
+ }]
+ }]
+ }
+ self.rally_base._append_summary(json.dumps(json_dict), "foo_test")
+ self.assertEqual(self.rally_base.summary[0]['test_name'], "foo_test")
+ self.assertEqual(self.rally_base.summary[0]['overall_duration'], 4.01)
+ self.assertEqual(self.rally_base.summary[0]['nb_tests'], 2)
+ self.assertEqual(self.rally_base.summary[0]['nb_success'], 1)
+ self.assertEqual(self.rally_base.summary[0]['success'], [])
+ self.assertEqual(self.rally_base.summary[0]['failures'], ['sub_task'])
+
+ def test_is_successful_false(self):
+ with mock.patch('six.moves.builtins.super') as mock_super:
+ self.rally_base.summary = [{"task_status": True},
+ {"task_status": False}]
+ self.assertEqual(self.rally_base.is_successful(),
+ testcase.TestCase.EX_TESTCASE_FAILED)
+ mock_super(rally.RallyBase, self).is_successful.assert_not_called()
+
+ def test_is_successful_true(self):
+ with mock.patch('six.moves.builtins.super') as mock_super:
+ mock_super(rally.RallyBase, self).is_successful.return_value = 424
+ self.rally_base.summary = [{"task_status": True},
+ {"task_status": True}]
+ self.assertEqual(self.rally_base.is_successful(), 424)
+ mock_super(rally.RallyBase, self).is_successful.assert_called()
+
+ @mock.patch('subprocess.check_output',
+ side_effect=subprocess.CalledProcessError('', ''))
+ def test_export_task_ko(self, *args):
+ file_name = (f"{self.rally_base.results_dir}/"
+ f"{self.rally_base.case_name}.html")
+ with self.assertRaises(subprocess.CalledProcessError):
+ self.rally_base.export_task(file_name)
+ cmd = ["rally", "task", "export", "--type", "html", "--deployment",
+ str(getattr(config.CONF, 'rally_deployment_name')),
+ "--to", file_name]
+ args[0].assert_called_with(cmd, stderr=subprocess.STDOUT)
+
+ @mock.patch('subprocess.check_output', return_value=b'')
+ def test_export_task(self, *args):
+ file_name = (f"{self.rally_base.results_dir}/"
+ f"{self.rally_base.case_name}.html")
+ self.assertEqual(self.rally_base.export_task(file_name), None)
+ cmd = ["rally", "task", "export", "--type", "html", "--deployment",
+ str(getattr(config.CONF, 'rally_deployment_name')),
+ "--to", file_name]
+ args[0].assert_called_with(cmd, stderr=subprocess.STDOUT)
+
+ @mock.patch('subprocess.check_output',
+ side_effect=subprocess.CalledProcessError('', ''))
+ def test_verify_report_ko(self, *args):
+ file_name = (f"{self.rally_base.results_dir}/"
+ f"{self.rally_base.case_name}.html")
+ with self.assertRaises(subprocess.CalledProcessError):
+ self.rally_base.verify_report(file_name, "1")
+ cmd = ["rally", "verify", "report", "--type", "html", "--uuid", "1",
+ "--to", file_name]
+ args[0].assert_called_with(cmd, stderr=subprocess.STDOUT)
+
+ @mock.patch('subprocess.check_output', return_value=b'')
+ def test_verify_report(self, *args):
+ file_name = (f"{self.rally_base.results_dir}/"
+ f"{self.rally_base.case_name}.html")
+ self.assertEqual(self.rally_base.verify_report(file_name, "1"), None)
+ cmd = ["rally", "verify", "report", "--type", "html", "--uuid", "1",
+ "--to", file_name]
+ args[0].assert_called_with(cmd, stderr=subprocess.STDOUT)
if __name__ == "__main__":
diff --git a/functest/tests/unit/openstack/refstack_client/__init__.py b/functest/tests/unit/openstack/refstack_client/__init__.py
deleted file mode 100644
index e69de29bb..000000000
--- a/functest/tests/unit/openstack/refstack_client/__init__.py
+++ /dev/null
diff --git a/functest/tests/unit/openstack/refstack_client/test_refstack_client.py b/functest/tests/unit/openstack/refstack_client/test_refstack_client.py
deleted file mode 100644
index 61e950a6b..000000000
--- a/functest/tests/unit/openstack/refstack_client/test_refstack_client.py
+++ /dev/null
@@ -1,154 +0,0 @@
-#!/usr/bin/env python
-
-# Copyright (c) 2017 Huawei Technologies Co.,Ltd and others.
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-
-# pylint: disable=missing-docstring
-
-import logging
-import mock
-import pkg_resources
-import unittest
-
-from functest.core import testcase
-from functest.opnfv_tests.openstack.refstack_client.refstack_client import \
- RefstackClient, RefstackClientParser
-from functest.utils.constants import CONST
-
-from snaps.openstack.os_credentials import OSCreds
-
-__author__ = ("Matthew Li <matthew.lijun@huawei.com>,"
- "Linda Wang <wangwulin@huawei.com>")
-
-
-class OSRefstackClientTesting(unittest.TestCase):
- """The class testing RefstackClient """
- # pylint: disable=missing-docstring, too-many-public-methods
-
- _config = pkg_resources.resource_filename(
- 'functest',
- 'opnfv_tests/openstack/refstack_client/refstack_tempest.conf')
- _testlist = pkg_resources.resource_filename(
- 'functest', 'opnfv_tests/openstack/refstack_client/defcore.txt')
-
- def setUp(self):
- self.default_args = {'config': self._config,
- 'testlist': self._testlist}
- CONST.__setattr__('OS_AUTH_URL', 'https://ip:5000/v3')
- CONST.__setattr__('OS_INSECURE', 'true')
- self.case_name = 'refstack_defcore'
- self.result = 0
- self.os_creds = OSCreds(
- username='user', password='pass',
- auth_url='http://foo.com:5000/v3', project_name='bar')
- self.details = {"tests": 3,
- "failures": 1,
- "success": ['tempest.api.compute [18.464988s]'],
- "errors": ['tempest.api.volume [0.230334s]'],
- "skipped": ['tempest.api.network [1.265828s]']}
-
- @mock.patch('functest.opnfv_tests.openstack.refstack_client.tempest_conf.'
- 'TempestConf', return_value=mock.Mock())
- def _create_client(self, *args):
- with mock.patch('snaps.openstack.tests.openstack_tests.'
- 'get_credentials', return_value=self.os_creds):
- return RefstackClient()
-
- def test_run_defcore_insecure(self):
- insecure = '-k'
- config = 'tempest.conf'
- testlist = 'testlist'
- client = self._create_client()
- with mock.patch('functest.opnfv_tests.openstack.refstack_client.'
- 'refstack_client.ft_utils.execute_command') as m_cmd:
- cmd = ("refstack-client test {0} -c {1} -v --test-list {2}"
- .format(insecure, config, testlist))
- client.run_defcore(config, testlist)
- m_cmd.assert_any_call(cmd)
-
- def test_run_defcore(self):
- CONST.__setattr__('OS_AUTH_URL', 'http://ip:5000/v3')
- insecure = ''
- config = 'tempest.conf'
- testlist = 'testlist'
- client = self._create_client()
- with mock.patch('functest.opnfv_tests.openstack.refstack_client.'
- 'refstack_client.ft_utils.execute_command') as m_cmd:
- cmd = ("refstack-client test {0} -c {1} -v --test-list {2}"
- .format(insecure, config, testlist))
- client.run_defcore(config, testlist)
- m_cmd.assert_any_call(cmd)
-
- @mock.patch('functest.opnfv_tests.openstack.refstack_client.'
- 'refstack_client.LOGGER.info')
- @mock.patch('__builtin__.open', side_effect=Exception)
- def test_parse_refstack_result_fail(self, *args):
- self._create_client().parse_refstack_result()
- args[1].assert_called_once_with(
- "Testcase %s success_rate is %s%%",
- self.case_name, self.result)
-
- def test_parse_refstack_result_ok(self):
- log_file = ('''
- {0} tempest.api.compute [18.464988s] ... ok
- {0} tempest.api.volume [0.230334s] ... FAILED
- {0} tempest.api.network [1.265828s] ... SKIPPED:
- Ran: 3 tests in 1259.0000 sec.
- - Passed: 1
- - Skipped: 1
- - Failed: 1
- ''')
- client = self._create_client()
- with mock.patch('__builtin__.open',
- mock.mock_open(read_data=log_file)):
- client.parse_refstack_result()
- self.assertEqual(client.details, self.details)
-
- def _get_main_kwargs(self, key=None):
- kwargs = {'config': self._config,
- 'testlist': self._testlist}
- if key:
- del kwargs[key]
- return kwargs
-
- def _test_main_missing_keyword(self, key):
- kwargs = self._get_main_kwargs(key)
- client = self._create_client()
- self.assertEqual(client.main(**kwargs),
- testcase.TestCase.EX_RUN_ERROR)
-
- def test_main_missing_conf(self):
- self._test_main_missing_keyword('config')
-
- def test_main_missing_testlist(self):
- self._test_main_missing_keyword('testlist')
-
- def _test_argparser(self, arg, value):
- self.default_args[arg] = value
- parser = RefstackClientParser()
- self.assertEqual(parser.parse_args(["--{}={}".format(arg, value)]),
- self.default_args)
-
- def test_argparser_conf(self):
- self._test_argparser('config', self._config)
-
- def test_argparser_testlist(self):
- self._test_argparser('testlist', self._testlist)
-
- def test_argparser_multiple_args(self):
- self.default_args['config'] = self._config
- self.default_args['testlist'] = self._testlist
- parser = RefstackClientParser()
- self.assertEqual(parser.parse_args(
- ["--config={}".format(self._config),
- "--testlist={}".format(self._testlist)
- ]), self.default_args)
-
-
-if __name__ == "__main__":
- logging.disable(logging.CRITICAL)
- unittest.main(verbosity=2)
diff --git a/functest/tests/unit/openstack/snaps/__init__.py b/functest/tests/unit/openstack/snaps/__init__.py
deleted file mode 100644
index e69de29bb..000000000
--- a/functest/tests/unit/openstack/snaps/__init__.py
+++ /dev/null
diff --git a/functest/tests/unit/openstack/snaps/test_snaps.py b/functest/tests/unit/openstack/snaps/test_snaps.py
deleted file mode 100644
index 83d6341f7..000000000
--- a/functest/tests/unit/openstack/snaps/test_snaps.py
+++ /dev/null
@@ -1,228 +0,0 @@
-# Copyright (c) 2017 Cable Television Laboratories, Inc. and others.
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-
-import mock
-import os
-import unittest
-
-from snaps.openstack.os_credentials import OSCreds
-
-from functest.core.testcase import TestCase
-from functest.opnfv_tests.openstack.snaps import (connection_check, api_check,
- health_check, smoke)
-
-
-class ConnectionCheckTesting(unittest.TestCase):
- """
- Ensures the VPingUserdata class can run in Functest. This test does not
- actually connect with an OpenStack pod.
- """
-
- def setUp(self):
- self.os_creds = OSCreds(
- username='user', password='pass',
- auth_url='http://foo.com:5000/v3', project_name='bar')
-
- self.connection_check = connection_check.ConnectionCheck(
- os_creds=self.os_creds, ext_net_name='foo')
-
- @mock.patch('functest.opnfv_tests.openstack.snaps.snaps_suite_builder.'
- 'add_openstack_client_tests')
- def test_run_success(self, add_os_client_tests):
- result = mock.MagicMock(name='unittest.TextTestResult')
- result.testsRun = 100
- result.failures = []
- result.errors = []
- with mock.patch('unittest.TextTestRunner.run', return_value=result):
- self.assertEquals(TestCase.EX_OK, self.connection_check.run())
- self.assertEquals(TestCase.EX_OK,
- self.connection_check.is_successful())
-
- @mock.patch('functest.opnfv_tests.openstack.snaps.snaps_suite_builder.'
- 'add_openstack_client_tests')
- def test_run_1_of_100_failures(self, add_os_client_tests):
- result = mock.MagicMock(name='unittest.TextTestResult')
- result.testsRun = 100
- result.failures = ['foo']
- result.errors = []
- with mock.patch('unittest.TextTestRunner.run', return_value=result):
- self.assertEquals(TestCase.EX_OK, self.connection_check.run())
- self.assertEquals(TestCase.EX_TESTCASE_FAILED,
- self.connection_check.is_successful())
-
- @mock.patch('functest.opnfv_tests.openstack.snaps.snaps_suite_builder.'
- 'add_openstack_client_tests')
- def test_run_1_of_100_failures_within_criteria(self, add_os_client_tests):
- self.connection_check.criteria = 90
- result = mock.MagicMock(name='unittest.TextTestResult')
- result.testsRun = 100
- result.failures = ['foo']
- result.errors = []
- with mock.patch('unittest.TextTestRunner.run', return_value=result):
- self.assertEquals(TestCase.EX_OK, self.connection_check.run())
- self.assertEquals(TestCase.EX_OK,
- self.connection_check.is_successful())
-
-
-class APICheckTesting(unittest.TestCase):
- """
- Ensures the VPingUserdata class can run in Functest. This test does not
- actually connect with an OpenStack pod.
- """
-
- def setUp(self):
- self.os_creds = OSCreds(
- username='user', password='pass',
- auth_url='http://foo.com:5000/v3', project_name='bar')
-
- self.api_check = api_check.ApiCheck(
- os_creds=self.os_creds, ext_net_name='foo')
-
- @mock.patch('functest.opnfv_tests.openstack.snaps.snaps_suite_builder.'
- 'add_openstack_api_tests')
- def test_run_success(self, add_tests):
- result = mock.MagicMock(name='unittest.TextTestResult')
- result.testsRun = 100
- result.failures = []
- result.errors = []
- with mock.patch('unittest.TextTestRunner.run', return_value=result):
- self.assertEquals(TestCase.EX_OK, self.api_check.run())
- self.assertEquals(TestCase.EX_OK,
- self.api_check.is_successful())
-
- @mock.patch('functest.opnfv_tests.openstack.snaps.snaps_suite_builder.'
- 'add_openstack_api_tests')
- def test_run_1_of_100_failures(self, add_tests):
- result = mock.MagicMock(name='unittest.TextTestResult')
- result.testsRun = 100
- result.failures = ['foo']
- result.errors = []
- with mock.patch('unittest.TextTestRunner.run', return_value=result):
- self.assertEquals(TestCase.EX_OK, self.api_check.run())
- self.assertEquals(TestCase.EX_TESTCASE_FAILED,
- self.api_check.is_successful())
-
- @mock.patch('functest.opnfv_tests.openstack.snaps.snaps_suite_builder.'
- 'add_openstack_api_tests')
- def test_run_1_of_100_failures_within_criteria(self, add_tests):
- self.api_check.criteria = 90
- result = mock.MagicMock(name='unittest.TextTestResult')
- result.testsRun = 100
- result.failures = ['foo']
- result.errors = []
- with mock.patch('unittest.TextTestRunner.run', return_value=result):
- self.assertEquals(TestCase.EX_OK, self.api_check.run())
- self.assertEquals(TestCase.EX_OK,
- self.api_check.is_successful())
-
-
-class HealthCheckTesting(unittest.TestCase):
- """
- Ensures the VPingUserdata class can run in Functest. This test does not
- actually connect with an OpenStack pod.
- """
-
- def setUp(self):
- self.os_creds = OSCreds(
- username='user', password='pass',
- auth_url='http://foo.com:5000/v3', project_name='bar')
-
- self.health_check = health_check.HealthCheck(
- os_creds=self.os_creds, ext_net_name='foo')
-
- @mock.patch('functest.opnfv_tests.openstack.snaps.snaps_suite_builder.'
- 'add_openstack_client_tests')
- def test_run_success(self, add_tests):
- result = mock.MagicMock(name='unittest.TextTestResult')
- result.testsRun = 100
- result.failures = []
- result.errors = []
- with mock.patch('unittest.TextTestRunner.run', return_value=result):
- self.assertEquals(TestCase.EX_OK, self.health_check.run())
- self.assertEquals(TestCase.EX_OK,
- self.health_check.is_successful())
-
- @mock.patch('functest.opnfv_tests.openstack.snaps.snaps_suite_builder.'
- 'add_openstack_client_tests')
- def test_run_1_of_100_failures(self, add_tests):
- result = mock.MagicMock(name='unittest.TextTestResult')
- result.testsRun = 100
- result.failures = ['foo']
- result.errors = []
- with mock.patch('unittest.TextTestRunner.run', return_value=result):
- self.assertEquals(TestCase.EX_OK, self.health_check.run())
- self.assertEquals(TestCase.EX_TESTCASE_FAILED,
- self.health_check.is_successful())
-
- @mock.patch('functest.opnfv_tests.openstack.snaps.snaps_suite_builder.'
- 'add_openstack_client_tests')
- def test_run_1_of_100_failures_within_criteria(self, add_tests):
- self.health_check.criteria = 90
- result = mock.MagicMock(name='unittest.TextTestResult')
- result.testsRun = 100
- result.failures = ['foo']
- result.errors = []
- with mock.patch('unittest.TextTestRunner.run', return_value=result):
- self.assertEquals(TestCase.EX_OK, self.health_check.run())
- self.assertEquals(TestCase.EX_OK,
- self.health_check.is_successful())
-
-
-class SmokeTesting(unittest.TestCase):
- """
- Ensures the VPingUserdata class can run in Functest. This test does not
- actually connect with an OpenStack pod.
- """
-
- def setUp(self):
- self.os_creds = OSCreds(
- username='user', password='pass',
- auth_url='http://foo.com:5000/v3', project_name='bar')
-
- self.smoke = smoke.SnapsSmoke(
- os_creds=self.os_creds, ext_net_name='foo')
-
- @mock.patch('functest.opnfv_tests.openstack.snaps.snaps_suite_builder.'
- 'add_openstack_integration_tests')
- @mock.patch('os.path.join', return_value=os.getcwd())
- def test_run_success(self, add_tests, cwd):
- result = mock.MagicMock(name='unittest.TextTestResult')
- result.testsRun = 100
- result.failures = []
- result.errors = []
- with mock.patch('unittest.TextTestRunner.run', return_value=result):
- self.assertEquals(TestCase.EX_OK, self.smoke.run())
- self.assertEquals(TestCase.EX_OK,
- self.smoke.is_successful())
-
- @mock.patch('functest.opnfv_tests.openstack.snaps.snaps_suite_builder.'
- 'add_openstack_integration_tests')
- @mock.patch('os.path.join', return_value=os.getcwd())
- def test_run_1_of_100_failures(self, add_tests, cwd):
- result = mock.MagicMock(name='unittest.TextTestResult')
- result.testsRun = 100
- result.failures = ['foo']
- result.errors = []
- with mock.patch('unittest.TextTestRunner.run', return_value=result):
- self.assertEquals(TestCase.EX_OK, self.smoke.run())
- self.assertEquals(TestCase.EX_TESTCASE_FAILED,
- self.smoke.is_successful())
-
- @mock.patch('functest.opnfv_tests.openstack.snaps.snaps_suite_builder.'
- 'add_openstack_integration_tests')
- @mock.patch('os.path.join', return_value=os.getcwd())
- def test_run_1_of_100_failures_within_criteria(self, add_tests, cwd):
- self.smoke.criteria = 90
- result = mock.MagicMock(name='unittest.TextTestResult')
- result.testsRun = 100
- result.failures = ['foo']
- result.errors = []
- with mock.patch('unittest.TextTestRunner.run', return_value=result):
- self.assertEquals(TestCase.EX_OK, self.smoke.run())
- self.assertEquals(TestCase.EX_OK,
- self.smoke.is_successful())
diff --git a/functest/tests/unit/openstack/tempest/test_conf_utils.py b/functest/tests/unit/openstack/tempest/test_conf_utils.py
deleted file mode 100644
index 7eeffdd67..000000000
--- a/functest/tests/unit/openstack/tempest/test_conf_utils.py
+++ /dev/null
@@ -1,340 +0,0 @@
-#!/usr/bin/env python
-
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-
-import logging
-import unittest
-
-import mock
-
-from functest.opnfv_tests.openstack.tempest import tempest, conf_utils
-from functest.utils.constants import CONST
-from snaps.openstack.os_credentials import OSCreds
-
-
-class OSTempestConfUtilsTesting(unittest.TestCase):
-
- def setUp(self):
- self.os_creds = OSCreds(
- username='user', password='pass',
- auth_url='http://foo.com:5000/v3', project_name='bar')
-
- @mock.patch('snaps.openstack.utils.deploy_utils.create_project',
- return_value=mock.Mock())
- @mock.patch('snaps.openstack.utils.deploy_utils.create_user',
- return_value=mock.Mock())
- @mock.patch('snaps.openstack.utils.deploy_utils.create_network',
- return_value=None)
- @mock.patch('snaps.openstack.utils.deploy_utils.create_image',
- return_value=mock.Mock())
- def test_create_tempest_resources_missing_network_dic(self, *mock_args):
- tempest_resources = tempest.TempestResourcesManager(os_creds={})
- with self.assertRaises(Exception) as context:
- tempest_resources.create()
- msg = 'Failed to create private network'
- self.assertTrue(msg in context.exception)
-
- @mock.patch('snaps.openstack.utils.deploy_utils.create_project',
- return_value=mock.Mock())
- @mock.patch('snaps.openstack.utils.deploy_utils.create_user',
- return_value=mock.Mock())
- @mock.patch('snaps.openstack.utils.deploy_utils.create_network',
- return_value=mock.Mock())
- @mock.patch('snaps.openstack.utils.deploy_utils.create_image',
- return_value=None)
- def test_create_tempest_resources_missing_image(self, *mock_args):
- tempest_resources = tempest.TempestResourcesManager(os_creds={})
-
- with self.assertRaises(Exception) as context:
- tempest_resources.create()
- msg = 'Failed to create image'
- self.assertTrue(msg in context.exception, msg=str(context.exception))
-
- @mock.patch('snaps.openstack.utils.deploy_utils.create_project',
- return_value=mock.Mock())
- @mock.patch('snaps.openstack.utils.deploy_utils.create_user',
- return_value=mock.Mock())
- @mock.patch('snaps.openstack.utils.deploy_utils.create_network',
- return_value=mock.Mock())
- @mock.patch('snaps.openstack.utils.deploy_utils.create_image',
- return_value=mock.Mock())
- @mock.patch('snaps.openstack.create_flavor.OpenStackFlavor.create',
- return_value=None)
- def test_create_tempest_resources_missing_flavor(self, *mock_args):
- tempest_resources = tempest.TempestResourcesManager(
- os_creds=self.os_creds)
-
- CONST.__setattr__('tempest_use_custom_flavors', 'True')
- with self.assertRaises(Exception) as context:
- tempest_resources.create()
- msg = 'Failed to create flavor'
- self.assertTrue(msg in context.exception, msg=str(context.exception))
-
- CONST.__setattr__('tempest_use_custom_flavors', 'False')
- with self.assertRaises(Exception) as context:
- tempest_resources.create(use_custom_flavors=True)
- msg = 'Failed to create flavor'
- self.assertTrue(msg in context.exception, msg=str(context.exception))
-
- @mock.patch('functest.opnfv_tests.openstack.tempest.conf_utils'
- '.logger.info')
- @mock.patch('functest.utils.functest_utils.execute_command_raise')
- @mock.patch('functest.utils.functest_utils.execute_command')
- def test_create_rally_deployment(self, mock_exec, mock_exec_raise,
- mock_logger_info):
-
- conf_utils.create_rally_deployment()
-
- cmd = "rally deployment destroy opnfv-rally"
- error_msg = "Deployment %s does not exist." % \
- CONST.__getattribute__('rally_deployment_name')
- mock_logger_info.assert_any_call("Creating Rally environment...")
- mock_exec.assert_any_call(cmd, error_msg=error_msg, verbose=False)
-
- cmd = "rally deployment create --fromenv --name="
- cmd += CONST.__getattribute__('rally_deployment_name')
- error_msg = "Problem while creating Rally deployment"
- mock_exec_raise.assert_any_call(cmd, error_msg=error_msg)
-
- cmd = "rally deployment check"
- error_msg = ("OpenStack not responding or "
- "faulty Rally deployment.")
- mock_exec_raise.assert_any_call(cmd, error_msg=error_msg)
-
- @mock.patch('functest.opnfv_tests.openstack.tempest.conf_utils'
- '.logger.debug')
- def test_create_verifier(self, mock_logger_debug):
- mock_popen = mock.Mock()
- attrs = {'poll.return_value': None,
- 'stdout.readline.return_value': '0'}
- mock_popen.configure_mock(**attrs)
-
- CONST.__setattr__('tempest_verifier_name', 'test_veifier_name')
- with mock.patch('functest.utils.functest_utils.execute_command_raise',
- side_effect=Exception), \
- self.assertRaises(Exception):
- conf_utils.create_verifier()
- mock_logger_debug.assert_any_call("Tempest test_veifier_name"
- " does not exist")
-
- @mock.patch('functest.opnfv_tests.openstack.tempest.conf_utils.'
- 'create_verifier', return_value=mock.Mock())
- @mock.patch('functest.opnfv_tests.openstack.tempest.conf_utils.'
- 'create_rally_deployment', return_value=mock.Mock())
- def test_get_verifier_id_missing_verifier(self, mock_rally, mock_tempest):
- CONST.__setattr__('tempest_verifier_name', 'test_verifier_name')
- with mock.patch('functest.opnfv_tests.openstack.tempest.'
- 'conf_utils.subprocess.Popen') as mock_popen, \
- self.assertRaises(Exception):
- mock_stdout = mock.Mock()
- attrs = {'stdout.readline.return_value': ''}
- mock_stdout.configure_mock(**attrs)
- mock_popen.return_value = mock_stdout
- conf_utils.get_verifier_id()
-
- @mock.patch('functest.opnfv_tests.openstack.tempest.conf_utils.'
- 'create_verifier', return_value=mock.Mock())
- @mock.patch('functest.opnfv_tests.openstack.tempest.conf_utils.'
- 'create_rally_deployment', return_value=mock.Mock())
- def test_get_verifier_id_default(self, mock_rally, mock_tempest):
- CONST.__setattr__('tempest_verifier_name', 'test_verifier_name')
- with mock.patch('functest.opnfv_tests.openstack.tempest.'
- 'conf_utils.subprocess.Popen') as mock_popen:
- mock_stdout = mock.Mock()
- attrs = {'stdout.readline.return_value': 'test_deploy_id'}
- mock_stdout.configure_mock(**attrs)
- mock_popen.return_value = mock_stdout
-
- self.assertEqual(conf_utils.get_verifier_id(),
- 'test_deploy_id')
-
- def test_get_verifier_deployment_id_missing_rally(self):
- CONST.__setattr__('tempest_verifier_name', 'test_deploy_name')
- with mock.patch('functest.opnfv_tests.openstack.tempest.'
- 'conf_utils.subprocess.Popen') as mock_popen, \
- self.assertRaises(Exception):
- mock_stdout = mock.Mock()
- attrs = {'stdout.readline.return_value': ''}
- mock_stdout.configure_mock(**attrs)
- mock_popen.return_value = mock_stdout
- conf_utils.get_verifier_deployment_id(),
-
- def test_get_verifier_deployment_id_default(self):
- CONST.__setattr__('tempest_verifier_name', 'test_deploy_name')
- with mock.patch('functest.opnfv_tests.openstack.tempest.'
- 'conf_utils.subprocess.Popen') as mock_popen:
- mock_stdout = mock.Mock()
- attrs = {'stdout.readline.return_value': 'test_deploy_id'}
- mock_stdout.configure_mock(**attrs)
- mock_popen.return_value = mock_stdout
-
- self.assertEqual(conf_utils.get_verifier_deployment_id(),
- 'test_deploy_id')
-
- def test_get_verifier_repo_dir_default(self):
- with mock.patch('functest.opnfv_tests.openstack.tempest.'
- 'conf_utils.os.path.join',
- return_value='test_verifier_repo_dir'), \
- mock.patch('functest.opnfv_tests.openstack.tempest.'
- 'conf_utils.get_verifier_id') as m:
- self.assertEqual(conf_utils.get_verifier_repo_dir(''),
- 'test_verifier_repo_dir')
- self.assertTrue(m.called)
-
- def test_get_verifier_deployment_dir_default(self):
- with mock.patch('functest.opnfv_tests.openstack.tempest.'
- 'conf_utils.os.path.join',
- return_value='test_verifier_repo_dir'), \
- mock.patch('functest.opnfv_tests.openstack.tempest.'
- 'conf_utils.get_verifier_id') as m1, \
- mock.patch('functest.opnfv_tests.openstack.tempest.'
- 'conf_utils.get_verifier_deployment_id') as m2:
- self.assertEqual(conf_utils.get_verifier_deployment_dir('', ''),
- 'test_verifier_repo_dir')
- self.assertTrue(m1.called)
- self.assertTrue(m2.called)
-
- def test_backup_tempest_config_default(self):
- with mock.patch('functest.opnfv_tests.openstack.tempest.'
- 'conf_utils.os.path.exists',
- return_value=False), \
- mock.patch('functest.opnfv_tests.openstack.tempest.'
- 'conf_utils.os.makedirs') as m1, \
- mock.patch('functest.opnfv_tests.openstack.tempest.'
- 'conf_utils.shutil.copyfile') as m2:
- conf_utils.backup_tempest_config('test_conf_file')
- self.assertTrue(m1.called)
- self.assertTrue(m2.called)
-
- with mock.patch('functest.opnfv_tests.openstack.tempest.'
- 'conf_utils.os.path.exists',
- return_value=True), \
- mock.patch('functest.opnfv_tests.openstack.tempest.'
- 'conf_utils.shutil.copyfile') as m2:
- conf_utils.backup_tempest_config('test_conf_file')
- self.assertTrue(m2.called)
-
- def test_configure_tempest_default(self):
- with mock.patch('functest.opnfv_tests.openstack.tempest.'
- 'conf_utils.configure_verifier',
- return_value='test_conf_file'), \
- mock.patch('functest.opnfv_tests.openstack.tempest.'
- 'conf_utils.configure_tempest_update_params') as m1:
- conf_utils.configure_tempest('test_dep_dir')
- self.assertTrue(m1.called)
-
- def test_configure_tempest_defcore_default(self):
- with mock.patch('functest.opnfv_tests.openstack.tempest.'
- 'conf_utils.configure_verifier',
- return_value='test_conf_file'), \
- mock.patch('functest.opnfv_tests.openstack.tempest.'
- 'conf_utils.configure_tempest_update_params'), \
- mock.patch('functest.opnfv_tests.openstack.tempest.'
- 'conf_utils.ConfigParser.RawConfigParser.'
- 'set') as mset, \
- mock.patch('functest.opnfv_tests.openstack.tempest.'
- 'conf_utils.ConfigParser.RawConfigParser.'
- 'read') as mread, \
- mock.patch('functest.opnfv_tests.openstack.tempest.'
- 'conf_utils.ConfigParser.RawConfigParser.'
- 'write') as mwrite, \
- mock.patch('__builtin__.open', mock.mock_open()), \
- mock.patch('functest.opnfv_tests.openstack.tempest.'
- 'conf_utils.generate_test_accounts_file'), \
- mock.patch('functest.opnfv_tests.openstack.tempest.'
- 'conf_utils.shutil.copyfile'):
- conf_utils.configure_tempest_defcore(
- 'test_dep_dir', 'test_image_id', 'test_flavor_id',
- 'test_image_alt_id', 'test_flavor_alt_id', 'test_tenant_id')
- mset.assert_any_call('compute', 'image_ref', 'test_image_id')
- mset.assert_any_call('compute', 'image_ref_alt',
- 'test_image_alt_id')
- mset.assert_any_call('compute', 'flavor_ref', 'test_flavor_id')
- mset.assert_any_call('compute', 'flavor_ref_alt',
- 'test_flavor_alt_id')
- self.assertTrue(mread.called)
- self.assertTrue(mwrite.called)
-
- def test_generate_test_accounts_file_default(self):
- with mock.patch("__builtin__.open", mock.mock_open()), \
- mock.patch('functest.opnfv_tests.openstack.tempest.conf_utils.'
- 'yaml.dump') as mock_dump:
- conf_utils.generate_test_accounts_file('test_tenant_id')
- self.assertTrue(mock_dump.called)
-
- def _test_missing_param(self, params, image_id, flavor_id):
- with mock.patch('functest.opnfv_tests.openstack.tempest.'
- 'conf_utils.ConfigParser.RawConfigParser.'
- 'set') as mset, \
- mock.patch('functest.opnfv_tests.openstack.tempest.'
- 'conf_utils.ConfigParser.RawConfigParser.'
- 'read') as mread, \
- mock.patch('functest.opnfv_tests.openstack.tempest.'
- 'conf_utils.ConfigParser.RawConfigParser.'
- 'write') as mwrite, \
- mock.patch('__builtin__.open', mock.mock_open()), \
- mock.patch('functest.opnfv_tests.openstack.tempest.'
- 'conf_utils.backup_tempest_config'), \
- mock.patch('functest.utils.functest_utils.yaml.safe_load',
- return_value={'validation': {'ssh_timeout': 300}}):
- CONST.__setattr__('OS_ENDPOINT_TYPE', None)
- conf_utils.configure_tempest_update_params(
- 'test_conf_file', image_id=image_id, flavor_id=flavor_id)
- mset.assert_any_call(params[0], params[1], params[2])
- self.assertTrue(mread.called)
- self.assertTrue(mwrite.called)
-
- def test_configure_tempest_update_params_missing_image_id(self):
- self._test_missing_param(('compute', 'image_ref',
- 'test_image_id'), 'test_image_id',
- None)
-
- def test_configure_tempest_update_params_missing_image_id_alt(self):
- conf_utils.IMAGE_ID_ALT = 'test_image_id_alt'
- self._test_missing_param(('compute', 'image_ref_alt',
- 'test_image_id_alt'), None, None)
-
- def test_configure_tempest_update_params_missing_flavor_id(self):
- CONST.__setattr__('tempest_use_custom_flavors', 'True')
- self._test_missing_param(('compute', 'flavor_ref',
- 'test_flavor_id'), None,
- 'test_flavor_id')
-
- def test_configure_tempest_update_params_missing_flavor_id_alt(self):
- CONST.__setattr__('tempest_use_custom_flavors', 'True')
- conf_utils.FLAVOR_ID_ALT = 'test_flavor_id_alt'
- self._test_missing_param(('compute', 'flavor_ref_alt',
- 'test_flavor_id_alt'), None,
- None)
-
- def test_configure_verifier_missing_temp_conf_file(self):
- with mock.patch('functest.opnfv_tests.openstack.tempest.'
- 'conf_utils.os.path.isfile',
- return_value=False), \
- mock.patch('functest.opnfv_tests.openstack.tempest.'
- 'conf_utils.ft_utils.execute_command') as mexe, \
- self.assertRaises(Exception) as context:
- conf_utils.configure_verifier('test_dep_dir')
- mexe.assert_any_call("rally verify configure-verifier")
- msg = ("Tempest configuration file 'test_dep_dir/tempest.conf'"
- " NOT found.")
- self.assertTrue(msg in context)
-
- def test_configure_verifier_default(self):
- with mock.patch('functest.opnfv_tests.openstack.tempest.'
- 'conf_utils.os.path.isfile',
- return_value=True), \
- mock.patch('functest.opnfv_tests.openstack.tempest.'
- 'conf_utils.ft_utils.execute_command') as mexe:
- self.assertEqual(conf_utils.configure_verifier('test_dep_dir'),
- 'test_dep_dir/tempest.conf')
- mexe.assert_any_call("rally verify configure-verifier "
- "--reconfigure")
-
-
-if __name__ == "__main__":
- logging.disable(logging.CRITICAL)
- unittest.main(verbosity=2)
diff --git a/functest/tests/unit/openstack/tempest/test_tempest.py b/functest/tests/unit/openstack/tempest/test_tempest.py
index 6fe103f18..efc4393c8 100644
--- a/functest/tests/unit/openstack/tempest/test_tempest.py
+++ b/functest/tests/unit/openstack/tempest/test_tempest.py
@@ -5,164 +5,185 @@
# which accompanies this distribution, and is available at
# http://www.apache.org/licenses/LICENSE-2.0
+# pylint: disable=missing-docstring
+
import logging
+import os
import unittest
import mock
+from xtesting.core import testcase
-from functest.core import testcase
+from functest.opnfv_tests.openstack.rally import rally
from functest.opnfv_tests.openstack.tempest import tempest
-from functest.opnfv_tests.openstack.tempest import conf_utils
-from functest.utils.constants import CONST
-
-from snaps.openstack.os_credentials import OSCreds
+from functest.utils import config
class OSTempestTesting(unittest.TestCase):
+ # pylint: disable=too-many-public-methods
def setUp(self):
- os_creds = OSCreds(
- username='user', password='pass',
- auth_url='http://foo.com:5000/v3', project_name='bar')
-
- with mock.patch('functest.opnfv_tests.openstack.tempest.tempest.'
- 'conf_utils.get_verifier_id',
- return_value='test_deploy_id'), \
- mock.patch('functest.opnfv_tests.openstack.tempest.tempest.'
- 'conf_utils.get_verifier_deployment_id',
- return_value='test_deploy_id'), \
- mock.patch('functest.opnfv_tests.openstack.tempest.tempest.'
- 'conf_utils.get_verifier_repo_dir',
- return_value='test_verifier_repo_dir'), \
- mock.patch('functest.opnfv_tests.openstack.tempest.tempest.'
- 'conf_utils.get_verifier_deployment_dir',
- return_value='test_verifier_deploy_dir'), \
- mock.patch('snaps.openstack.tests.openstack_tests.get_credentials',
- return_value=os_creds):
+ with mock.patch('os_client_config.get_config'), \
+ mock.patch('shade.OpenStackCloud'), \
+ mock.patch('functest.core.tenantnetwork.NewProject'), \
+ mock.patch('functest.opnfv_tests.openstack.rally.rally.'
+ 'RallyBase.create_rally_deployment'), \
+ mock.patch('functest.opnfv_tests.openstack.tempest.tempest.'
+ 'TempestCommon.create_verifier'), \
+ mock.patch('functest.opnfv_tests.openstack.tempest.tempest.'
+ 'TempestCommon.get_verifier_id',
+ return_value='test_deploy_id'), \
+ mock.patch('functest.opnfv_tests.openstack.rally.rally.'
+ 'RallyBase.get_verifier_deployment_id',
+ return_value='test_deploy_id'), \
+ mock.patch('functest.opnfv_tests.openstack.tempest.tempest.'
+ 'TempestCommon.get_verifier_repo_dir',
+ return_value='test_verifier_repo_dir'), \
+ mock.patch('functest.opnfv_tests.openstack.tempest.tempest.'
+ 'TempestCommon.get_verifier_deployment_dir',
+ return_value='test_verifier_deploy_dir'), \
+ mock.patch('os_client_config.make_shade'):
self.tempestcommon = tempest.TempestCommon()
- self.tempestsmoke_serial = tempest.TempestSmokeSerial()
- self.tempestsmoke_parallel = tempest.TempestSmokeParallel()
- self.tempestfull_parallel = tempest.TempestFullParallel()
- self.tempestcustom = tempest.TempestCustom()
- self.tempestdefcore = tempest.TempestDefcore()
-
- @mock.patch('functest.opnfv_tests.openstack.tempest.tempest.logger.debug')
- def test_generate_test_list_defcore_mode(self, mock_logger_debug):
- self.tempestcommon.MODE = 'defcore'
- with mock.patch('functest.opnfv_tests.openstack.tempest.tempest.'
- 'shutil.copyfile') as m:
- self.tempestcommon.generate_test_list('test_verifier_repo_dir')
- self.assertTrue(m.called)
-
- @mock.patch('functest.opnfv_tests.openstack.tempest.tempest.logger.error')
- @mock.patch('functest.opnfv_tests.openstack.tempest.tempest.logger.debug')
- def test_generate_test_list_custom_mode_missing_file(self,
- mock_logger_debug,
- mock_logger_error):
- self.tempestcommon.MODE = 'custom'
+
+ @mock.patch('functest.opnfv_tests.openstack.tempest.tempest.LOGGER.error')
+ @mock.patch('functest.opnfv_tests.openstack.tempest.tempest.LOGGER.debug')
+ def test_gen_tl_cm_missing_file(self, mock_logger_debug,
+ mock_logger_error):
+ # pylint: disable=unused-argument
+ self.tempestcommon.mode = 'custom'
with mock.patch('functest.opnfv_tests.openstack.tempest.tempest.'
'os.path.isfile', return_value=False), \
self.assertRaises(Exception) as context:
msg = "Tempest test list file %s NOT found."
- self.tempestcommon.generate_test_list('test_verifier_repo_dir')
- self.assertTrue((msg % conf_utils.TEMPEST_CUSTOM) in context)
+ self.tempestcommon.generate_test_list()
+ self.assertTrue(
+ (msg % self.tempestcommon.tempest_custom) in context.exception)
- def test_generate_test_list_custom_mode_default(self):
- self.tempestcommon.MODE = 'custom'
+ @mock.patch('subprocess.check_output')
+ @mock.patch('os.remove')
+ def test_gen_tl_cm_default(self, *args):
+ self.tempestcommon.mode = 'custom'
with mock.patch('functest.opnfv_tests.openstack.tempest.tempest.'
- 'shutil.copyfile') as m, \
+ 'shutil.copyfile') as mock_copyfile, \
mock.patch('functest.opnfv_tests.openstack.tempest.tempest.'
'os.path.isfile', return_value=True):
- self.tempestcommon.generate_test_list('test_verifier_repo_dir')
- self.assertTrue(m.called)
-
- def _test_generate_test_list_mode_default(self, mode):
- self.tempestcommon.MODE = mode
- if self.tempestcommon.MODE == 'smoke':
- testr_mode = "smoke"
- elif self.tempestcommon.MODE == 'full':
- testr_mode = ""
+ self.tempestcommon.generate_test_list()
+ self.assertTrue(mock_copyfile.called)
+ args[0].assert_called_once_with('/etc/tempest.conf')
+
+ @mock.patch('os.remove')
+ @mock.patch('shutil.copyfile')
+ @mock.patch('subprocess.check_output')
+ def _test_gen_tl_mode_default(self, mode, *args):
+ if mode == 'smoke':
+ testr_mode = r'^tempest\.(api|scenario).*\[.*\bsmoke\b.*\]$'
+ elif mode == 'full':
+ testr_mode = r'^tempest\.'
else:
- testr_mode = 'tempest.api.' + self.tempestcommon.MODE
- conf_utils.TEMPEST_RAW_LIST = 'raw_list'
+ testr_mode = self.tempestcommon.mode
verifier_repo_dir = 'test_verifier_repo_dir'
- with mock.patch('functest.opnfv_tests.openstack.tempest.tempest.'
- 'ft_utils.execute_command') as m:
- cmd = ("cd {0};"
- "testr list-tests {1} > {2};"
- "cd -;".format(verifier_repo_dir,
- testr_mode,
- conf_utils.TEMPEST_RAW_LIST))
- self.tempestcommon.generate_test_list('test_verifier_repo_dir')
- m.assert_any_call(cmd)
-
- def test_generate_test_list_smoke_mode(self):
- self._test_generate_test_list_mode_default('smoke')
-
- def test_generate_test_list_full_mode(self):
- self._test_generate_test_list_mode_default('full')
-
- def test_parse_verifier_result_missing_verification_uuid(self):
- self.tempestcommon.VERIFICATION_ID = None
+ self.tempestcommon.verifier_repo_dir = verifier_repo_dir
+ cmd = (f"(cd {verifier_repo_dir}; stestr list '{testr_mode}' > "
+ f"{self.tempestcommon.list} 2>/dev/null)")
+ self.tempestcommon.generate_test_list(mode=testr_mode)
+ args[0].assert_called_once_with(cmd, shell=True)
+ args[2].assert_called_once_with('/etc/tempest.conf')
+
+ def test_gen_tl_smoke_mode(self):
+ self._test_gen_tl_mode_default('smoke')
+
+ def test_gen_tl_full_mode(self):
+ self._test_gen_tl_mode_default('full')
+
+ def test_verif_res_missing_verif_id(self):
+ self.tempestcommon.verification_id = None
with self.assertRaises(Exception):
self.tempestcommon.parse_verifier_result()
- def test_apply_tempest_blacklist_no_blacklist(self):
- with mock.patch('__builtin__.open', mock.mock_open()) as m, \
+ def test_backup_config_default(self):
+ with mock.patch('os.path.exists', return_value=False), \
+ mock.patch('os.makedirs') as mock_makedirs, \
+ mock.patch('shutil.copyfile') as mock_copyfile:
+ self.tempestcommon.backup_tempest_config(
+ 'test_conf_file', res_dir='test_dir')
+ self.assertTrue(mock_makedirs.called)
+ self.assertTrue(mock_copyfile.called)
+
+ with mock.patch('os.path.exists', return_value=True), \
+ mock.patch('shutil.copyfile') as mock_copyfile:
+ self.tempestcommon.backup_tempest_config(
+ 'test_conf_file', res_dir='test_dir')
+ self.assertTrue(mock_copyfile.called)
+
+ @mock.patch("os.rename")
+ @mock.patch("os.remove")
+ @mock.patch("os.path.exists", return_value=True)
+ def test_apply_missing_blacklist(self, *args):
+ with mock.patch('six.moves.builtins.open',
+ mock.mock_open()) as mock_open, \
mock.patch.object(self.tempestcommon, 'read_file',
return_value=['test1', 'test2']):
- conf_utils.TEMPEST_BLACKLIST = Exception
- CONST.__setattr__('INSTALLER_TYPE', 'installer_type')
- CONST.__setattr__('DEPLOY_SCENARIO', 'deploy_scenario')
- self.tempestcommon.apply_tempest_blacklist()
- obj = m()
+ self.tempestcommon.tempest_blacklist = Exception
+ os.environ['DEPLOY_SCENARIO'] = 'deploy_scenario'
+ self.tempestcommon.apply_tempest_blacklist(
+ self.tempestcommon.tempest_blacklist)
+ obj = mock_open()
obj.write.assert_any_call('test1\n')
obj.write.assert_any_call('test2\n')
+ args[0].assert_called_once_with(self.tempestcommon.raw_list)
+ args[1].assert_called_once_with(self.tempestcommon.raw_list)
+ args[2].assert_called_once_with(
+ self.tempestcommon.list, self.tempestcommon.raw_list)
- def test_apply_tempest_blacklist_default(self):
+ @mock.patch("os.rename")
+ @mock.patch("os.remove")
+ @mock.patch("os.path.exists", return_value=True)
+ def test_apply_blacklist_default(self, *args):
item_dict = {'scenarios': ['deploy_scenario'],
- 'installers': ['installer_type'],
'tests': ['test2']}
- with mock.patch('__builtin__.open', mock.mock_open()) as m, \
+ with mock.patch('six.moves.builtins.open',
+ mock.mock_open()) as mock_open, \
mock.patch.object(self.tempestcommon, 'read_file',
return_value=['test1', 'test2']), \
mock.patch('functest.opnfv_tests.openstack.tempest.tempest.'
'yaml.safe_load', return_value=item_dict):
- CONST.__setattr__('INSTALLER_TYPE', 'installer_type')
- CONST.__setattr__('DEPLOY_SCENARIO', 'deploy_scenario')
- self.tempestcommon.apply_tempest_blacklist()
- obj = m()
+ os.environ['DEPLOY_SCENARIO'] = 'deploy_scenario'
+ self.tempestcommon.apply_tempest_blacklist(
+ self.tempestcommon.tempest_blacklist)
+ obj = mock_open()
obj.write.assert_any_call('test1\n')
self.assertFalse(obj.write.assert_any_call('test2\n'))
+ args[0].assert_called_once_with(self.tempestcommon.raw_list)
+ args[1].assert_called_once_with(self.tempestcommon.raw_list)
+ args[2].assert_called_once_with(
+ self.tempestcommon.list, self.tempestcommon.raw_list)
- @mock.patch('functest.opnfv_tests.openstack.tempest.tempest.logger.info')
- def test_run_verifier_tests_default(self, mock_logger_info):
- with mock.patch('__builtin__.open', mock.mock_open()), \
- mock.patch('__builtin__.iter', return_value=['\} tempest\.']), \
- mock.patch('functest.opnfv_tests.openstack.tempest.tempest.'
- 'subprocess.Popen'):
- conf_utils.TEMPEST_LIST = 'test_tempest_list'
- cmd_line = ("rally verify start --load-list "
- "test_tempest_list --detailed")
+ @mock.patch('functest.opnfv_tests.openstack.tempest.tempest.'
+ 'subprocess.Popen')
+ @mock.patch('six.moves.builtins.open', mock.mock_open())
+ @mock.patch('functest.opnfv_tests.openstack.tempest.tempest.LOGGER.info')
+ def test_run_verifier_tests_default(self, *args):
+ self.tempestcommon.tempest_list = 'test_tempest_list'
+ cmd = ["rally", "verify", "start", "--load-list",
+ self.tempestcommon.tempest_list]
+ with self.assertRaises(Exception):
self.tempestcommon.run_verifier_tests()
- mock_logger_info. \
- assert_any_call("Starting Tempest test suite: '%s'."
- % cmd_line)
+ args[0].assert_any_call("Starting Tempest test suite: '%s'.", cmd)
@mock.patch('functest.opnfv_tests.openstack.tempest.tempest.'
'os.path.exists', return_value=False)
@mock.patch('functest.opnfv_tests.openstack.tempest.tempest.os.makedirs',
side_effect=Exception)
def test_run_makedirs_ko(self, *args):
+ # pylint: disable=unused-argument
self.assertEqual(self.tempestcommon.run(),
testcase.TestCase.EX_RUN_ERROR)
@mock.patch('functest.opnfv_tests.openstack.tempest.tempest.'
'os.path.exists', return_value=False)
@mock.patch('functest.opnfv_tests.openstack.tempest.tempest.os.makedirs')
- @mock.patch('functest.opnfv_tests.openstack.tempest.tempest.'
- 'TempestResourcesManager.create', side_effect=Exception)
- def test_run_tempest_create_resources_ko(self, *args):
+ def test_run_create_resources_ko(self, *args):
+ # pylint: disable=unused-argument
self.assertEqual(self.tempestcommon.run(),
testcase.TestCase.EX_RUN_ERROR)
@@ -170,23 +191,9 @@ class OSTempestTesting(unittest.TestCase):
'os.path.exists', return_value=False)
@mock.patch('functest.opnfv_tests.openstack.tempest.tempest.os.makedirs')
@mock.patch('functest.opnfv_tests.openstack.tempest.tempest.'
- 'TempestResourcesManager.create', return_value={})
- @mock.patch('functest.opnfv_tests.openstack.snaps.snaps_utils.'
- 'get_active_compute_cnt', side_effect=Exception)
- def test_run_get_active_compute_cnt_ko(self, *args):
- self.assertEqual(self.tempestcommon.run(),
- testcase.TestCase.EX_RUN_ERROR)
-
- @mock.patch('functest.opnfv_tests.openstack.tempest.tempest.'
- 'os.path.exists', return_value=False)
- @mock.patch('functest.opnfv_tests.openstack.tempest.tempest.os.makedirs')
- @mock.patch('functest.opnfv_tests.openstack.tempest.tempest.'
- 'TempestResourcesManager.create', return_value={})
- @mock.patch('functest.opnfv_tests.openstack.snaps.snaps_utils.'
- 'get_active_compute_cnt', return_value=2)
- @mock.patch('functest.opnfv_tests.openstack.tempest.tempest.'
- 'conf_utils.configure_tempest', side_effect=Exception)
+ 'TempestCommon.configure', side_effect=Exception)
def test_run_configure_tempest_ko(self, *args):
+ # pylint: disable=unused-argument
self.assertEqual(self.tempestcommon.run(),
testcase.TestCase.EX_RUN_ERROR)
@@ -194,27 +201,24 @@ class OSTempestTesting(unittest.TestCase):
'os.path.exists', return_value=False)
@mock.patch('functest.opnfv_tests.openstack.tempest.tempest.os.makedirs')
@mock.patch('functest.opnfv_tests.openstack.tempest.tempest.'
- 'TempestResourcesManager.create', return_value={})
- @mock.patch('functest.opnfv_tests.openstack.snaps.snaps_utils.'
- 'get_active_compute_cnt', return_value=2)
- @mock.patch('functest.opnfv_tests.openstack.tempest.tempest.'
- 'conf_utils.configure_tempest')
+ 'TempestCommon.configure')
def _test_run(self, status, *args):
+ # pylint: disable=unused-argument
self.assertEqual(self.tempestcommon.run(), status)
- def test_run_missing_generate_test_list(self):
+ def test_run_missing_gen_test_list(self):
with mock.patch.object(self.tempestcommon, 'generate_test_list',
side_effect=Exception):
self._test_run(testcase.TestCase.EX_RUN_ERROR)
- def test_run_apply_tempest_blacklist_ko(self):
+ def test_run_apply_blacklist_ko(self):
with mock.patch.object(self.tempestcommon, 'generate_test_list'), \
- mock.patch.object(self.tempestcommon,
- 'apply_tempest_blacklist',
- side_effect=Exception()):
+ mock.patch.object(self.tempestcommon,
+ 'apply_tempest_blacklist',
+ side_effect=Exception()):
self._test_run(testcase.TestCase.EX_RUN_ERROR)
- def test_run_verifier_tests_ko(self, *args):
+ def test_run_verifier_tests_ko(self):
with mock.patch.object(self.tempestcommon, 'generate_test_list'), \
mock.patch.object(self.tempestcommon,
'apply_tempest_blacklist'), \
@@ -224,7 +228,7 @@ class OSTempestTesting(unittest.TestCase):
side_effect=Exception):
self._test_run(testcase.TestCase.EX_RUN_ERROR)
- def test_run_parse_verifier_result_ko(self, *args):
+ def test_run_verif_result_ko(self):
with mock.patch.object(self.tempestcommon, 'generate_test_list'), \
mock.patch.object(self.tempestcommon,
'apply_tempest_blacklist'), \
@@ -233,13 +237,155 @@ class OSTempestTesting(unittest.TestCase):
side_effect=Exception):
self._test_run(testcase.TestCase.EX_RUN_ERROR)
+ @mock.patch('functest.opnfv_tests.openstack.tempest.tempest.TempestCommon.'
+ 'run', return_value=testcase.TestCase.EX_OK)
def test_run(self, *args):
- with mock.patch.object(self.tempestcommon, 'generate_test_list'), \
+ with mock.patch.object(self.tempestcommon, 'update_rally_regex'), \
+ mock.patch.object(self.tempestcommon, 'generate_test_list'), \
mock.patch.object(self.tempestcommon,
'apply_tempest_blacklist'), \
mock.patch.object(self.tempestcommon, 'run_verifier_tests'), \
- mock.patch.object(self.tempestcommon, 'parse_verifier_result'):
+ mock.patch.object(self.tempestcommon,
+ 'parse_verifier_result'):
self._test_run(testcase.TestCase.EX_OK)
+ args[0].assert_called_once_with()
+
+ @mock.patch('functest.opnfv_tests.openstack.tempest.tempest.LOGGER.debug')
+ def test_create_verifier(self, mock_logger_debug):
+ mock_popen = mock.Mock()
+ attrs = {'poll.return_value': None,
+ 'stdout.readline.return_value': '0'}
+ mock_popen.configure_mock(**attrs)
+
+ setattr(config.CONF, 'tempest_verifier_name', 'test_verifier_name')
+ with mock.patch('subprocess.Popen', side_effect=Exception), \
+ self.assertRaises(Exception):
+ self.tempestcommon.create_verifier()
+ mock_logger_debug.assert_any_call("Tempest test_verifier_name"
+ " does not exist")
+
+ def test_get_verifier_id_default(self):
+ setattr(config.CONF, 'tempest_verifier_name', 'test_verifier_name')
+
+ with mock.patch('functest.opnfv_tests.openstack.tempest.'
+ 'tempest.subprocess.Popen') as mock_popen:
+ attrs = {'return_value.__enter__.return_value.'
+ 'stdout.readline.return_value': b'test_deploy_id'}
+ mock_popen.configure_mock(**attrs)
+
+ self.assertEqual(self.tempestcommon.get_verifier_id(),
+ 'test_deploy_id')
+
+ def test_get_depl_id_default(self):
+ setattr(config.CONF, 'tempest_verifier_name', 'test_deploy_name')
+ with mock.patch('functest.opnfv_tests.openstack.tempest.'
+ 'tempest.subprocess.Popen') as mock_popen:
+ attrs = {'return_value.__enter__.return_value.'
+ 'stdout.readline.return_value': b'test_deploy_id'}
+ mock_popen.configure_mock(**attrs)
+
+ self.assertEqual(rally.RallyBase.get_verifier_deployment_id(),
+ 'test_deploy_id')
+
+ def test_get_verif_repo_dir_default(self):
+ with mock.patch('functest.opnfv_tests.openstack.tempest.'
+ 'tempest.os.path.join',
+ return_value='test_verifier_repo_dir'):
+ self.assertEqual(self.tempestcommon.get_verifier_repo_dir(''),
+ 'test_verifier_repo_dir')
+
+ def test_get_depl_dir_default(self):
+ with mock.patch('functest.opnfv_tests.openstack.tempest.'
+ 'tempest.os.path.join',
+ return_value='test_verifier_repo_dir'):
+ self.assertEqual(
+ self.tempestcommon.get_verifier_deployment_dir('', ''),
+ 'test_verifier_repo_dir')
+
+ def _test_missing_param(self, params, image_id, flavor_id, alt=False):
+ with mock.patch('six.moves.configparser.RawConfigParser.'
+ 'set') as mset, \
+ mock.patch('six.moves.configparser.RawConfigParser.'
+ 'read') as mread, \
+ mock.patch('six.moves.configparser.RawConfigParser.'
+ 'write') as mwrite, \
+ mock.patch('six.moves.builtins.open', mock.mock_open()), \
+ mock.patch('functest.utils.functest_utils.yaml.safe_load',
+ return_value={'validation': {'ssh_timeout': 300}}):
+ os.environ['OS_INTERFACE'] = ''
+ if not alt:
+ self.tempestcommon.configure_tempest_update_params(
+ 'test_conf_file', image_id=image_id,
+ flavor_id=flavor_id)
+ mset.assert_any_call(params[0], params[1], params[2])
+ else:
+ self.tempestcommon.configure_tempest_update_params(
+ 'test_conf_file', image_alt_id=image_id,
+ flavor_alt_id=flavor_id)
+ mset.assert_any_call(params[0], params[1], params[2])
+ self.assertTrue(mread.called)
+ self.assertTrue(mwrite.called)
+
+ def test_upd_missing_image_id(self):
+ self._test_missing_param(('compute', 'image_ref', 'test_image_id'),
+ 'test_image_id', None)
+
+ def test_upd_missing_image_id_alt(self):
+ self._test_missing_param(
+ ('compute', 'image_ref_alt', 'test_image_id_alt'),
+ 'test_image_id_alt', None, alt=True)
+
+ def test_upd_missing_flavor_id(self):
+ self._test_missing_param(('compute', 'flavor_ref', 'test_flavor_id'),
+ None, 'test_flavor_id')
+
+ def test_upd_missing_flavor_id_alt(self):
+ self._test_missing_param(
+ ('compute', 'flavor_ref_alt', 'test_flavor_id_alt'),
+ None, 'test_flavor_id_alt', alt=True)
+
+ def test_verif_missing_conf_file(self):
+ with mock.patch('functest.opnfv_tests.openstack.tempest.'
+ 'tempest.os.path.isfile',
+ return_value=False), \
+ mock.patch('subprocess.check_output') as mexe, \
+ self.assertRaises(Exception) as context:
+ self.tempestcommon.configure_verifier('test_dep_dir')
+ mexe.assert_called_once_with("rally verify configure-verifier")
+ msg = ("Tempest configuration file 'test_dep_dir/tempest.conf'"
+ " NOT found.")
+ self.assertTrue(msg in context.exception)
+
+ def test_configure_verifier_default(self):
+ with mock.patch('functest.opnfv_tests.openstack.tempest.'
+ 'tempest.os.path.isfile',
+ return_value=True), \
+ mock.patch('subprocess.check_output') as mexe:
+ self.assertEqual(
+ self.tempestcommon.configure_verifier('test_dep_dir'),
+ 'test_dep_dir/tempest.conf')
+ mexe.assert_called_once_with(
+ ['rally', 'verify', 'configure-verifier', '--reconfigure',
+ '--id', str(getattr(config.CONF, 'tempest_verifier_name'))])
+
+ def test_is_successful_false(self):
+ with mock.patch('six.moves.builtins.super') as mock_super:
+ self.tempestcommon.deny_skipping = True
+ self.tempestcommon.details = {"skipped_number": 2}
+ self.assertEqual(self.tempestcommon.is_successful(),
+ testcase.TestCase.EX_TESTCASE_FAILED)
+ mock_super(tempest.TempestCommon,
+ self).is_successful.assert_not_called()
+
+ def test_is_successful_true(self):
+ with mock.patch('six.moves.builtins.super') as mock_super:
+ self.tempestcommon.deny_skipping = False
+ self.tempestcommon.details = {"skipped_number": 2}
+ mock_super(tempest.TempestCommon,
+ self).is_successful.return_value = 567
+ self.assertEqual(self.tempestcommon.is_successful(), 567)
+ mock_super(tempest.TempestCommon,
+ self).is_successful.assert_called()
if __name__ == "__main__":
diff --git a/functest/cli/commands/__init__.py b/functest/tests/unit/openstack/vmtp/__init__.py
index e69de29bb..e69de29bb 100644
--- a/functest/cli/commands/__init__.py
+++ b/functest/tests/unit/openstack/vmtp/__init__.py
diff --git a/functest/tests/unit/openstack/vmtp/test_vmtp.py b/functest/tests/unit/openstack/vmtp/test_vmtp.py
new file mode 100644
index 000000000..850273476
--- /dev/null
+++ b/functest/tests/unit/openstack/vmtp/test_vmtp.py
@@ -0,0 +1,90 @@
+#!/usr/bin/env python
+
+# Copyright (c) 2018 Orange and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+
+# pylint: disable=missing-docstring
+
+import logging
+import unittest
+
+import mock
+import munch
+import shade
+
+from functest.opnfv_tests.openstack.vmtp import vmtp
+
+
+class VmtpInitTesting(unittest.TestCase):
+
+ def _test_exc_init(self):
+ testcase = vmtp.Vmtp()
+ self.assertEqual(testcase.case_name, "vmtp")
+ self.assertEqual(testcase.result, 0)
+ for func in ['generate_keys', 'write_config', 'run_vmtp']:
+ with self.assertRaises(AssertionError):
+ getattr(testcase, func)()
+ self.assertEqual(testcase.run(), testcase.EX_RUN_ERROR)
+ self.assertEqual(testcase.clean(), None)
+
+ @mock.patch('os_client_config.get_config', side_effect=Exception)
+ def test_init1(self, *args):
+ self._test_exc_init()
+ args[0].assert_called_once_with()
+
+ @mock.patch('os_client_config.get_config')
+ @mock.patch('shade.OpenStackCloud', side_effect=Exception)
+ def test_init2(self, *args):
+ self._test_exc_init()
+ args[0].assert_called_once_with(cloud_config=mock.ANY)
+ args[1].assert_called_once_with()
+
+ @mock.patch('os_client_config.get_config')
+ @mock.patch('shade.OpenStackCloud')
+ def test_case_name(self, *args):
+ testcase = vmtp.Vmtp(case_name="foo")
+ self.assertEqual(testcase.case_name, "foo")
+ args[0].assert_called_once_with(cloud_config=mock.ANY)
+ args[1].assert_called_once_with()
+
+
+class VmtpTesting(unittest.TestCase):
+
+ def setUp(self):
+ with mock.patch('os_client_config.get_config'), \
+ mock.patch('shade.OpenStackCloud'):
+ self.testcase = vmtp.Vmtp()
+ self.testcase.cloud = mock.Mock()
+ self.testcase.cloud.create_keypair.return_value = munch.Munch(
+ private_key="priv", public_key="pub", id="id")
+
+ @mock.patch('six.moves.builtins.open')
+ def test_generate_keys1(self, *args):
+ self.testcase.generate_keys()
+ self.testcase.cloud.create_keypair.assert_called_once_with(
+ f'vmtp_{self.testcase.guid}')
+ self.testcase.cloud.delete_keypair.assert_called_once_with('id')
+ calls = [mock.call(
+ self.testcase.privkey_filename, 'w', encoding='utf-8'),
+ mock.call(
+ self.testcase.pubkey_filename, 'w', encoding='utf-8')]
+ args[0].assert_has_calls(calls, any_order=True)
+
+ @mock.patch('six.moves.builtins.open')
+ def test_generate_keys2(self, *args):
+ with mock.patch.object(
+ self.testcase.cloud, "create_keypair",
+ side_effect=shade.OpenStackCloudException(None)) as mock_obj, \
+ self.assertRaises(shade.OpenStackCloudException):
+ self.testcase.generate_keys()
+ mock_obj.assert_called_once_with(f'vmtp_{self.testcase.guid}')
+ args[0].assert_not_called()
+
+
+if __name__ == "__main__":
+ logging.disable(logging.CRITICAL)
+ unittest.main(verbosity=2)
diff --git a/functest/energy/__init__.py b/functest/tests/unit/openstack/vping/__init__.py
index e69de29bb..e69de29bb 100644
--- a/functest/energy/__init__.py
+++ b/functest/tests/unit/openstack/vping/__init__.py
diff --git a/functest/tests/unit/openstack/vping/test_vping.py b/functest/tests/unit/openstack/vping/test_vping.py
deleted file mode 100644
index dbfb679f2..000000000
--- a/functest/tests/unit/openstack/vping/test_vping.py
+++ /dev/null
@@ -1,159 +0,0 @@
-# Copyright (c) 2017 Cable Television Laboratories, Inc. and others.
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-
-import unittest
-
-import mock
-
-from snaps.config.keypair import KeypairConfig
-from snaps.config.network import NetworkConfig, PortConfig, SubnetConfig
-from snaps.config.router import RouterConfig
-from snaps.config.security_group import SecurityGroupConfig
-from snaps.config.vm_inst import VmInstanceConfig
-
-from snaps.openstack.create_image import OpenStackImage
-from snaps.openstack.create_instance import OpenStackVmInstance
-from snaps.openstack.create_keypairs import OpenStackKeypair
-from snaps.openstack.create_network import OpenStackNetwork
-from snaps.openstack.create_router import OpenStackRouter
-from snaps.openstack.create_security_group import OpenStackSecurityGroup
-
-from snaps.openstack.os_credentials import OSCreds
-
-from functest.core.testcase import TestCase
-from functest.opnfv_tests.openstack.vping import vping_userdata, vping_ssh
-
-
-class VPingUserdataTesting(unittest.TestCase):
- """
- Ensures the VPingUserdata class can run in Functest. This test does not
- actually connect with an OpenStack pod.
- """
-
- def setUp(self):
- self.os_creds = OSCreds(
- username='user', password='pass',
- auth_url='http://foo.com:5000/v3', project_name='bar')
-
- self.vping_userdata = vping_userdata.VPingUserdata(
- os_creds=self.os_creds)
-
- @mock.patch('snaps.openstack.utils.deploy_utils.create_vm_instance')
- @mock.patch('functest.opnfv_tests.openstack.vping.vping_base.os.'
- 'path.exists', return_value=True)
- @mock.patch('snaps.openstack.create_flavor.OpenStackFlavor.create',
- return_value=None)
- @mock.patch('snaps.openstack.create_instance.OpenStackVmInstance.'
- 'get_port_ip', return_value='10.0.0.1')
- @mock.patch('snaps.openstack.create_instance.OpenStackVmInstance.'
- 'vm_active', return_value=True)
- def test_vping_userdata(self, deploy_vm, path_exists, create_flavor,
- get_port_ip, vm_active):
- with mock.patch('snaps.openstack.utils.deploy_utils.create_image',
- return_value=OpenStackImage(self.os_creds, None)), \
- mock.patch('snaps.openstack.utils.deploy_utils.create_network',
- return_value=OpenStackNetwork(
- self.os_creds, NetworkConfig(name='foo'))), \
- mock.patch('snaps.openstack.utils.deploy_utils.'
- 'create_vm_instance',
- return_value=OpenStackVmInstance(
- self.os_creds,
- VmInstanceConfig(
- name='foo', flavor='bar',
- port_settings=[PortConfig(
- name='foo', network_name='bar')]),
- None)), \
- mock.patch('snaps.openstack.create_instance.'
- 'OpenStackVmInstance.get_console_output',
- return_value='vPing OK'):
- self.assertEquals(TestCase.EX_OK, self.vping_userdata.run())
-
-
-class VPingSSHTesting(unittest.TestCase):
- """
- Ensures the VPingUserdata class can run in Functest. This test does not
- actually connect with an OpenStack pod.
- """
-
- def setUp(self):
- self.os_creds = OSCreds(
- username='user', password='pass',
- auth_url='http://foo.com:5000/v3', project_name='bar')
-
- self.vping_ssh = vping_ssh.VPingSSH(
- os_creds=self.os_creds)
-
- @mock.patch('snaps.openstack.utils.deploy_utils.create_vm_instance')
- @mock.patch('functest.opnfv_tests.openstack.vping.vping_base.os.'
- 'path.exists', return_value=True)
- @mock.patch('snaps.openstack.create_flavor.OpenStackFlavor.create',
- return_value=None)
- @mock.patch('snaps.openstack.create_instance.OpenStackVmInstance.'
- 'get_port_ip', return_value='10.0.0.1')
- @mock.patch('snaps.openstack.create_instance.OpenStackVmInstance.'
- 'vm_active', return_value=True)
- @mock.patch('snaps.openstack.create_instance.OpenStackVmInstance.'
- 'vm_ssh_active', return_value=True)
- @mock.patch('snaps.openstack.create_instance.OpenStackVmInstance.'
- 'ssh_client', return_value=True)
- @mock.patch('scp.SCPClient')
- @mock.patch('functest.opnfv_tests.openstack.vping.vping_ssh.'
- 'VPingSSH._transfer_ping_script', return_value=True)
- @mock.patch('functest.opnfv_tests.openstack.vping.vping_ssh.'
- 'VPingSSH._do_vping_ssh', return_value=TestCase.EX_OK)
- @mock.patch('functest.opnfv_tests.openstack.snaps.snaps_utils.'
- 'get_ext_net_name', return_value='foo')
- def test_vping_ssh(self, create_vm, path_exists,
- flavor_create, get_port_ip, vm_active, ssh_active,
- ssh_client, scp_client, trans_script, do_vping_ssh,
- ext_net_name):
- os_vm_inst = mock.MagicMock(name='get_console_output')
- os_vm_inst.get_console_output.return_value = 'vPing OK'
- ssh_client = mock.MagicMock(name='get_transport')
- ssh_client.get_transport.return_value = None
- scp_client = mock.MagicMock(name='put')
- scp_client.put.return_value = None
-
- with mock.patch('snaps.openstack.utils.deploy_utils.create_image',
- return_value=OpenStackImage(self.os_creds, None)), \
- mock.patch('snaps.openstack.utils.deploy_utils.create_network',
- return_value=OpenStackNetwork(
- self.os_creds,
- NetworkConfig(
- name='foo',
- subnet_settings=[
- SubnetConfig(
- name='bar',
- cidr='10.0.0.1/24')]))), \
- mock.patch('snaps.openstack.utils.deploy_utils.'
- 'create_vm_instance',
- return_value=OpenStackVmInstance(
- self.os_creds,
- VmInstanceConfig(
- name='foo', flavor='bar',
- port_settings=[PortConfig(
- name='foo', network_name='bar')]),
- None)), \
- mock.patch('snaps.openstack.utils.deploy_utils.create_keypair',
- return_value=OpenStackKeypair(
- self.os_creds, KeypairConfig(name='foo'))), \
- mock.patch('snaps.openstack.utils.deploy_utils.create_router',
- return_value=OpenStackRouter(
- self.os_creds, RouterConfig(name='foo'))), \
- mock.patch('snaps.openstack.utils.deploy_utils.'
- 'create_security_group',
- return_value=OpenStackSecurityGroup(
- self.os_creds,
- SecurityGroupConfig(name='foo'))), \
- mock.patch('snaps.openstack.create_instance.'
- 'OpenStackVmInstance.'
- 'get_vm_inst', return_value=os_vm_inst), \
- mock.patch('snaps.openstack.create_instance.'
- 'OpenStackVmInstance.'
- 'ssh_client', return_value=ssh_client):
- self.assertEquals(TestCase.EX_OK, self.vping_ssh.run())
diff --git a/functest/tests/unit/openstack/vping/test_vping_ssh.py b/functest/tests/unit/openstack/vping/test_vping_ssh.py
new file mode 100644
index 000000000..a07148aab
--- /dev/null
+++ b/functest/tests/unit/openstack/vping/test_vping_ssh.py
@@ -0,0 +1,147 @@
+#!/usr/bin/env python
+
+# Copyright (c) 2018 Orange and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+
+# pylint: disable=missing-docstring
+
+import logging
+import unittest
+
+from paramiko import ssh_exception
+import mock
+import munch
+import shade
+
+from functest.opnfv_tests.openstack.vping import vping_ssh
+from functest.utils import config
+
+
+class VpingSSHTesting(unittest.TestCase):
+
+ def setUp(self):
+ with mock.patch('functest.core.singlevm.SingleVm2.__init__'):
+ self.vping = vping_ssh.VPingSSH()
+ self.vping.cloud = mock.Mock()
+ self.vping.case_name = 'vping'
+ self.vping.guid = '1'
+
+ @mock.patch('functest.core.singlevm.SingleVm2.prepare',
+ side_effect=Exception)
+ def test_prepare_exc1(self, *args):
+ with self.assertRaises(Exception):
+ self.vping.prepare()
+ args[0].assert_called_once_with()
+
+ @mock.patch('functest.opnfv_tests.openstack.vping.vping_ssh.VPingSSH.'
+ 'boot_vm',
+ side_effect=Exception)
+ @mock.patch('functest.core.singlevm.SingleVm2.prepare')
+ def test_prepare_exc2(self, *args):
+ self.vping.sec = munch.Munch(id='foo')
+ with self.assertRaises(Exception):
+ self.vping.prepare()
+ args[0].assert_called_once_with()
+ args[1].assert_called_once_with(
+ f'{self.vping.case_name}-vm2_{self.vping.guid}',
+ security_groups=[self.vping.sec.id])
+
+ @mock.patch('functest.opnfv_tests.openstack.vping.vping_ssh.VPingSSH.'
+ 'boot_vm')
+ @mock.patch('functest.core.singlevm.SingleVm2.prepare')
+ def test_prepare(self, *args):
+ self.vping.sec = munch.Munch(id='foo')
+ self.vping.prepare()
+ args[0].assert_called_once_with()
+ args[1].assert_called_once_with(
+ f'{self.vping.case_name}-vm2_{self.vping.guid}',
+ security_groups=[self.vping.sec.id])
+
+ @mock.patch('functest.opnfv_tests.openstack.vping.vping_ssh.VPingSSH.'
+ 'check_regex_in_console', return_value=True)
+ def test_execute_exc(self, *args):
+ self.vping.vm2 = munch.Munch(private_v4='127.0.0.1', name='foo')
+ self.vping.ssh = mock.Mock()
+ self.vping.ssh.exec_command.side_effect = ssh_exception.SSHException
+ with self.assertRaises(ssh_exception.SSHException):
+ self.vping.execute()
+ self.vping.ssh.exec_command.assert_called_once_with(
+ f'ping -c 1 {self.vping.vm2.private_v4}')
+ args[0].assert_called_once_with('foo')
+
+ @mock.patch('functest.opnfv_tests.openstack.vping.vping_ssh.VPingSSH.'
+ 'check_regex_in_console', return_value=False)
+ def test_execute_exc2(self, *args):
+ self.vping.vm2 = munch.Munch(private_v4='127.0.0.1', name='foo')
+ self.vping.ssh = mock.Mock()
+ self.vping.execute()
+ self.vping.ssh.exec_command.assert_not_called()
+ args[0].assert_called_once_with('foo')
+
+ def _test_execute(self, ret=0):
+ self.vping.vm2 = munch.Munch(private_v4='127.0.0.1', name='foo')
+ self.vping.ssh = mock.Mock()
+ stdout = mock.Mock()
+ stdout.channel.recv_exit_status.return_value = ret
+ self.vping.ssh.exec_command.return_value = (None, stdout, mock.Mock())
+ with mock.patch(
+ 'functest.opnfv_tests.openstack.vping.vping_ssh.VPingSSH.'
+ 'check_regex_in_console', return_value=True) as mock_check:
+ self.assertEqual(self.vping.execute(), ret)
+ mock_check.assert_called_once_with('foo')
+ self.vping.ssh.exec_command.assert_called_once_with(
+ f'ping -c 1 {self.vping.vm2.private_v4}')
+
+ def test_execute1(self):
+ self._test_execute()
+
+ def test_execute2(self):
+ self._test_execute(1)
+
+ def test_clean_exc1(self):
+ self.vping.cloud = None
+ with self.assertRaises(AssertionError):
+ self.vping.clean()
+
+ def test_clean_exc2(self):
+ self.vping.vm2 = munch.Munch(id='vm2')
+ mdelete_server = self.vping.cloud.delete_server
+ mdelete_server.side_effect = shade.OpenStackCloudException(None)
+ with self.assertRaises(shade.OpenStackCloudException):
+ self.vping.clean()
+
+ @mock.patch('functest.core.singlevm.SingleVm2.clean',
+ side_effect=Exception)
+ def test_clean_exc3(self, *args):
+ self.vping.vm2 = munch.Munch(id='vm2')
+ with self.assertRaises(Exception):
+ self.vping.clean()
+ self.vping.cloud.delete_server.assert_called_once_with(
+ self.vping.vm2, wait=True,
+ timeout=getattr(config.CONF, 'vping_vm_delete_timeout'))
+ args[0].assert_called_once_with()
+
+ @mock.patch('functest.core.singlevm.SingleVm2.clean')
+ def test_clean1(self, *args):
+ self.vping.vm2 = None
+ self.vping.clean()
+ self.vping.cloud.delete_server.assert_not_called()
+ args[0].assert_called_once_with()
+
+ @mock.patch('functest.core.singlevm.SingleVm2.clean')
+ def test_clean2(self, *args):
+ self.vping.vm2 = munch.Munch(id='vm2')
+ self.vping.clean()
+ self.vping.cloud.delete_server.assert_called_once_with(
+ self.vping.vm2, wait=True,
+ timeout=getattr(config.CONF, 'vping_vm_delete_timeout'))
+ args[0].assert_called_once_with()
+
+
+if __name__ == '__main__':
+ logging.disable(logging.CRITICAL)
+ unittest.main(verbosity=2)
diff --git a/functest/tests/unit/test_utils.py b/functest/tests/unit/test_utils.py
deleted file mode 100644
index 159047649..000000000
--- a/functest/tests/unit/test_utils.py
+++ /dev/null
@@ -1,29 +0,0 @@
-#!/usr/bin/env python
-
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-
-import re
-
-
-class RegexMatch(object):
- def __init__(self, msg):
- self.msg = msg
-
- def __eq__(self, other):
- match = re.search(self.msg, other)
- if match:
- return True
- return False
-
-
-class SubstrMatch(object):
- def __init__(self, msg):
- self.msg = msg
-
- def __eq__(self, other):
- if self.msg in other:
- return True
- return False
diff --git a/functest/tests/unit/utils/test_decorators.py b/functest/tests/unit/utils/test_decorators.py
deleted file mode 100644
index 82291fa2d..000000000
--- a/functest/tests/unit/utils/test_decorators.py
+++ /dev/null
@@ -1,126 +0,0 @@
-#!/usr/bin/env python
-
-# Copyright (c) 2017 Orange and others.
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-
-"""Define the class required to fully cover decorators."""
-
-from datetime import datetime
-import errno
-import json
-import logging
-import os
-import unittest
-
-import mock
-
-from functest.utils import decorators
-from functest.utils import functest_utils
-from functest.utils.constants import CONST
-
-__author__ = "Cedric Ollivier <cedric.ollivier@orange.com>"
-
-VERSION = 'master'
-DIR = '/dev'
-FILE = '{}/null'.format(DIR)
-URL = 'file://{}'.format(FILE)
-
-
-class DecoratorsTesting(unittest.TestCase):
- # pylint: disable=missing-docstring
-
- _case_name = 'base'
- _project_name = 'functest'
- _start_time = 1.0
- _stop_time = 2.0
- _result = 'PASS'
- _build_tag = VERSION
- _node_name = 'bar'
- _deploy_scenario = 'foo'
- _installer_type = 'debian'
-
- def setUp(self):
- os.environ['INSTALLER_TYPE'] = self._installer_type
- os.environ['DEPLOY_SCENARIO'] = self._deploy_scenario
- os.environ['NODE_NAME'] = self._node_name
- os.environ['BUILD_TAG'] = self._build_tag
-
- def test_wraps(self):
- self.assertEqual(functest_utils.push_results_to_db.__name__,
- "push_results_to_db")
-
- def _get_json(self):
- stop_time = datetime.fromtimestamp(self._stop_time).strftime(
- '%Y-%m-%d %H:%M:%S')
- start_time = datetime.fromtimestamp(self._start_time).strftime(
- '%Y-%m-%d %H:%M:%S')
- data = {'project_name': self._project_name,
- 'stop_date': stop_time, 'start_date': start_time,
- 'case_name': self._case_name, 'build_tag': self._build_tag,
- 'pod_name': self._node_name, 'installer': self._installer_type,
- 'scenario': self._deploy_scenario, 'version': VERSION,
- 'details': {}, 'criteria': self._result}
- return json.dumps(data, sort_keys=True)
-
- @mock.patch('{}.get_version'.format(functest_utils.__name__),
- return_value=VERSION)
- @mock.patch('requests.post')
- def test_http_shema(self, *args):
- CONST.__setattr__('results_test_db_url', 'http://127.0.0.1')
- self.assertTrue(functest_utils.push_results_to_db(
- self._project_name, self._case_name, self._start_time,
- self._stop_time, self._result, {}))
- args[1].assert_called_once_with()
- args[0].assert_called_once_with(
- 'http://127.0.0.1', data=self._get_json(),
- headers={'Content-Type': 'application/json'})
-
- def test_wrong_shema(self):
- CONST.__setattr__('results_test_db_url', '/dev/null')
- self.assertFalse(functest_utils.push_results_to_db(
- self._project_name, self._case_name, self._start_time,
- self._stop_time, self._result, {}))
-
- @mock.patch('{}.get_version'.format(functest_utils.__name__),
- return_value=VERSION)
- def _test_dump(self, *args):
- CONST.__setattr__('results_test_db_url', URL)
- with mock.patch.object(decorators, 'open', mock.mock_open(),
- create=True) as mock_open:
- self.assertTrue(functest_utils.push_results_to_db(
- self._project_name, self._case_name, self._start_time,
- self._stop_time, self._result, {}))
- mock_open.assert_called_once_with(FILE, 'a')
- handle = mock_open()
- call_args, _ = handle.write.call_args
- self.assertIn('POST', call_args[0])
- self.assertIn(self._get_json(), call_args[0])
- args[0].assert_called_once_with()
-
- @mock.patch('os.makedirs')
- def test_default_dump(self, mock_method=None):
- self._test_dump()
- mock_method.assert_called_once_with(DIR)
-
- @mock.patch('os.makedirs', side_effect=OSError(errno.EEXIST, ''))
- def test_makedirs_dir_exists(self, mock_method=None):
- self._test_dump()
- mock_method.assert_called_once_with(DIR)
-
- @mock.patch('os.makedirs', side_effect=OSError)
- def test_makedirs_exc(self, *args):
- CONST.__setattr__('results_test_db_url', URL)
- self.assertFalse(
- functest_utils.push_results_to_db(
- self._project_name, self._case_name, self._start_time,
- self._stop_time, self._result, {}))
- args[0].assert_called_once_with(DIR)
-
-
-if __name__ == "__main__":
- logging.disable(logging.CRITICAL)
- unittest.main(verbosity=2)
diff --git a/functest/tests/unit/utils/test_env.py b/functest/tests/unit/utils/test_env.py
new file mode 100644
index 000000000..49d2d974c
--- /dev/null
+++ b/functest/tests/unit/utils/test_env.py
@@ -0,0 +1,57 @@
+#!/usr/bin/env python
+
+# Copyright (c) 2018 Orange and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+
+# pylint: disable=missing-docstring
+
+import logging
+import os
+import unittest
+
+from six.moves import reload_module
+
+from functest.utils import env
+
+
+class EnvTesting(unittest.TestCase):
+ # pylint: disable=missing-docstring
+
+ def setUp(self):
+ os.environ['FOO'] = 'foo'
+ os.environ['BUILD_TAG'] = 'master'
+ os.environ['CI_LOOP'] = 'weekly'
+
+ def test_get_unset_unknown_env(self):
+ del os.environ['FOO']
+ self.assertEqual(env.get('FOO'), None)
+
+ def test_get_unknown_env(self):
+ self.assertEqual(env.get('FOO'), 'foo')
+ reload_module(env)
+
+ def test_get_unset_env(self):
+ del os.environ['CI_LOOP']
+ self.assertEqual(
+ env.get('CI_LOOP'), env.INPUTS['CI_LOOP'])
+
+ def test_get_env(self):
+ self.assertEqual(
+ env.get('CI_LOOP'), 'weekly')
+
+ def test_get_unset_env2(self):
+ del os.environ['BUILD_TAG']
+ self.assertEqual(
+ env.get('BUILD_TAG'), env.INPUTS['BUILD_TAG'])
+
+ def test_get_env2(self):
+ self.assertEqual(env.get('BUILD_TAG'), 'master')
+
+
+if __name__ == "__main__":
+ logging.disable(logging.CRITICAL)
+ unittest.main(verbosity=2)
diff --git a/functest/tests/unit/utils/test_functest_utils.py b/functest/tests/unit/utils/test_functest_utils.py
index 7a77d25b9..4b642ff9d 100644
--- a/functest/tests/unit/utils/test_functest_utils.py
+++ b/functest/tests/unit/utils/test_functest_utils.py
@@ -7,22 +7,24 @@
# which accompanies this distribution, and is available at
# http://www.apache.org/licenses/LICENSE-2.0
+# pylint: disable=missing-docstring
+
import logging
-import pkg_resources
-import os
import time
import unittest
import mock
-import requests
-from six.moves import urllib
+import pkg_resources
+import six
-from functest.tests.unit import test_utils
from functest.utils import functest_utils
-from functest.utils.constants import CONST
class FunctestUtilsTesting(unittest.TestCase):
+ # pylint: disable=too-many-instance-attributes,too-many-public-methods
+
+ readline = 0
+ test_ip = ['10.1.23.4', '10.1.14.15', '10.1.16.15']
def setUp(self):
self.url = 'http://www.opnfv.org/'
@@ -53,8 +55,6 @@ class FunctestUtilsTesting(unittest.TestCase):
self.cmd = 'test_cmd'
self.output_file = 'test_output_file'
self.testname = 'testname'
- self.testcase_dict = {'case_name': 'testname',
- 'criteria': self.criteria}
self.parameter = 'general.openstack.image_name'
self.config_yaml = pkg_resources.resource_filename(
'functest', 'ci/config_functest.yaml')
@@ -63,56 +63,6 @@ class FunctestUtilsTesting(unittest.TestCase):
self.file_yaml = {'general': {'openstack': {'image_name':
'test_image_name'}}}
- @mock.patch('six.moves.urllib.request.urlopen',
- side_effect=urllib.error.URLError('no host given'))
- def test_check_internet_connectivity_failed(self, mock_method):
- self.assertFalse(functest_utils.check_internet_connectivity())
- mock_method.assert_called_once_with(self.url, timeout=self.timeout)
-
- @mock.patch('six.moves.urllib.request.urlopen')
- def test_check_internet_connectivity_default(self, mock_method):
- self.assertTrue(functest_utils.check_internet_connectivity())
- mock_method.assert_called_once_with(self.url, timeout=self.timeout)
-
- @mock.patch('six.moves.urllib.request.urlopen')
- def test_check_internet_connectivity_debian(self, mock_method):
- self.url = "https://www.debian.org/"
- self.assertTrue(functest_utils.check_internet_connectivity(self.url))
- mock_method.assert_called_once_with(self.url, timeout=self.timeout)
-
- @mock.patch('six.moves.urllib.request.urlopen',
- side_effect=urllib.error.URLError('no host given'))
- def test_download_url_failed(self, mock_url):
- self.assertFalse(functest_utils.download_url(self.url, self.dest_path))
-
- @mock.patch('six.moves.urllib.request.urlopen')
- def test_download_url_default(self, mock_url):
- with mock.patch("six.moves.builtins.open", mock.mock_open()) as m, \
- mock.patch('functest.utils.functest_utils.shutil.copyfileobj')\
- as mock_sh:
- name = self.url.rsplit('/')[-1]
- dest = self.dest_path + "/" + name
- self.assertTrue(functest_utils.download_url(self.url,
- self.dest_path))
- m.assert_called_once_with(dest, 'wb')
- self.assertTrue(mock_sh.called)
-
- def test_get_version_daily_job(self):
- CONST.__setattr__('BUILD_TAG', self.build_tag)
- self.assertEqual(functest_utils.get_version(), self.version)
-
- def test_get_version_weekly_job(self):
- CONST.__setattr__('BUILD_TAG', self.build_tag_week)
- self.assertEqual(functest_utils.get_version(), self.version)
-
- def test_get_version_with_dummy_build_tag(self):
- CONST.__setattr__('BUILD_TAG', 'whatever')
- self.assertEqual(functest_utils.get_version(), 'unknown')
-
- def test_get_version_unknown(self):
- CONST.__setattr__('BUILD_TAG', 'unknown_build_tag')
- self.assertEqual(functest_utils.get_version(), "unknown")
-
def _get_env_dict(self, var):
dic = {'INSTALLER_TYPE': self.installer,
'DEPLOY_SCENARIO': self.scenario,
@@ -121,87 +71,6 @@ class FunctestUtilsTesting(unittest.TestCase):
dic.pop(var, None)
return dic
- def _test_push_results_to_db_missing_env(self, env_var):
- dic = self._get_env_dict(env_var)
- CONST.__setattr__('results_test_db_url', self.db_url)
- with mock.patch.dict(os.environ,
- dic,
- clear=True), \
- mock.patch('functest.utils.functest_utils.logger.error') \
- as mock_logger_error:
- functest_utils.push_results_to_db(self.project, self.case_name,
- self.start_date, self.stop_date,
- self.result, self.details)
- mock_logger_error.assert_called_once_with("Please set env var: " +
- str("\'" + env_var +
- "\'"))
-
- def test_push_results_to_db_missing_installer(self):
- self._test_push_results_to_db_missing_env('INSTALLER_TYPE')
-
- def test_push_results_to_db_missing_scenario(self):
- self._test_push_results_to_db_missing_env('DEPLOY_SCENARIO')
-
- def test_push_results_to_db_missing_nodename(self):
- self._test_push_results_to_db_missing_env('NODE_NAME')
-
- def test_push_results_to_db_missing_buildtag(self):
- self._test_push_results_to_db_missing_env('BUILD_TAG')
-
- def test_push_results_to_db_request_post_failed(self):
- dic = self._get_env_dict(None)
- CONST.__setattr__('results_test_db_url', self.db_url)
- with mock.patch.dict(os.environ,
- dic,
- clear=True), \
- mock.patch('functest.utils.functest_utils.logger.error') \
- as mock_logger_error, \
- mock.patch('functest.utils.functest_utils.requests.post',
- side_effect=requests.RequestException):
- self.assertFalse(functest_utils.
- push_results_to_db(self.project, self.case_name,
- self.start_date,
- self.stop_date,
- self.result, self.details))
- mock_logger_error.assert_called_once_with(test_utils.
- RegexMatch("Pushing "
- "Result to"
- " DB"
- "(\S+\s*) "
- "failed:"))
-
- def test_push_results_to_db_request_post_exception(self):
- dic = self._get_env_dict(None)
- CONST.__setattr__('results_test_db_url', self.db_url)
- with mock.patch.dict(os.environ,
- dic,
- clear=True), \
- mock.patch('functest.utils.functest_utils.logger.error') \
- as mock_logger_error, \
- mock.patch('functest.utils.functest_utils.requests.post',
- side_effect=Exception):
- self.assertFalse(functest_utils.
- push_results_to_db(self.project, self.case_name,
- self.start_date,
- self.stop_date,
- self.result, self.details))
- self.assertTrue(mock_logger_error.called)
-
- def test_push_results_to_db_default(self):
- dic = self._get_env_dict(None)
- CONST.__setattr__('results_test_db_url', self.db_url)
- with mock.patch.dict(os.environ,
- dic,
- clear=True), \
- mock.patch('functest.utils.functest_utils.requests.post'):
- self.assertTrue(functest_utils.
- push_results_to_db(self.project, self.case_name,
- self.start_date,
- self.stop_date,
- self.result, self.details))
- readline = 0
- test_ip = ['10.1.23.4', '10.1.14.15', '10.1.16.15']
-
@staticmethod
def readline_side():
if FunctestUtilsTesting.readline == \
@@ -210,173 +79,96 @@ class FunctestUtilsTesting(unittest.TestCase):
FunctestUtilsTesting.readline += 1
return FunctestUtilsTesting.test_ip[FunctestUtilsTesting.readline]
- # TODO: get_resolvconf_ns
- @mock.patch('functest.utils.functest_utils.dns.resolver.Resolver')
- def test_get_resolvconf_ns_default(self, mock_dns_resolve):
- attrs = {'query.return_value': ["test"]}
- mock_dns_resolve.configure_mock(**attrs)
-
- m = mock.Mock()
- attrs = {'readline.side_effect': self.readline_side}
- m.configure_mock(**attrs)
-
- with mock.patch("six.moves.builtins.open") as mo:
- mo.return_value = m
- self.assertEqual(functest_utils.get_resolvconf_ns(),
- self.test_ip[1:])
-
- def _get_environ(self, var):
+ def _get_environ(self, var, *args): # pylint: disable=unused-argument
if var == 'INSTALLER_TYPE':
return self.installer
- elif var == 'DEPLOY_SCENARIO':
+ if var == 'DEPLOY_SCENARIO':
return self.scenario
return var
- def test_get_ci_envvars_default(self):
- with mock.patch('os.environ.get',
- side_effect=self._get_environ):
- dic = {"installer": self.installer,
- "scenario": self.scenario}
- self.assertDictEqual(functest_utils.get_ci_envvars(), dic)
-
- def cmd_readline(self):
+ @staticmethod
+ def cmd_readline():
return 'test_value\n'
- @mock.patch('functest.utils.functest_utils.logger.error')
- @mock.patch('functest.utils.functest_utils.logger.info')
- def test_execute_command_args_present_with_error(self, mock_logger_info,
- mock_logger_error):
+ @mock.patch('functest.utils.functest_utils.LOGGER.error')
+ @mock.patch('functest.utils.functest_utils.LOGGER.info')
+ def test_exec_cmd_args_present_ko(self, mock_logger_info,
+ mock_logger_error):
with mock.patch('functest.utils.functest_utils.subprocess.Popen') \
as mock_subproc_open, \
mock.patch('six.moves.builtins.open',
mock.mock_open()) as mopen:
-
- FunctestUtilsTesting.readline = 0
-
- mock_obj = mock.Mock()
- attrs = {'readline.side_effect': self.cmd_readline()}
- mock_obj.configure_mock(**attrs)
-
- mock_obj2 = mock.Mock()
- attrs = {'stdout': mock_obj, 'wait.return_value': 1}
- mock_obj2.configure_mock(**attrs)
-
- mock_subproc_open.return_value = mock_obj2
-
- resp = functest_utils.execute_command(self.cmd, info=True,
- error_msg=self.error_msg,
- verbose=True,
- output_file=self.output_file)
+ stream = six.BytesIO()
+ stream.write(self.cmd_readline().encode("utf-8"))
+ attrs = {
+ 'return_value.__enter__.return_value.stdout': stream,
+ 'return_value.__enter__.return_value.wait.return_value': 1}
+ mock_subproc_open.configure_mock(**attrs)
+ resp = functest_utils.execute_command(
+ self.cmd, info=True, error_msg=self.error_msg, verbose=True,
+ output_file=self.output_file)
self.assertEqual(resp, 1)
- msg_exec = ("Executing command: '%s'" % self.cmd)
+ msg_exec = f"Executing command: '{self.cmd}'"
mock_logger_info.assert_called_once_with(msg_exec)
- mopen.assert_called_once_with(self.output_file, "w")
+ mopen.assert_called_once_with(
+ self.output_file, "w", encoding='utf-8')
mock_logger_error.assert_called_once_with(self.error_msg)
- @mock.patch('functest.utils.functest_utils.logger.info')
- def test_execute_command_args_present_with_success(self, mock_logger_info,
- ):
+ @mock.patch('functest.utils.functest_utils.LOGGER.info')
+ def test_exec_cmd_args_present_ok(self, mock_logger_info):
with mock.patch('functest.utils.functest_utils.subprocess.Popen') \
as mock_subproc_open, \
mock.patch('six.moves.builtins.open',
mock.mock_open()) as mopen:
-
- FunctestUtilsTesting.readline = 0
-
- mock_obj = mock.Mock()
- attrs = {'readline.side_effect': self.cmd_readline()}
- mock_obj.configure_mock(**attrs)
-
- mock_obj2 = mock.Mock()
- attrs = {'stdout': mock_obj, 'wait.return_value': 0}
- mock_obj2.configure_mock(**attrs)
-
- mock_subproc_open.return_value = mock_obj2
-
- resp = functest_utils.execute_command(self.cmd, info=True,
- error_msg=self.error_msg,
- verbose=True,
- output_file=self.output_file)
+ stream = six.BytesIO()
+ stream.write(self.cmd_readline().encode("utf-8"))
+ attrs = {
+ 'return_value.__enter__.return_value.stdout': stream,
+ 'return_value.__enter__.return_value.wait.return_value': 0}
+ mock_subproc_open.configure_mock(**attrs)
+ resp = functest_utils.execute_command(
+ self.cmd, info=True, error_msg=self.error_msg, verbose=True,
+ output_file=self.output_file)
self.assertEqual(resp, 0)
- msg_exec = ("Executing command: '%s'" % self.cmd)
+ msg_exec = (f"Executing command: '{self.cmd}'")
mock_logger_info.assert_called_once_with(msg_exec)
- mopen.assert_called_once_with(self.output_file, "w")
+ mopen.assert_called_once_with(
+ self.output_file, "w", encoding='utf-8')
@mock.patch('sys.stdout')
- def test_execute_command_args_missing_with_success(self, stdout=None):
+ def test_exec_cmd_args_missing_ok(self, stdout=None):
+ # pylint: disable=unused-argument
with mock.patch('functest.utils.functest_utils.subprocess.Popen') \
as mock_subproc_open:
-
- FunctestUtilsTesting.readline = 2
-
- mock_obj = mock.Mock()
- attrs = {'readline.side_effect': self.cmd_readline()}
- mock_obj.configure_mock(**attrs)
-
- mock_obj2 = mock.Mock()
- attrs = {'stdout': mock_obj, 'wait.return_value': 0}
- mock_obj2.configure_mock(**attrs)
-
- mock_subproc_open.return_value = mock_obj2
-
- resp = functest_utils.execute_command(self.cmd, info=False,
- error_msg="",
- verbose=False,
- output_file=None)
+ stream = six.BytesIO()
+ stream.write(self.cmd_readline().encode("utf-8"))
+ attrs = {
+ 'return_value.__enter__.return_value.stdout': stream,
+ 'return_value.__enter__.return_value.wait.return_value': 0}
+ mock_subproc_open.configure_mock(**attrs)
+ resp = functest_utils.execute_command(
+ self.cmd, info=False, error_msg="", verbose=False,
+ output_file=None)
self.assertEqual(resp, 0)
@mock.patch('sys.stdout')
- def test_execute_command_args_missing_with_error(self, stdout=None):
+ def test_exec_cmd_args_missing_ko(self, stdout=None):
+ # pylint: disable=unused-argument
with mock.patch('functest.utils.functest_utils.subprocess.Popen') \
as mock_subproc_open:
-
- FunctestUtilsTesting.readline = 2
- mock_obj = mock.Mock()
- attrs = {'readline.side_effect': self.cmd_readline()}
- mock_obj.configure_mock(**attrs)
-
- mock_obj2 = mock.Mock()
- attrs = {'stdout': mock_obj, 'wait.return_value': 1}
- mock_obj2.configure_mock(**attrs)
-
- mock_subproc_open.return_value = mock_obj2
-
- resp = functest_utils.execute_command(self.cmd, info=False,
- error_msg="",
- verbose=False,
- output_file=None)
+ attrs = {}
+ stream = six.BytesIO()
+ stream.write(self.cmd_readline().encode("utf-8"))
+ attrs = {
+ 'return_value.__enter__.return_value.stdout': stream,
+ 'return_value.__enter__.return_value.wait.return_value': 1}
+ mock_subproc_open.configure_mock(**attrs)
+ resp = functest_utils.execute_command(
+ self.cmd, info=False, error_msg="", verbose=False,
+ output_file=None)
self.assertEqual(resp, 1)
- def _get_functest_config(self, var):
- return var
-
- @mock.patch('functest.utils.functest_utils.logger.error')
- def test_get_dict_by_test(self, mock_logger_error):
- with mock.patch('six.moves.builtins.open', mock.mock_open()), \
- mock.patch('functest.utils.functest_utils.yaml.safe_load') \
- as mock_yaml:
- mock_obj = mock.Mock()
- attrs = {'get.return_value': [{'testcases': [self.testcase_dict]}]}
- mock_obj.configure_mock(**attrs)
-
- mock_yaml.return_value = mock_obj
-
- self.assertDictEqual(functest_utils.
- get_dict_by_test(self.testname),
- self.testcase_dict)
-
- @mock.patch('functest.utils.functest_utils.get_dict_by_test')
- def test_get_criteria_by_test_default(self, mock_get_dict_by_test):
- mock_get_dict_by_test.return_value = self.testcase_dict
- self.assertEqual(functest_utils.get_criteria_by_test(self.testname),
- self.criteria)
-
- @mock.patch('functest.utils.functest_utils.get_dict_by_test')
- def test_get_criteria_by_test_failed(self, mock_get_dict_by_test):
- mock_get_dict_by_test.return_value = None
- self.assertIsNone(functest_utils.get_criteria_by_test(self.testname))
-
- def test_get_parameter_from_yaml_failed(self):
+ def test_get_param_from_yaml_failed(self):
self.file_yaml['general'] = None
with mock.patch('six.moves.builtins.open', mock.mock_open()), \
mock.patch('functest.utils.functest_utils.yaml.safe_load') \
@@ -385,11 +177,11 @@ class FunctestUtilsTesting(unittest.TestCase):
mock_yaml.return_value = self.file_yaml
functest_utils.get_parameter_from_yaml(self.parameter,
self.test_file)
- self.assertTrue(("The parameter %s is not"
- " defined in config_functest.yaml" %
- self.parameter) in excep.exception)
+ self.assertTrue((f"The parameter {self.parameter} is not"
+ " defined in config_functest.yaml"
+ ) in excep.exception)
- def test_get_parameter_from_yaml_default(self):
+ def test_get_param_from_yaml_def(self):
with mock.patch('six.moves.builtins.open', mock.mock_open()), \
mock.patch('functest.utils.functest_utils.yaml.safe_load') \
as mock_yaml:
@@ -399,28 +191,217 @@ class FunctestUtilsTesting(unittest.TestCase):
self.test_file),
'test_image_name')
- @mock.patch('functest.utils.functest_utils.get_parameter_from_yaml')
- def test_get_functest_config_default(self, mock_get_parameter_from_yaml):
- with mock.patch.dict(os.environ,
- {'CONFIG_FUNCTEST_YAML': self.config_yaml}):
- functest_utils.get_functest_config(self.parameter)
- mock_get_parameter_from_yaml. \
- assert_called_once_with(self.parameter,
- self.config_yaml)
-
- def test_get_functest_yaml(self):
- with mock.patch('six.moves.builtins.open', mock.mock_open()), \
- mock.patch('functest.utils.functest_utils.yaml.safe_load') \
- as mock_yaml:
- mock_yaml.return_value = self.file_yaml
- resp = functest_utils.get_functest_yaml()
- self.assertEqual(resp, self.file_yaml)
-
- @mock.patch('functest.utils.functest_utils.logger.info')
- def test_print_separator(self, mock_logger_info):
- functest_utils.print_separator()
- mock_logger_info.assert_called_once_with("======================="
- "=======================")
+ def test_nova_version_exc1(self):
+ # pylint: disable=protected-access
+ cloud = mock.Mock()
+ cloud._compute_client.request.return_value = None
+ self.assertEqual(functest_utils.get_nova_version(cloud), None)
+ cloud._compute_client.request.assert_called_once_with('/', 'GET')
+
+ def test_nova_version_exc2(self):
+ # pylint: disable=protected-access
+ cloud = mock.Mock()
+ cloud._compute_client.request.return_value = {"version": None}
+ self.assertEqual(functest_utils.get_nova_version(cloud), None)
+ cloud._compute_client.request.assert_called_once_with('/', 'GET')
+
+ def test_nova_version_exc3(self):
+ # pylint: disable=protected-access
+ cloud = mock.Mock()
+ cloud._compute_client.request.return_value = {
+ "version": {"version": None}}
+ self.assertEqual(functest_utils.get_nova_version(cloud), None)
+ cloud._compute_client.request.assert_called_once_with('/', 'GET')
+
+ def test_nova_version_exc4(self):
+ # pylint: disable=protected-access
+ cloud = mock.Mock()
+ cloud._compute_client.request.return_value = {
+ "version": {"version": "a.b"}}
+ self.assertEqual(functest_utils.get_nova_version(cloud), None)
+ cloud._compute_client.request.assert_called_once_with('/', 'GET')
+
+ def test_nova_version(self):
+ # pylint: disable=protected-access
+ cloud = mock.Mock()
+ cloud._compute_client.request.return_value = {
+ "version": {"version": "2.1"}}
+ self.assertEqual(functest_utils.get_nova_version(cloud), (2, 1))
+ cloud._compute_client.request.assert_called_once_with('/', 'GET')
+
+ @mock.patch('functest.utils.functest_utils.get_nova_version',
+ return_value=(2, 61))
+ def test_openstack_version1(self, *args):
+ cloud = mock.Mock()
+ self.assertEqual(functest_utils.get_openstack_version(
+ cloud), "Rocky")
+ args[0].assert_called_once_with(cloud)
+
+ @mock.patch('functest.utils.functest_utils.get_nova_version',
+ return_value=(2, 60))
+ def test_openstack_version2(self, *args):
+ cloud = mock.Mock()
+ self.assertEqual(functest_utils.get_openstack_version(cloud), "Queens")
+ args[0].assert_called_once_with(cloud)
+
+ @mock.patch('functest.utils.functest_utils.get_nova_version',
+ return_value=(2, 43))
+ def test_openstack_version3(self, *args):
+ cloud = mock.Mock()
+ self.assertEqual(functest_utils.get_openstack_version(cloud), "Pike")
+ args[0].assert_called_once_with(cloud)
+
+ @mock.patch('functest.utils.functest_utils.get_nova_version',
+ return_value=(2, 39))
+ def test_openstack_version4(self, *args):
+ cloud = mock.Mock()
+ self.assertEqual(functest_utils.get_openstack_version(cloud), "Ocata")
+ args[0].assert_called_once_with(cloud)
+
+ @mock.patch('functest.utils.functest_utils.get_nova_version',
+ return_value=(2, 26))
+ def test_openstack_version5(self, *args):
+ cloud = mock.Mock()
+ self.assertEqual(functest_utils.get_openstack_version(cloud), "Newton")
+ args[0].assert_called_once_with(cloud)
+
+ @mock.patch('functest.utils.functest_utils.get_nova_version',
+ return_value=(2, 13))
+ def test_openstack_version6(self, *args):
+ cloud = mock.Mock()
+ self.assertEqual(functest_utils.get_openstack_version(cloud), "Mitaka")
+ args[0].assert_called_once_with(cloud)
+
+ @mock.patch('functest.utils.functest_utils.get_nova_version',
+ return_value=(2, 4))
+ def test_openstack_version7(self, *args):
+ cloud = mock.Mock()
+ self.assertEqual(
+ functest_utils.get_openstack_version(cloud), "Liberty")
+ args[0].assert_called_once_with(cloud)
+
+ @mock.patch('functest.utils.functest_utils.get_nova_version',
+ return_value=(2, 1))
+ def test_openstack_version8(self, *args):
+ cloud = mock.Mock()
+ self.assertEqual(functest_utils.get_openstack_version(cloud), "Kilo")
+ args[0].assert_called_once_with(cloud)
+
+ @mock.patch('functest.utils.functest_utils.get_nova_version',
+ return_value=(1, 9))
+ def test_openstack_version9(self, *args):
+ cloud = mock.Mock()
+ self.assertEqual(
+ functest_utils.get_openstack_version(cloud), "Unknown")
+ args[0].assert_called_once_with(cloud)
+
+ @mock.patch('functest.utils.functest_utils.get_nova_version',
+ return_value=(3, 1))
+ def test_openstack_version10(self, *args):
+ cloud = mock.Mock()
+ self.assertEqual(
+ functest_utils.get_openstack_version(cloud), "Master")
+ args[0].assert_called_once_with(cloud)
+
+ @mock.patch('functest.utils.functest_utils.get_nova_version',
+ return_value=(2, 66))
+ def test_openstack_version11(self, *args):
+ cloud = mock.Mock()
+ self.assertEqual(functest_utils.get_openstack_version(
+ cloud), "Stein")
+ args[0].assert_called_once_with(cloud)
+
+ @mock.patch('functest.utils.functest_utils.get_nova_version',
+ return_value=(2, 78))
+ def test_openstack_version12(self, *args):
+ cloud = mock.Mock()
+ self.assertEqual(functest_utils.get_openstack_version(
+ cloud), "Train")
+ args[0].assert_called_once_with(cloud)
+
+ @mock.patch('functest.utils.functest_utils.get_nova_version',
+ return_value=(2, 87))
+ def test_openstack_version13(self, *args):
+ cloud = mock.Mock()
+ self.assertEqual(functest_utils.get_openstack_version(
+ cloud), "Ussuri")
+ args[0].assert_called_once_with(cloud)
+
+ @mock.patch('functest.utils.functest_utils.get_nova_version',
+ return_value=(2, 88))
+ def test_openstack_version14(self, *args):
+ cloud = mock.Mock()
+ self.assertEqual(functest_utils.get_openstack_version(
+ cloud), "Wallaby")
+ args[0].assert_called_once_with(cloud)
+
+ @mock.patch('functest.utils.functest_utils.get_nova_version',
+ return_value=(2, 89))
+ def test_openstack_version15(self, *args):
+ cloud = mock.Mock()
+ self.assertEqual(functest_utils.get_openstack_version(
+ cloud), "Xena")
+ args[0].assert_called_once_with(cloud)
+
+ @mock.patch('functest.utils.functest_utils.get_nova_version',
+ return_value=(2, 92))
+ def test_openstack_version16(self, *args):
+ cloud = mock.Mock()
+ self.assertEqual(functest_utils.get_openstack_version(
+ cloud), "Zed")
+ args[0].assert_called_once_with(cloud)
+
+ @mock.patch('functest.utils.functest_utils.get_nova_version',
+ return_value=None)
+ def test_openstack_version_exc(self, *args):
+ cloud = mock.Mock()
+ self.assertEqual(
+ functest_utils.get_openstack_version(cloud), "Unknown")
+ args[0].assert_called_once_with(cloud)
+
+ def test_convert_dict_to_ini(self):
+ self.assertEqual(
+ functest_utils.convert_dict_to_ini({}), "")
+ self.assertEqual(
+ functest_utils.convert_dict_to_ini({"a": "b"}), "a:b")
+ value = functest_utils.convert_dict_to_ini({"a": "b", "c": "d"})
+ self.assertTrue(value in ('a:b,c:d', 'c:d,a:b'))
+ with self.assertRaises(AssertionError):
+ functest_utils.convert_list_to_ini("")
+
+ def test_convert_list_to_ini(self):
+ self.assertEqual(
+ functest_utils.convert_list_to_ini([]), "")
+ self.assertEqual(
+ functest_utils.convert_list_to_ini(["a"]), "a")
+ self.assertEqual(
+ functest_utils.convert_list_to_ini(["a", "b"]), "a,b")
+ with self.assertRaises(AssertionError):
+ functest_utils.convert_list_to_ini("")
+
+ def test_convert_ini_to_dict(self):
+ self.assertEqual(
+ functest_utils.convert_ini_to_dict(""), {})
+ self.assertEqual(
+ functest_utils.convert_ini_to_dict("a:b"), {"a": "b"})
+ self.assertEqual(
+ functest_utils.convert_ini_to_dict(
+ "a:b,c:d"), {"a": "b", "c": "d"})
+ self.assertEqual(
+ functest_utils.convert_ini_to_dict(
+ "a:b:c,d:e:f"), {"a:b": "c", "d:e": "f"})
+ with self.assertRaises(AssertionError):
+ functest_utils.convert_list_to_ini({})
+
+ def test_convert_ini_to_list(self):
+ self.assertEqual(
+ functest_utils.convert_ini_to_list(""), [])
+ self.assertEqual(
+ functest_utils.convert_ini_to_list("a"), ["a"])
+ self.assertEqual(
+ functest_utils.convert_ini_to_list("a,b"), ["a", "b"])
+ with self.assertRaises(AssertionError):
+ functest_utils.convert_ini_to_list([])
if __name__ == "__main__":
diff --git a/functest/tests/unit/utils/test_openstack_utils.py b/functest/tests/unit/utils/test_openstack_utils.py
deleted file mode 100644
index 01085bb7d..000000000
--- a/functest/tests/unit/utils/test_openstack_utils.py
+++ /dev/null
@@ -1,1811 +0,0 @@
-#!/usr/bin/env python
-
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-
-import copy
-import logging
-import os
-import unittest
-
-import mock
-
-from functest.utils import openstack_utils
-from functest.utils.constants import CONST
-
-
-class OSUtilsTesting(unittest.TestCase):
-
- def _get_env_cred_dict(self, os_prefix=''):
- return {'OS_USERNAME': os_prefix + 'username',
- 'OS_PASSWORD': os_prefix + 'password',
- 'OS_AUTH_URL': os_prefix + 'auth_url',
- 'OS_TENANT_NAME': os_prefix + 'tenant_name',
- 'OS_USER_DOMAIN_NAME': os_prefix + 'user_domain_name',
- 'OS_PROJECT_DOMAIN_NAME': os_prefix + 'project_domain_name',
- 'OS_PROJECT_NAME': os_prefix + 'project_name',
- 'OS_ENDPOINT_TYPE': os_prefix + 'endpoint_type',
- 'OS_REGION_NAME': os_prefix + 'region_name',
- 'OS_CACERT': os_prefix + 'https_cacert',
- 'OS_INSECURE': os_prefix + 'https_insecure'}
-
- def _get_os_env_vars(self):
- return {'username': 'test_username', 'password': 'test_password',
- 'auth_url': 'test_auth_url', 'tenant_name': 'test_tenant_name',
- 'user_domain_name': 'test_user_domain_name',
- 'project_domain_name': 'test_project_domain_name',
- 'project_name': 'test_project_name',
- 'endpoint_type': 'test_endpoint_type',
- 'region_name': 'test_region_name',
- 'https_cacert': 'test_https_cacert',
- 'https_insecure': 'test_https_insecure'}
-
- def setUp(self):
- self.env_vars = ['OS_AUTH_URL', 'OS_USERNAME', 'OS_PASSWORD']
- self.tenant_name = 'test_tenant_name'
- self.env_cred_dict = self._get_env_cred_dict()
- self.os_environs = self._get_env_cred_dict(os_prefix='test_')
- self.os_env_vars = self._get_os_env_vars()
-
- mock_obj = mock.Mock()
- attrs = {'name': 'test_flavor',
- 'id': 'flavor_id',
- 'ram': 2}
- mock_obj.configure_mock(**attrs)
- self.flavor = mock_obj
-
- mock_obj = mock.Mock()
- attrs = {'name': 'test_aggregate',
- 'id': 'aggregate_id',
- 'hosts': ['host_name']}
- mock_obj.configure_mock(**attrs)
- self.aggregate = mock_obj
-
- mock_obj = mock.Mock()
- attrs = {'id': 'instance_id',
- 'name': 'test_instance',
- 'status': 'ok'}
- mock_obj.configure_mock(**attrs)
- self.instance = mock_obj
-
- mock_obj = mock.Mock()
- attrs = {'id': 'azone_id',
- 'zoneName': 'test_azone',
- 'status': 'ok'}
- mock_obj.configure_mock(**attrs)
- self.availability_zone = mock_obj
-
- mock_obj = mock.Mock()
- attrs = {'floating_network_id': 'floating_id',
- 'floating_ip_address': 'test_floating_ip'}
- mock_obj.configure_mock(**attrs)
- self.floating_ip = mock_obj
-
- mock_obj = mock.Mock()
- attrs = {'id': 'hypervisor_id',
- 'hypervisor_hostname': 'test_hostname',
- 'state': 'up'}
- mock_obj.configure_mock(**attrs)
- self.hypervisor = mock_obj
-
- mock_obj = mock.Mock()
- attrs = {'id': 'image_id',
- 'name': 'test_image'}
- mock_obj.configure_mock(**attrs)
- self.image = mock_obj
-
- mock_obj = mock.Mock()
- self.mock_return = mock_obj
-
- self.nova_client = mock.Mock()
- attrs = {'servers.list.return_value': [self.instance],
- 'servers.get.return_value': self.instance,
- 'servers.find.return_value': self.instance,
- 'servers.create.return_value': self.instance,
- 'flavors.list.return_value': [self.flavor],
- 'flavors.find.return_value': self.flavor,
- 'servers.add_floating_ip.return_value': mock.Mock(),
- 'servers.force_delete.return_value': mock.Mock(),
- 'aggregates.list.return_value': [self.aggregate],
- 'aggregates.add_host.return_value': mock.Mock(),
- 'aggregates.remove_host.return_value': mock.Mock(),
- 'aggregates.get.return_value': self.aggregate,
- 'aggregates.delete.return_value': mock.Mock(),
- 'availability_zones.list.return_value':
- [self.availability_zone],
- 'hypervisors.list.return_value': [self.hypervisor],
- 'create.return_value': mock.Mock(),
- 'add_security_group.return_value': mock.Mock(),
- 'images.list.return_value': [self.image],
- 'images.delete.return_value': mock.Mock(),
- }
- self.nova_client.configure_mock(**attrs)
-
- self.glance_client = mock.Mock()
- attrs = {'images.list.return_value': [self.image],
- 'images.create.return_value': self.image,
- 'images.upload.return_value': mock.Mock()}
- self.glance_client.configure_mock(**attrs)
-
- mock_obj = mock.Mock()
- attrs = {'id': 'volume_id',
- 'name': 'test_volume'}
- mock_obj.configure_mock(**attrs)
- self.volume = mock_obj
-
- self.cinder_client = mock.Mock()
- attrs = {'volumes.list.return_value': [self.volume],
- 'quotas.update.return_value': mock.Mock(),
- 'volumes.detach.return_value': mock.Mock(),
- 'volumes.force_delete.return_value': mock.Mock(),
- 'volumes.delete.return_value': mock.Mock()
- }
- self.cinder_client.configure_mock(**attrs)
-
- self.resource = mock.Mock()
- attrs = {'id': 'resource_test_id',
- 'name': 'resource_test_name'
- }
-
- self.heat_client = mock.Mock()
- attrs = {'resources.get.return_value': self.resource}
- self.heat_client.configure_mock(**attrs)
-
- mock_obj = mock.Mock()
- attrs = {'id': 'tenant_id',
- 'name': 'test_tenant'}
- mock_obj.configure_mock(**attrs)
- self.tenant = mock_obj
-
- mock_obj = mock.Mock()
- attrs = {'id': 'user_id',
- 'name': 'test_user'}
- mock_obj.configure_mock(**attrs)
- self.user = mock_obj
-
- mock_obj = mock.Mock()
- attrs = {'id': 'role_id',
- 'name': 'test_role'}
- mock_obj.configure_mock(**attrs)
- self.role = mock_obj
-
- mock_obj = mock.Mock()
- attrs = {'id': 'domain_id',
- 'name': 'test_domain'}
- mock_obj.configure_mock(**attrs)
- self.domain = mock_obj
-
- self.keystone_client = mock.Mock()
- attrs = {'projects.list.return_value': [self.tenant],
- 'tenants.list.return_value': [self.tenant],
- 'users.list.return_value': [self.user],
- 'roles.list.return_value': [self.role],
- 'domains.list.return_value': [self.domain],
- 'projects.create.return_value': self.tenant,
- 'tenants.create.return_value': self.tenant,
- 'users.create.return_value': self.user,
- 'roles.grant.return_value': mock.Mock(),
- 'roles.add_user_role.return_value': mock.Mock(),
- 'projects.delete.return_value': mock.Mock(),
- 'tenants.delete.return_value': mock.Mock(),
- 'users.delete.return_value': mock.Mock(),
- }
- self.keystone_client.configure_mock(**attrs)
-
- self.router = {'id': 'router_id',
- 'name': 'test_router'}
-
- self.subnet = {'id': 'subnet_id',
- 'name': 'test_subnet'}
-
- self.networks = [{'id': 'network_id',
- 'name': 'test_network',
- 'router:external': False,
- 'shared': True,
- 'subnets': [self.subnet]},
- {'id': 'network_id1',
- 'name': 'test_network1',
- 'router:external': True,
- 'shared': True,
- 'subnets': [self.subnet]}]
-
- self.port = {'id': 'port_id',
- 'name': 'test_port'}
-
- self.sec_group = {'id': 'sec_group_id',
- 'name': 'test_sec_group'}
-
- self.sec_group_rule = {'id': 'sec_group_rule_id',
- 'direction': 'direction',
- 'protocol': 'protocol',
- 'port_range_max': 'port_max',
- 'security_group_id': self.sec_group['id'],
- 'port_range_min': 'port_min'}
- self.neutron_floatingip = {'id': 'fip_id',
- 'floating_ip_address': 'test_ip'}
- self.neutron_client = mock.Mock()
- attrs = {'list_networks.return_value': {'networks': self.networks},
- 'list_routers.return_value': {'routers': [self.router]},
- 'list_ports.return_value': {'ports': [self.port]},
- 'list_subnets.return_value': {'subnets': [self.subnet]},
- 'create_network.return_value': {'network': self.networks[0]},
- 'create_subnet.return_value': {'subnets': [self.subnet]},
- 'create_router.return_value': {'router': self.router},
- 'create_port.return_value': {'port': self.port},
- 'create_floatingip.return_value': {'floatingip':
- self.neutron_floatingip},
- 'update_network.return_value': mock.Mock(),
- 'update_port.return_value': {'port': self.port},
- 'add_interface_router.return_value': mock.Mock(),
- 'add_gateway_router.return_value': mock.Mock(),
- 'delete_network.return_value': mock.Mock(),
- 'delete_subnet.return_value': mock.Mock(),
- 'delete_router.return_value': mock.Mock(),
- 'delete_port.return_value': mock.Mock(),
- 'remove_interface_router.return_value': mock.Mock(),
- 'remove_gateway_router.return_value': mock.Mock(),
- 'list_security_groups.return_value': {'security_groups':
- [self.sec_group]},
- 'list_security_group_rules.'
- 'return_value': {'security_group_rules':
- [self.sec_group_rule]},
- 'create_security_group_rule.return_value': mock.Mock(),
- 'create_security_group.return_value': {'security_group':
- self.sec_group},
- 'update_quota.return_value': mock.Mock(),
- 'delete_security_group.return_value': mock.Mock(),
- 'list_floatingips.return_value': {'floatingips':
- [self.floating_ip]},
- 'delete_floatingip.return_value': mock.Mock(),
- }
- self.neutron_client.configure_mock(**attrs)
-
- self.empty_client = mock.Mock()
- attrs = {'list_networks.return_value': {'networks': []},
- 'list_routers.return_value': {'routers': []},
- 'list_ports.return_value': {'ports': []},
- 'list_subnets.return_value': {'subnets': []}}
- self.empty_client.configure_mock(**attrs)
-
- @mock.patch('functest.utils.openstack_utils.os.getenv',
- return_value=None)
- def test_is_keystone_v3_missing_identity(self, mock_os_getenv):
- self.assertEqual(openstack_utils.is_keystone_v3(), False)
-
- @mock.patch('functest.utils.openstack_utils.os.getenv',
- return_value='3')
- def test_is_keystone_v3_default(self, mock_os_getenv):
- self.assertEqual(openstack_utils.is_keystone_v3(), True)
-
- @mock.patch('functest.utils.openstack_utils.is_keystone_v3',
- return_value=False)
- def test_get_rc_env_vars_missing_identity(self, mock_get_rc_env):
- exp_resp = self.env_vars
- exp_resp.extend(['OS_TENANT_NAME'])
- self.assertEqual(openstack_utils.get_rc_env_vars(), exp_resp)
-
- @mock.patch('functest.utils.openstack_utils.is_keystone_v3',
- return_value=True)
- def test_get_rc_env_vars_default(self, mock_get_rc_env):
- exp_resp = self.env_vars
- exp_resp.extend(['OS_PROJECT_NAME',
- 'OS_USER_DOMAIN_NAME',
- 'OS_PROJECT_DOMAIN_NAME'])
- self.assertEqual(openstack_utils.get_rc_env_vars(), exp_resp)
-
- @mock.patch('functest.utils.openstack_utils.get_rc_env_vars')
- def test_check_credentials_missing_env(self, mock_get_rc_env):
- exp_resp = self.env_vars
- exp_resp.extend(['OS_TENANT_NAME'])
- mock_get_rc_env.return_value = exp_resp
- with mock.patch.dict('functest.utils.openstack_utils.os.environ', {},
- clear=True):
- self.assertEqual(openstack_utils.check_credentials(), False)
-
- @mock.patch('functest.utils.openstack_utils.get_rc_env_vars')
- def test_check_credentials_default(self, mock_get_rc_env):
- exp_resp = ['OS_TENANT_NAME']
- mock_get_rc_env.return_value = exp_resp
- with mock.patch.dict('functest.utils.openstack_utils.os.environ',
- {'OS_TENANT_NAME': self.tenant_name},
- clear=True):
- self.assertEqual(openstack_utils.check_credentials(), True)
-
- def test_get_env_cred_dict(self):
- self.assertDictEqual(openstack_utils.get_env_cred_dict(),
- self.env_cred_dict)
-
- @mock.patch('functest.utils.openstack_utils.get_rc_env_vars')
- def test_get_credentials_default(self, mock_get_rc_env):
- mock_get_rc_env.return_value = self.env_cred_dict.keys()
- with mock.patch.dict('functest.utils.openstack_utils.os.environ',
- self.os_environs,
- clear=True):
- self.assertDictEqual(openstack_utils.get_credentials(),
- self.os_env_vars)
-
- def _get_credentials_missing_env(self, var):
- dic = copy.deepcopy(self.os_environs)
- dic.pop(var)
- with mock.patch('functest.utils.openstack_utils.get_rc_env_vars',
- return_value=self.env_cred_dict.keys()), \
- mock.patch.dict('functest.utils.openstack_utils.os.environ',
- dic,
- clear=True):
- self.assertRaises(openstack_utils.MissingEnvVar,
- lambda: openstack_utils.get_credentials())
-
- def test_get_credentials_missing_username(self):
- self._get_credentials_missing_env('OS_USERNAME')
-
- def test_get_credentials_missing_password(self):
- self._get_credentials_missing_env('OS_PASSWORD')
-
- def test_get_credentials_missing_auth_url(self):
- self._get_credentials_missing_env('OS_AUTH_URL')
-
- def test_get_credentials_missing_tenantname(self):
- self._get_credentials_missing_env('OS_TENANT_NAME')
-
- def test_get_credentials_missing_domainname(self):
- self._get_credentials_missing_env('OS_USER_DOMAIN_NAME')
-
- def test_get_credentials_missing_projectname(self):
- self._get_credentials_missing_env('OS_PROJECT_NAME')
-
- def test_get_credentials_missing_endpoint_type(self):
- self._get_credentials_missing_env('OS_ENDPOINT_TYPE')
-
- def _test_source_credentials(self, msg, key='OS_TENANT_NAME',
- value='admin'):
- try:
- del os.environ[key]
- except:
- pass
- f = 'rc_file'
- with mock.patch('six.moves.builtins.open',
- mock.mock_open(read_data=msg),
- create=True) as m:
- m.return_value.__iter__ = lambda self: iter(self.readline, '')
- openstack_utils.source_credentials(f)
- m.assert_called_once_with(f, 'r')
- self.assertEqual(os.environ[key], value)
-
- def test_source_credentials(self):
- self._test_source_credentials('OS_TENANT_NAME=admin')
- self._test_source_credentials('OS_TENANT_NAME= admin')
- self._test_source_credentials('OS_TENANT_NAME = admin')
- self._test_source_credentials('OS_TENANT_NAME = "admin"')
- self._test_source_credentials('export OS_TENANT_NAME=admin')
- self._test_source_credentials('export OS_TENANT_NAME =admin')
- self._test_source_credentials('export OS_TENANT_NAME = admin')
- self._test_source_credentials('export OS_TENANT_NAME = "admin"')
- # This test will fail as soon as rc_file is fixed
- self._test_source_credentials(
- 'export "\'OS_TENANT_NAME\'" = "\'admin\'"')
-
- @mock.patch('functest.utils.openstack_utils.os.getenv',
- return_value=None)
- def test_get_keystone_client_version_missing_env(self, mock_os_getenv):
- self.assertEqual(openstack_utils.get_keystone_client_version(),
- openstack_utils.DEFAULT_API_VERSION)
-
- @mock.patch('functest.utils.openstack_utils.logger.info')
- @mock.patch('functest.utils.openstack_utils.os.getenv',
- return_value='3')
- def test_get_keystone_client_version_default(self, mock_os_getenv,
- mock_logger_info):
- self.assertEqual(openstack_utils.get_keystone_client_version(),
- '3')
- mock_logger_info.assert_called_once_with("OS_IDENTITY_API_VERSION is "
- "set in env as '%s'", '3')
-
- @mock.patch('functest.utils.openstack_utils.get_session')
- @mock.patch('functest.utils.openstack_utils.keystoneclient.Client')
- @mock.patch('functest.utils.openstack_utils.get_keystone_client_version',
- return_value='3')
- @mock.patch('functest.utils.openstack_utils.os.getenv',
- return_value='public')
- def test_get_keystone_client_with_interface(self, mock_os_getenv,
- mock_keystoneclient_version,
- mock_key_client,
- mock_get_session):
- mock_keystone_obj = mock.Mock()
- mock_session_obj = mock.Mock()
- mock_key_client.return_value = mock_keystone_obj
- mock_get_session.return_value = mock_session_obj
- self.assertEqual(openstack_utils.get_keystone_client(),
- mock_keystone_obj)
- mock_key_client.assert_called_once_with('3',
- session=mock_session_obj,
- interface='public')
-
- @mock.patch('functest.utils.openstack_utils.get_session')
- @mock.patch('functest.utils.openstack_utils.keystoneclient.Client')
- @mock.patch('functest.utils.openstack_utils.get_keystone_client_version',
- return_value='3')
- @mock.patch('functest.utils.openstack_utils.os.getenv',
- return_value='admin')
- def test_get_keystone_client_no_interface(self, mock_os_getenv,
- mock_keystoneclient_version,
- mock_key_client,
- mock_get_session):
- mock_keystone_obj = mock.Mock()
- mock_session_obj = mock.Mock()
- mock_key_client.return_value = mock_keystone_obj
- mock_get_session.return_value = mock_session_obj
- self.assertEqual(openstack_utils.get_keystone_client(),
- mock_keystone_obj)
- mock_key_client.assert_called_once_with('3',
- session=mock_session_obj,
- interface='admin')
-
- @mock.patch('functest.utils.openstack_utils.os.getenv',
- return_value=None)
- def test_get_nova_client_version_missing_env(self, mock_os_getenv):
- self.assertEqual(openstack_utils.get_nova_client_version(),
- openstack_utils.DEFAULT_API_VERSION)
-
- @mock.patch('functest.utils.openstack_utils.logger.info')
- @mock.patch('functest.utils.openstack_utils.os.getenv',
- return_value='3')
- def test_get_nova_client_version_default(self, mock_os_getenv,
- mock_logger_info):
- self.assertEqual(openstack_utils.get_nova_client_version(),
- '3')
- mock_logger_info.assert_called_once_with("OS_COMPUTE_API_VERSION is "
- "set in env as '%s'", '3')
-
- def test_get_nova_client(self):
- mock_nova_obj = mock.Mock()
- mock_session_obj = mock.Mock()
- with mock.patch('functest.utils.openstack_utils'
- '.get_nova_client_version', return_value='3'), \
- mock.patch('functest.utils.openstack_utils'
- '.novaclient.Client',
- return_value=mock_nova_obj) \
- as mock_nova_client, \
- mock.patch('functest.utils.openstack_utils.get_session',
- return_value=mock_session_obj):
- self.assertEqual(openstack_utils.get_nova_client(),
- mock_nova_obj)
- mock_nova_client.assert_called_once_with('3',
- session=mock_session_obj)
-
- @mock.patch('functest.utils.openstack_utils.os.getenv',
- return_value=None)
- def test_get_cinder_client_version_missing_env(self, mock_os_getenv):
- self.assertEqual(openstack_utils.get_cinder_client_version(),
- openstack_utils.DEFAULT_API_VERSION)
-
- @mock.patch('functest.utils.openstack_utils.logger.info')
- @mock.patch('functest.utils.openstack_utils.os.getenv',
- return_value='3')
- def test_get_cinder_client_version_default(self, mock_os_getenv,
- mock_logger_info):
- self.assertEqual(openstack_utils.get_cinder_client_version(),
- '3')
- mock_logger_info.assert_called_once_with("OS_VOLUME_API_VERSION is "
- "set in env as '%s'", '3')
-
- def test_get_cinder_client(self):
- mock_cinder_obj = mock.Mock()
- mock_session_obj = mock.Mock()
- with mock.patch('functest.utils.openstack_utils'
- '.get_cinder_client_version', return_value='3'), \
- mock.patch('functest.utils.openstack_utils'
- '.cinderclient.Client',
- return_value=mock_cinder_obj) \
- as mock_cind_client, \
- mock.patch('functest.utils.openstack_utils.get_session',
- return_value=mock_session_obj):
- self.assertEqual(openstack_utils.get_cinder_client(),
- mock_cinder_obj)
- mock_cind_client.assert_called_once_with('3',
- session=mock_session_obj)
-
- @mock.patch('functest.utils.openstack_utils.os.getenv',
- return_value=None)
- def test_get_neutron_client_version_missing_env(self, mock_os_getenv):
- self.assertEqual(openstack_utils.get_neutron_client_version(),
- openstack_utils.DEFAULT_API_VERSION)
-
- @mock.patch('functest.utils.openstack_utils.logger.info')
- @mock.patch('functest.utils.openstack_utils.os.getenv',
- return_value='3')
- def test_get_neutron_client_version_default(self, mock_os_getenv,
- mock_logger_info):
- self.assertEqual(openstack_utils.get_neutron_client_version(),
- '3')
- mock_logger_info.assert_called_once_with("OS_NETWORK_API_VERSION is "
- "set in env as '%s'", '3')
-
- def test_get_neutron_client(self):
- mock_neutron_obj = mock.Mock()
- mock_session_obj = mock.Mock()
- with mock.patch('functest.utils.openstack_utils'
- '.get_neutron_client_version', return_value='3'), \
- mock.patch('functest.utils.openstack_utils'
- '.neutronclient.Client',
- return_value=mock_neutron_obj) \
- as mock_neut_client, \
- mock.patch('functest.utils.openstack_utils.get_session',
- return_value=mock_session_obj):
- self.assertEqual(openstack_utils.get_neutron_client(),
- mock_neutron_obj)
- mock_neut_client.assert_called_once_with('3',
- session=mock_session_obj)
-
- @mock.patch('functest.utils.openstack_utils.os.getenv',
- return_value=None)
- def test_get_glance_client_version_missing_env(self, mock_os_getenv):
- self.assertEqual(openstack_utils.get_glance_client_version(),
- openstack_utils.DEFAULT_API_VERSION)
-
- @mock.patch('functest.utils.openstack_utils.logger.info')
- @mock.patch('functest.utils.openstack_utils.os.getenv',
- return_value='3')
- def test_get_glance_client_version_default(self, mock_os_getenv,
- mock_logger_info):
- self.assertEqual(openstack_utils.get_glance_client_version(),
- '3')
- mock_logger_info.assert_called_once_with("OS_IMAGE_API_VERSION is "
- "set in env as '%s'", '3')
-
- def test_get_glance_client(self):
- mock_glance_obj = mock.Mock()
- mock_session_obj = mock.Mock()
- with mock.patch('functest.utils.openstack_utils'
- '.get_glance_client_version', return_value='3'), \
- mock.patch('functest.utils.openstack_utils'
- '.glanceclient.Client',
- return_value=mock_glance_obj) \
- as mock_glan_client, \
- mock.patch('functest.utils.openstack_utils.get_session',
- return_value=mock_session_obj):
- self.assertEqual(openstack_utils.get_glance_client(),
- mock_glance_obj)
- mock_glan_client.assert_called_once_with('3',
- session=mock_session_obj)
-
- @mock.patch('functest.utils.openstack_utils.os.getenv',
- return_value=None)
- def test_get_heat_client_version_missing_env(self, mock_os_getenv):
- self.assertEqual(openstack_utils.get_heat_client_version(),
- openstack_utils.DEFAULT_HEAT_API_VERSION)
-
- @mock.patch('functest.utils.openstack_utils.logger.info')
- @mock.patch('functest.utils.openstack_utils.os.getenv', return_value='1')
- def test_get_heat_client_version_default(self, mock_os_getenv,
- mock_logger_info):
- self.assertEqual(openstack_utils.get_heat_client_version(), '1')
- mock_logger_info.assert_called_once_with(
- "OS_ORCHESTRATION_API_VERSION is set in env as '%s'", '1')
-
- def test_get_heat_client(self):
- mock_heat_obj = mock.Mock()
- mock_session_obj = mock.Mock()
- with mock.patch('functest.utils.openstack_utils'
- '.get_heat_client_version', return_value='1'), \
- mock.patch('functest.utils.openstack_utils'
- '.heatclient.Client',
- return_value=mock_heat_obj) \
- as mock_heat_client, \
- mock.patch('functest.utils.openstack_utils.get_session',
- return_value=mock_session_obj):
- self.assertEqual(openstack_utils.get_heat_client(),
- mock_heat_obj)
- mock_heat_client.assert_called_once_with('1',
- session=mock_session_obj)
-
- def test_get_instances_default(self):
- self.assertEqual(openstack_utils.get_instances(self.nova_client),
- [self.instance])
-
- @mock.patch('functest.utils.openstack_utils.logger.error')
- def test_get_instances_exception(self, mock_logger_error):
- self.assertEqual(openstack_utils.
- get_instances(Exception),
- None)
- self.assertTrue(mock_logger_error.called)
-
- def test_get_instance_status_default(self):
- self.assertEqual(openstack_utils.get_instance_status(self.nova_client,
- self.instance),
- 'ok')
-
- @mock.patch('functest.utils.openstack_utils.logger.error')
- def test_get_instance_status_exception(self, mock_logger_error):
- self.assertEqual(openstack_utils.
- get_instance_status(Exception,
- self.instance),
- None)
- self.assertTrue(mock_logger_error.called)
-
- def test_get_instance_by_name_default(self):
- self.assertEqual(openstack_utils.
- get_instance_by_name(self.nova_client,
- 'test_instance'),
- self.instance)
-
- @mock.patch('functest.utils.openstack_utils.logger.error')
- def test_get_instance_by_name_exception(self, mock_logger_error):
- self.assertEqual(openstack_utils.
- get_instance_by_name(Exception,
- 'test_instance'),
- None)
- self.assertTrue(mock_logger_error.called)
-
- def test_get_flavor_id_default(self):
- self.assertEqual(openstack_utils.
- get_flavor_id(self.nova_client,
- 'test_flavor'),
- self.flavor.id)
-
- def test_get_flavor_id_by_ram_range_default(self):
- self.assertEqual(openstack_utils.
- get_flavor_id_by_ram_range(self.nova_client,
- 1, 3),
- self.flavor.id)
-
- def test_get_aggregates_default(self):
- self.assertEqual(openstack_utils.
- get_aggregates(self.nova_client),
- [self.aggregate])
-
- @mock.patch('functest.utils.openstack_utils.logger.error')
- def test_get_aggregates_exception(self, mock_logger_error):
- self.assertEqual(openstack_utils.
- get_aggregates(Exception),
- None)
- self.assertTrue(mock_logger_error.called)
-
- def test_get_aggregate_id_default(self):
- with mock.patch('functest.utils.openstack_utils.get_aggregates',
- return_value=[self.aggregate]):
- self.assertEqual(openstack_utils.
- get_aggregate_id(self.nova_client,
- 'test_aggregate'),
- 'aggregate_id')
-
- @mock.patch('functest.utils.openstack_utils.logger.error')
- def test_get_aggregate_id_exception(self, mock_logger_error):
- self.assertEqual(openstack_utils.
- get_aggregate_id(Exception,
- 'test_aggregate'),
- None)
- self.assertTrue(mock_logger_error.called)
-
- def test_get_availability_zone_names_default(self):
- with mock.patch('functest.utils.openstack_utils'
- '.get_availability_zones',
- return_value=[self.availability_zone]):
- self.assertEqual(openstack_utils.
- get_availability_zone_names(self.nova_client),
- ['test_azone'])
-
- @mock.patch('functest.utils.openstack_utils.logger.error')
- def test_get_availability_zone_names_exception(self, mock_logger_error):
- self.assertEqual(openstack_utils.
- get_availability_zone_names(Exception),
- None)
- self.assertTrue(mock_logger_error.called)
-
- def test_get_availability_zones_default(self):
- self.assertEqual(openstack_utils.
- get_availability_zones(self.nova_client),
- [self.availability_zone])
-
- @mock.patch('functest.utils.openstack_utils.logger.error')
- def test_get_availability_zones_exception(self, mock_logger_error):
- self.assertEqual(openstack_utils.
- get_availability_zones(Exception),
- None)
- self.assertTrue(mock_logger_error.called)
-
- def test_get_floating_ips_default(self):
- self.assertEqual(openstack_utils.
- get_floating_ips(self.neutron_client),
- [self.floating_ip])
-
- @mock.patch('functest.utils.openstack_utils.logger.error')
- def test_get_floating_ips_exception(self, mock_logger_error):
- self.assertEqual(openstack_utils.
- get_floating_ips(Exception),
- None)
- self.assertTrue(mock_logger_error.called)
-
- def test_get_hypervisors_default(self):
- self.assertEqual(openstack_utils.
- get_hypervisors(self.nova_client),
- ['test_hostname'])
-
- @mock.patch('functest.utils.openstack_utils.logger.error')
- def test_get_hypervisors_exception(self, mock_logger_error):
- self.assertEqual(openstack_utils.
- get_hypervisors(Exception),
- None)
- self.assertTrue(mock_logger_error.called)
-
- def test_create_aggregate_default(self):
- self.assertTrue(openstack_utils.
- create_aggregate(self.nova_client,
- 'test_aggregate',
- 'azone'))
-
- @mock.patch('functest.utils.openstack_utils.logger.error')
- def test_create_aggregate_exception(self, mock_logger_error):
- self.assertEqual(openstack_utils.
- create_aggregate(Exception,
- 'test_aggregate',
- 'azone'),
- None)
- self.assertTrue(mock_logger_error.called)
-
- def test_add_host_to_aggregate_default(self):
- with mock.patch('functest.utils.openstack_utils.get_aggregate_id'):
- self.assertTrue(openstack_utils.
- add_host_to_aggregate(self.nova_client,
- 'test_aggregate',
- 'test_hostname'))
-
- @mock.patch('functest.utils.openstack_utils.logger.error')
- def test_add_host_to_aggregate_exception(self, mock_logger_error):
- self.assertEqual(openstack_utils.
- add_host_to_aggregate(Exception,
- 'test_aggregate',
- 'test_hostname'),
- None)
- self.assertTrue(mock_logger_error.called)
-
- def test_create_aggregate_with_host_default(self):
- with mock.patch('functest.utils.openstack_utils.create_aggregate'), \
- mock.patch('functest.utils.openstack_utils.'
- 'add_host_to_aggregate'):
- self.assertTrue(openstack_utils.
- create_aggregate_with_host(self.nova_client,
- 'test_aggregate',
- 'test_azone',
- 'test_hostname'))
-
- @mock.patch('functest.utils.openstack_utils.logger.error')
- def test_create_aggregate_with_host_exception(self, mock_logger_error):
- with mock.patch('functest.utils.openstack_utils.create_aggregate',
- side_effect=Exception):
- self.assertEqual(openstack_utils.
- create_aggregate_with_host(Exception,
- 'test_aggregate',
- 'test_azone',
- 'test_hostname'),
- None)
- self.assertTrue(mock_logger_error.called)
-
- def test_create_instance_default(self):
- with mock.patch('functest.utils.openstack_utils.'
- 'get_nova_client',
- return_value=self.nova_client):
- self.assertEqual(openstack_utils.
- create_instance('test_flavor',
- 'image_id',
- 'network_id'),
- self.instance)
-
- @mock.patch('functest.utils.openstack_utils.logger.error')
- def test_create_instance_exception(self, mock_logger_error):
- with mock.patch('functest.utils.openstack_utils.'
- 'get_nova_client',
- return_value=self.nova_client):
- self.nova_client.flavors.find.side_effect = Exception
- self.assertEqual(openstack_utils.
- create_instance('test_flavor',
- 'image_id',
- 'network_id'),
- None)
- self.assertTrue(mock_logger_error)
-
- def test_create_floating_ip_default(self):
- with mock.patch('functest.utils.openstack_utils.'
- 'get_external_net_id',
- return_value='external_net_id'):
- exp_resp = {'fip_addr': 'test_ip', 'fip_id': 'fip_id'}
- self.assertEqual(openstack_utils.
- create_floating_ip(self.neutron_client),
- exp_resp)
-
- @mock.patch('functest.utils.openstack_utils.logger.error')
- def test_create_floating_ip_exception(self, mock_logger_error):
- with mock.patch('functest.utils.openstack_utils.'
- 'get_external_net_id',
- return_value='external_net_id'):
- self.assertEqual(openstack_utils.
- create_floating_ip(Exception),
- None)
- self.assertTrue(mock_logger_error)
-
- def test_add_floating_ip_default(self):
- with mock.patch('functest.utils.openstack_utils.get_aggregate_id'):
- self.assertTrue(openstack_utils.
- add_floating_ip(self.nova_client,
- 'test_serverid',
- 'test_floatingip_addr'))
-
- @mock.patch('functest.utils.openstack_utils.logger.error')
- def test_add_floating_ip_exception(self, mock_logger_error):
- self.assertFalse(openstack_utils.
- add_floating_ip(Exception,
- 'test_serverid',
- 'test_floatingip_addr'))
- self.assertTrue(mock_logger_error.called)
-
- def test_delete_instance_default(self):
- self.assertTrue(openstack_utils.
- delete_instance(self.nova_client,
- 'instance_id'))
-
- @mock.patch('functest.utils.openstack_utils.logger.error')
- def test_delete_instance_exception(self, mock_logger_error):
- self.assertFalse(openstack_utils.
- delete_instance(Exception,
- 'instance_id'))
- self.assertTrue(mock_logger_error.called)
-
- def test_delete_floating_ip_default(self):
- self.assertTrue(openstack_utils.
- delete_floating_ip(self.neutron_client,
- 'floating_ip_id'))
-
- @mock.patch('functest.utils.openstack_utils.logger.error')
- def test_delete_floating_ip_exception(self, mock_logger_error):
- self.assertFalse(openstack_utils.
- delete_floating_ip(Exception,
- 'floating_ip_id'))
- self.assertTrue(mock_logger_error.called)
-
- def test_remove_host_from_aggregate_default(self):
- with mock.patch('functest.utils.openstack_utils.'
- 'get_aggregate_id'):
- self.assertTrue(openstack_utils.
- remove_host_from_aggregate(self.nova_client,
- 'agg_name',
- 'host_name'))
-
- @mock.patch('functest.utils.openstack_utils.logger.error')
- def test_remove_host_from_aggregate_exception(self, mock_logger_error):
- with mock.patch('functest.utils.openstack_utils.'
- 'get_aggregate_id', side_effect=Exception):
- self.assertFalse(openstack_utils.
- remove_host_from_aggregate(self.nova_client,
- 'agg_name',
- 'host_name'))
- self.assertTrue(mock_logger_error.called)
-
- def test_remove_hosts_from_aggregate_default(self):
- with mock.patch('functest.utils.openstack_utils.'
- 'get_aggregate_id'), \
- mock.patch('functest.utils.openstack_utils.'
- 'remove_host_from_aggregate',
- return_value=True) \
- as mock_method:
- openstack_utils.remove_hosts_from_aggregate(self.nova_client,
- 'test_aggregate')
- mock_method.assert_any_call(self.nova_client,
- 'test_aggregate',
- 'host_name')
-
- def test_delete_aggregate_default(self):
- with mock.patch('functest.utils.openstack_utils.'
- 'remove_hosts_from_aggregate'):
- self.assertTrue(openstack_utils.
- delete_aggregate(self.nova_client,
- 'agg_name'))
-
- @mock.patch('functest.utils.openstack_utils.logger.error')
- def test_delete_aggregate_exception(self, mock_logger_error):
- with mock.patch('functest.utils.openstack_utils.'
- 'remove_hosts_from_aggregate', side_effect=Exception):
- self.assertFalse(openstack_utils.
- delete_aggregate(self.nova_client,
- 'agg_name'))
- self.assertTrue(mock_logger_error.called)
-
- def test_get_network_list_default(self):
- self.assertEqual(openstack_utils.
- get_network_list(self.neutron_client),
- self.networks)
-
- def test_get_network_list_missing_network(self):
- self.assertEqual(openstack_utils.
- get_network_list(self.empty_client),
- None)
-
- def test_get_router_list_default(self):
- self.assertEqual(openstack_utils.
- get_router_list(self.neutron_client),
- [self.router])
-
- def test_get_router_list_missing_router(self):
- self.assertEqual(openstack_utils.
- get_router_list(self.empty_client),
- None)
-
- def test_get_port_list_default(self):
- self.assertEqual(openstack_utils.
- get_port_list(self.neutron_client),
- [self.port])
-
- def test_get_port_list_missing_port(self):
- self.assertEqual(openstack_utils.
- get_port_list(self.empty_client),
- None)
-
- def test_get_network_id_default(self):
- self.assertEqual(openstack_utils.
- get_network_id(self.neutron_client,
- 'test_network'),
- 'network_id')
-
- def test_get_subnet_id_default(self):
- self.assertEqual(openstack_utils.
- get_subnet_id(self.neutron_client,
- 'test_subnet'),
- 'subnet_id')
-
- def test_get_router_id_default(self):
- self.assertEqual(openstack_utils.
- get_router_id(self.neutron_client,
- 'test_router'),
- 'router_id')
-
- def test_get_private_net_default(self):
- self.assertEqual(openstack_utils.
- get_private_net(self.neutron_client),
- self.networks[0])
-
- def test_get_private_net_missing_net(self):
- self.assertEqual(openstack_utils.
- get_private_net(self.empty_client),
- None)
-
- def test_get_external_net_default(self):
- self.assertEqual(openstack_utils.
- get_external_net(self.neutron_client),
- 'test_network1')
-
- def test_get_external_net_missing_net(self):
- self.assertEqual(openstack_utils.
- get_external_net(self.empty_client),
- None)
-
- def test_get_external_net_id_default(self):
- self.assertEqual(openstack_utils.
- get_external_net_id(self.neutron_client),
- 'network_id1')
-
- def test_get_external_net_id_missing_net(self):
- self.assertEqual(openstack_utils.
- get_external_net_id(self.empty_client),
- None)
-
- def test_check_neutron_net_default(self):
- self.assertTrue(openstack_utils.
- check_neutron_net(self.neutron_client,
- 'test_network'))
-
- def test_check_neutron_net_missing_net(self):
- self.assertFalse(openstack_utils.
- check_neutron_net(self.empty_client,
- 'test_network'))
-
- def test_create_neutron_net_default(self):
- self.assertEqual(openstack_utils.
- create_neutron_net(self.neutron_client,
- 'test_network'),
- 'network_id')
-
- @mock.patch('functest.utils.openstack_utils.logger.error')
- def test_create_neutron_net_exception(self, mock_logger_error):
- self.assertEqual(openstack_utils.
- create_neutron_net(Exception,
- 'test_network'),
- None)
- self.assertTrue(mock_logger_error.called)
-
- def test_create_neutron_subnet_default(self):
- self.assertEqual(openstack_utils.
- create_neutron_subnet(self.neutron_client,
- 'test_subnet',
- 'test_cidr',
- 'network_id'),
- 'subnet_id')
-
- @mock.patch('functest.utils.openstack_utils.logger.error')
- def test_create_neutron_subnet_exception(self, mock_logger_error):
- self.assertEqual(openstack_utils.
- create_neutron_subnet(Exception,
- 'test_subnet',
- 'test_cidr',
- 'network_id'),
- None)
- self.assertTrue(mock_logger_error.called)
-
- def test_create_neutron_router_default(self):
- self.assertEqual(openstack_utils.
- create_neutron_router(self.neutron_client,
- 'test_router'),
- 'router_id')
-
- @mock.patch('functest.utils.openstack_utils.logger.error')
- def test_create_neutron_router_exception(self, mock_logger_error):
- self.assertEqual(openstack_utils.
- create_neutron_router(Exception,
- 'test_router'),
- None)
- self.assertTrue(mock_logger_error.called)
-
- def test_create_neutron_port_default(self):
- self.assertEqual(openstack_utils.
- create_neutron_port(self.neutron_client,
- 'test_port',
- 'network_id',
- 'test_ip'),
- 'port_id')
-
- @mock.patch('functest.utils.openstack_utils.logger.error')
- def test_create_neutron_port_exception(self, mock_logger_error):
- self.assertEqual(openstack_utils.
- create_neutron_port(Exception,
- 'test_port',
- 'network_id',
- 'test_ip'),
- None)
- self.assertTrue(mock_logger_error.called)
-
- def test_update_neutron_net_default(self):
- self.assertTrue(openstack_utils.
- update_neutron_net(self.neutron_client,
- 'network_id'))
-
- @mock.patch('functest.utils.openstack_utils.logger.error')
- def test_update_neutron_net_exception(self, mock_logger_error):
- self.assertFalse(openstack_utils.
- update_neutron_net(Exception,
- 'network_id'))
- self.assertTrue(mock_logger_error.called)
-
- def test_update_neutron_port_default(self):
- self.assertEqual(openstack_utils.
- update_neutron_port(self.neutron_client,
- 'port_id',
- 'test_owner'),
- 'port_id')
-
- @mock.patch('functest.utils.openstack_utils.logger.error')
- def test_update_neutron_port_exception(self, mock_logger_error):
- self.assertEqual(openstack_utils.
- update_neutron_port(Exception,
- 'port_id',
- 'test_owner'),
- None)
- self.assertTrue(mock_logger_error.called)
-
- def test_add_interface_router_default(self):
- self.assertTrue(openstack_utils.
- add_interface_router(self.neutron_client,
- 'router_id',
- 'subnet_id'))
-
- @mock.patch('functest.utils.openstack_utils.logger.error')
- def test_add_interface_router_exception(self, mock_logger_error):
- self.assertFalse(openstack_utils.
- add_interface_router(Exception,
- 'router_id',
- 'subnet_id'))
- self.assertTrue(mock_logger_error.called)
-
- def test_add_gateway_router_default(self):
- with mock.patch('functest.utils.openstack_utils.'
- 'get_external_net_id',
- return_value='network_id'):
- self.assertTrue(openstack_utils.
- add_gateway_router(self.neutron_client,
- 'router_id'))
-
- @mock.patch('functest.utils.openstack_utils.logger.error')
- def test_add_gateway_router_exception(self, mock_logger_error):
- with mock.patch('functest.utils.openstack_utils.'
- 'get_external_net_id',
- return_value='network_id'):
- self.assertFalse(openstack_utils.
- add_gateway_router(Exception,
- 'router_id'))
- self.assertTrue(mock_logger_error.called)
-
- def test_delete_neutron_net_default(self):
- self.assertTrue(openstack_utils.
- delete_neutron_net(self.neutron_client,
- 'network_id'))
-
- @mock.patch('functest.utils.openstack_utils.logger.error')
- def test_delete_neutron_net_exception(self, mock_logger_error):
- self.assertFalse(openstack_utils.
- delete_neutron_net(Exception,
- 'network_id'))
- self.assertTrue(mock_logger_error.called)
-
- def test_delete_neutron_subnet_default(self):
- self.assertTrue(openstack_utils.
- delete_neutron_subnet(self.neutron_client,
- 'subnet_id'))
-
- @mock.patch('functest.utils.openstack_utils.logger.error')
- def test_delete_neutron_subnet_exception(self, mock_logger_error):
- self.assertFalse(openstack_utils.
- delete_neutron_subnet(Exception,
- 'subnet_id'))
- self.assertTrue(mock_logger_error.called)
-
- def test_delete_neutron_router_default(self):
- self.assertTrue(openstack_utils.
- delete_neutron_router(self.neutron_client,
- 'router_id'))
-
- @mock.patch('functest.utils.openstack_utils.logger.error')
- def test_delete_neutron_router_exception(self, mock_logger_error):
- self.assertFalse(openstack_utils.
- delete_neutron_router(Exception,
- 'router_id'))
- self.assertTrue(mock_logger_error.called)
-
- def test_delete_neutron_port_default(self):
- self.assertTrue(openstack_utils.
- delete_neutron_port(self.neutron_client,
- 'port_id'))
-
- @mock.patch('functest.utils.openstack_utils.logger.error')
- def test_delete_neutron_port_exception(self, mock_logger_error):
- self.assertFalse(openstack_utils.
- delete_neutron_port(Exception,
- 'port_id'))
- self.assertTrue(mock_logger_error.called)
-
- def test_remove_interface_router_default(self):
- self.assertTrue(openstack_utils.
- remove_interface_router(self.neutron_client,
- 'router_id',
- 'subnet_id'))
-
- @mock.patch('functest.utils.openstack_utils.logger.error')
- def test_remove_interface_router_exception(self, mock_logger_error):
- self.assertFalse(openstack_utils.
- remove_interface_router(Exception,
- 'router_id',
- 'subnet_id'))
- self.assertTrue(mock_logger_error.called)
-
- def test_remove_gateway_router_default(self):
- self.assertTrue(openstack_utils.
- remove_gateway_router(self.neutron_client,
- 'router_id'))
-
- @mock.patch('functest.utils.openstack_utils.logger.error')
- def test_remove_gateway_router_exception(self, mock_logger_error):
- self.assertFalse(openstack_utils.
- remove_gateway_router(Exception,
- 'router_id'))
- self.assertTrue(mock_logger_error.called)
-
- def test_get_security_groups_default(self):
- self.assertEqual(openstack_utils.
- get_security_groups(self.neutron_client),
- [self.sec_group])
-
- @mock.patch('functest.utils.openstack_utils.logger.error')
- def test_get_security_groups_exception(self, mock_logger_error):
- self.assertEqual(openstack_utils.
- get_security_groups(Exception),
- None)
- self.assertTrue(mock_logger_error.called)
-
- def test_get_security_group_id_default(self):
- with mock.patch('functest.utils.openstack_utils.'
- 'get_security_groups',
- return_value=[self.sec_group]):
- self.assertEqual(openstack_utils.
- get_security_group_id(self.neutron_client,
- 'test_sec_group'),
- 'sec_group_id')
-
- def test_get_security_group_rules_default(self):
- self.assertEqual(openstack_utils.
- get_security_group_rules(self.neutron_client,
- self.sec_group['id']),
- [self.sec_group_rule])
-
- @mock.patch('functest.utils.openstack_utils.logger.error')
- def test_get_security_group_rules_exception(self, mock_logger_error):
- self.assertEqual(openstack_utils.
- get_security_group_rules(Exception,
- 'sec_group_id'),
- None)
- self.assertTrue(mock_logger_error.called)
-
- def test_check_security_group_rules_not_exists(self):
- self.assertEqual(openstack_utils.
- check_security_group_rules(self.neutron_client,
- 'sec_group_id_2',
- 'direction',
- 'protocol',
- 'port_min',
- 'port_max'),
- True)
-
- def test_check_security_group_rules_exists(self):
- self.assertEqual(openstack_utils.
- check_security_group_rules(self.neutron_client,
- self.sec_group['id'],
- 'direction',
- 'protocol',
- 'port_min',
- 'port_max'),
- False)
-
- @mock.patch('functest.utils.openstack_utils.logger.error')
- def test_check_security_group_rules_exception(self, mock_logger_error):
- self.assertEqual(openstack_utils.
- check_security_group_rules(Exception,
- 'sec_group_id',
- 'direction',
- 'protocol',
- 'port_max',
- 'port_min'),
- None)
- self.assertTrue(mock_logger_error.called)
-
- def test_create_security_group_default(self):
- self.assertEqual(openstack_utils.
- create_security_group(self.neutron_client,
- 'test_sec_group',
- 'sec_group_desc'),
- self.sec_group)
-
- @mock.patch('functest.utils.openstack_utils.logger.error')
- def test_create_security_group_exception(self, mock_logger_error):
- self.assertEqual(openstack_utils.
- create_security_group(Exception,
- 'test_sec_group',
- 'sec_group_desc'),
- None)
- self.assertTrue(mock_logger_error.called)
-
- def test_create_secgroup_rule_default(self):
- self.assertTrue(openstack_utils.
- create_secgroup_rule(self.neutron_client,
- 'sg_id',
- 'direction',
- 'protocol',
- 80,
- 80))
- self.assertTrue(openstack_utils.
- create_secgroup_rule(self.neutron_client,
- 'sg_id',
- 'direction',
- 'protocol'))
-
- @mock.patch('functest.utils.openstack_utils.logger.error')
- def test_create_secgroup_rule_invalid_port_range(self, mock_logger_error):
- self.assertFalse(openstack_utils.
- create_secgroup_rule(self.neutron_client,
- 'sg_id',
- 'direction',
- 'protocol',
- 80))
-
- @mock.patch('functest.utils.openstack_utils.logger.error')
- def test_create_secgroup_rule_exception(self, mock_logger_error):
- self.assertFalse(openstack_utils.
- create_secgroup_rule(Exception,
- 'sg_id',
- 'direction',
- 'protocol'))
-
- @mock.patch('functest.utils.openstack_utils.logger.info')
- def test_create_security_group_full_default(self, mock_logger_info):
- with mock.patch('functest.utils.openstack_utils.'
- 'get_security_group_id',
- return_value='sg_id'):
- self.assertEqual(openstack_utils.
- create_security_group_full(self.neutron_client,
- 'sg_name',
- 'sg_desc'),
- 'sg_id')
- self.assertTrue(mock_logger_info)
-
- @mock.patch('functest.utils.openstack_utils.logger.info')
- @mock.patch('functest.utils.openstack_utils.logger.error')
- def test_create_security_group_full_sec_group_fail(self,
- mock_logger_error,
- mock_logger_info):
- with mock.patch('functest.utils.openstack_utils.'
- 'get_security_group_id',
- return_value=''), \
- mock.patch('functest.utils.openstack_utils.'
- 'create_security_group',
- return_value=False):
- self.assertEqual(openstack_utils.
- create_security_group_full(self.neutron_client,
- 'sg_name',
- 'sg_desc'),
- None)
- self.assertTrue(mock_logger_error)
- self.assertTrue(mock_logger_info)
-
- @mock.patch('functest.utils.openstack_utils.logger.debug')
- @mock.patch('functest.utils.openstack_utils.logger.info')
- @mock.patch('functest.utils.openstack_utils.logger.error')
- def test_create_security_group_full_secgroup_rule_fail(self,
- mock_logger_error,
- mock_logger_info,
- mock_logger_debug):
- with mock.patch('functest.utils.openstack_utils.'
- 'get_security_group_id',
- return_value=''), \
- mock.patch('functest.utils.openstack_utils.'
- 'create_security_group',
- return_value={'id': 'sg_id',
- 'name': 'sg_name'}), \
- mock.patch('functest.utils.openstack_utils.'
- 'create_secgroup_rule',
- return_value=False):
- self.assertEqual(openstack_utils.
- create_security_group_full(self.neutron_client,
- 'sg_name',
- 'sg_desc'),
- None)
- self.assertTrue(mock_logger_error)
- self.assertTrue(mock_logger_info)
- self.assertTrue(mock_logger_debug)
-
- def test_add_secgroup_to_instance_default(self):
- self.assertTrue(openstack_utils.
- add_secgroup_to_instance(self.nova_client,
- 'instance_id',
- 'sec_group_id'))
-
- @mock.patch('functest.utils.openstack_utils.logger.error')
- def test_add_secgroup_to_instance_exception(self, mock_logger_error):
- self.assertFalse(openstack_utils.
- add_secgroup_to_instance(Exception,
- 'instance_id',
- 'sec_group_id'))
- self.assertTrue(mock_logger_error.called)
-
- def test_update_sg_quota_default(self):
- self.assertTrue(openstack_utils.
- update_sg_quota(self.neutron_client,
- 'tenant_id',
- 'sg_quota',
- 'sg_rule_quota'))
-
- @mock.patch('functest.utils.openstack_utils.logger.error')
- def test_update_sg_quota_exception(self, mock_logger_error):
- self.assertFalse(openstack_utils.
- update_sg_quota(Exception,
- 'tenant_id',
- 'sg_quota',
- 'sg_rule_quota'))
- self.assertTrue(mock_logger_error.called)
-
- def test_delete_security_group_default(self):
- self.assertTrue(openstack_utils.
- delete_security_group(self.neutron_client,
- 'sec_group_id'))
-
- @mock.patch('functest.utils.openstack_utils.logger.error')
- def test_delete_security_group_exception(self, mock_logger_error):
- self.assertFalse(openstack_utils.
- delete_security_group(Exception,
- 'sec_group_id'))
- self.assertTrue(mock_logger_error.called)
-
- def test_get_images_default(self):
- self.assertEqual(openstack_utils.
- get_images(self.glance_client),
- [self.image])
-
- @mock.patch('functest.utils.openstack_utils.logger.error')
- def test_get_images_exception(self, mock_logger_error):
- self.assertEqual(openstack_utils.
- get_images(Exception),
- None)
- self.assertTrue(mock_logger_error.called)
-
- def test_get_image_id_default(self):
- self.assertEqual(openstack_utils.
- get_image_id(self.glance_client,
- 'test_image'),
- 'image_id')
-
- # create_glance_image, get_or_create_image
- @mock.patch('functest.utils.openstack_utils.logger.error')
- def test_create_glance_image_file_present(self, mock_logger_error):
- with mock.patch('functest.utils.openstack_utils.'
- 'os.path.isfile',
- return_value=False):
- self.assertEqual(openstack_utils.
- create_glance_image(self.glance_client,
- 'test_image',
- 'file_path'),
- None)
- self.assertTrue(mock_logger_error.called)
-
- @mock.patch('functest.utils.openstack_utils.logger.info')
- def test_create_glance_image_already_exist(self, mock_logger_info):
- with mock.patch('functest.utils.openstack_utils.'
- 'os.path.isfile',
- return_value=True), \
- mock.patch('functest.utils.openstack_utils.get_image_id',
- return_value='image_id'):
- self.assertEqual(openstack_utils.
- create_glance_image(self.glance_client,
- 'test_image',
- 'file_path'),
- 'image_id')
- self.assertTrue(mock_logger_info.called)
-
- @mock.patch('functest.utils.openstack_utils.logger.info')
- def test_create_glance_image_default(self, mock_logger_info):
- with mock.patch('functest.utils.openstack_utils.'
- 'os.path.isfile',
- return_value=True), \
- mock.patch('functest.utils.openstack_utils.get_image_id',
- return_value=''), \
- mock.patch('six.moves.builtins.open',
- mock.mock_open(read_data='1')) as m:
- self.assertEqual(openstack_utils.
- create_glance_image(self.glance_client,
- 'test_image',
- 'file_path'),
- 'image_id')
- m.assert_called_once_with('file_path')
- self.assertTrue(mock_logger_info.called)
-
- @mock.patch('functest.utils.openstack_utils.logger.error')
- def test_create_glance_image_exception(self, mock_logger_error):
- with mock.patch('functest.utils.openstack_utils.'
- 'os.path.isfile',
- return_value=True), \
- mock.patch('functest.utils.openstack_utils.get_image_id',
- side_effect=Exception):
- self.assertEqual(openstack_utils.
- create_glance_image(self.glance_client,
- 'test_image',
- 'file_path'),
- None)
- self.assertTrue(mock_logger_error.called)
-
- def test_delete_glance_image_default(self):
- self.assertTrue(openstack_utils.
- delete_glance_image(self.nova_client,
- 'image_id'))
-
- @mock.patch('functest.utils.openstack_utils.logger.error')
- def test_delete_glance_image_exception(self, mock_logger_error):
- self.assertFalse(openstack_utils.
- delete_glance_image(Exception,
- 'image_id'))
- self.assertTrue(mock_logger_error.called)
-
- def test_get_volumes_default(self):
- self.assertEqual(openstack_utils.
- get_volumes(self.cinder_client),
- [self.volume])
-
- @mock.patch('functest.utils.openstack_utils.logger.error')
- def test_get_volumes_exception(self, mock_logger_error):
- self.assertEqual(openstack_utils.
- get_volumes(Exception),
- None)
- self.assertTrue(mock_logger_error.called)
-
- def test_update_cinder_quota_default(self):
- self.assertTrue(openstack_utils.
- update_cinder_quota(self.cinder_client,
- 'tenant_id',
- 'vols_quota',
- 'snap_quota',
- 'giga_quota'))
-
- @mock.patch('functest.utils.openstack_utils.logger.error')
- def test_update_cinder_quota_exception(self, mock_logger_error):
- self.assertFalse(openstack_utils.
- update_cinder_quota(Exception,
- 'tenant_id',
- 'vols_quota',
- 'snap_quota',
- 'giga_quota'))
- self.assertTrue(mock_logger_error.called)
-
- def test_delete_volume_default(self):
- self.assertTrue(openstack_utils.
- delete_volume(self.cinder_client,
- 'volume_id',
- forced=False))
-
- self.assertTrue(openstack_utils.
- delete_volume(self.cinder_client,
- 'volume_id',
- forced=True))
-
- @mock.patch('functest.utils.openstack_utils.logger.error')
- def test_delete_volume_exception(self, mock_logger_error):
- self.assertFalse(openstack_utils.
- delete_volume(Exception,
- 'volume_id',
- forced=True))
- self.assertTrue(mock_logger_error.called)
-
- def test_get_tenants_default(self):
- with mock.patch('functest.utils.openstack_utils.'
- 'is_keystone_v3', return_value=True):
- self.assertEqual(openstack_utils.
- get_tenants(self.keystone_client),
- [self.tenant])
- with mock.patch('functest.utils.openstack_utils.'
- 'is_keystone_v3', return_value=False):
- self.assertEqual(openstack_utils.
- get_tenants(self.keystone_client),
- [self.tenant])
-
- @mock.patch('functest.utils.openstack_utils.logger.error')
- def test_get_tenants_exception(self, mock_logger_error):
- self.assertEqual(openstack_utils.
- get_tenants(Exception),
- None)
- self.assertTrue(mock_logger_error.called)
-
- def test_get_users_default(self):
- self.assertEqual(openstack_utils.
- get_users(self.keystone_client),
- [self.user])
-
- @mock.patch('functest.utils.openstack_utils.logger.error')
- def test_get_users_exception(self, mock_logger_error):
- self.assertEqual(openstack_utils.
- get_users(Exception),
- None)
- self.assertTrue(mock_logger_error.called)
-
- def test_get_tenant_id_default(self):
- self.assertEqual(openstack_utils.
- get_tenant_id(self.keystone_client,
- 'test_tenant'),
- 'tenant_id')
-
- def test_get_user_id_default(self):
- self.assertEqual(openstack_utils.
- get_user_id(self.keystone_client,
- 'test_user'),
- 'user_id')
-
- def test_get_role_id_default(self):
- self.assertEqual(openstack_utils.
- get_role_id(self.keystone_client,
- 'test_role'),
- 'role_id')
-
- def test_get_domain_id_default(self):
- self.assertEqual(openstack_utils.
- get_domain_id(self.keystone_client,
- 'test_domain'),
- 'domain_id')
-
- def test_create_tenant_default(self):
- with mock.patch('functest.utils.openstack_utils.'
- 'is_keystone_v3', return_value=True):
- CONST.__setattr__('OS_PROJECT_DOMAIN_NAME', 'Default')
- self.assertEqual(openstack_utils.
- create_tenant(self.keystone_client,
- 'test_tenant',
- 'tenant_desc'),
- 'tenant_id')
- with mock.patch('functest.utils.openstack_utils.'
- 'is_keystone_v3', return_value=False):
- self.assertEqual(openstack_utils.
- create_tenant(self.keystone_client,
- 'test_tenant',
- 'tenant_desc'),
- 'tenant_id')
-
- @mock.patch('functest.utils.openstack_utils.logger.error')
- def test_create_tenant_exception(self, mock_logger_error):
- self.assertEqual(openstack_utils.
- create_tenant(Exception,
- 'test_tenant',
- 'tenant_desc'),
- None)
- self.assertTrue(mock_logger_error.called)
-
- def test_create_user_default(self):
- with mock.patch('functest.utils.openstack_utils.'
- 'is_keystone_v3', return_value=True):
- self.assertEqual(openstack_utils.
- create_user(self.keystone_client,
- 'test_user',
- 'password',
- 'email',
- 'tenant_id'),
- 'user_id')
- with mock.patch('functest.utils.openstack_utils.'
- 'is_keystone_v3', return_value=False):
- self.assertEqual(openstack_utils.
- create_user(self.keystone_client,
- 'test_user',
- 'password',
- 'email',
- 'tenant_id'),
- 'user_id')
-
- @mock.patch('functest.utils.openstack_utils.logger.error')
- def test_create_user_exception(self, mock_logger_error):
- self.assertEqual(openstack_utils.
- create_user(Exception,
- 'test_user',
- 'password',
- 'email',
- 'tenant_id'),
- None)
- self.assertTrue(mock_logger_error.called)
-
- def test_add_role_user_default(self):
- with mock.patch('functest.utils.openstack_utils.'
- 'is_keystone_v3', return_value=True):
- self.assertTrue(openstack_utils.
- add_role_user(self.keystone_client,
- 'user_id',
- 'role_id',
- 'tenant_id'))
-
- with mock.patch('functest.utils.openstack_utils.'
- 'is_keystone_v3', return_value=False):
- self.assertTrue(openstack_utils.
- add_role_user(self.keystone_client,
- 'user_id',
- 'role_id',
- 'tenant_id'))
-
- @mock.patch('functest.utils.openstack_utils.logger.error')
- def test_add_role_user_exception(self, mock_logger_error):
- self.assertFalse(openstack_utils.
- add_role_user(Exception,
- 'user_id',
- 'role_id',
- 'tenant_id'))
- self.assertTrue(mock_logger_error.called)
-
- def test_delete_tenant_default(self):
- with mock.patch('functest.utils.openstack_utils.'
- 'is_keystone_v3', return_value=True):
- self.assertTrue(openstack_utils.
- delete_tenant(self.keystone_client,
- 'tenant_id'))
-
- with mock.patch('functest.utils.openstack_utils.'
- 'is_keystone_v3', return_value=False):
- self.assertTrue(openstack_utils.
- delete_tenant(self.keystone_client,
- 'tenant_id'))
-
- @mock.patch('functest.utils.openstack_utils.logger.error')
- def test_delete_tenant_exception(self, mock_logger_error):
- self.assertFalse(openstack_utils.
- delete_tenant(Exception,
- 'tenant_id'))
- self.assertTrue(mock_logger_error.called)
-
- def test_delete_user_default(self):
- self.assertTrue(openstack_utils.
- delete_user(self.keystone_client,
- 'user_id'))
-
- @mock.patch('functest.utils.openstack_utils.logger.error')
- def test_delete_user_exception(self, mock_logger_error):
- self.assertFalse(openstack_utils.
- delete_user(Exception,
- 'user_id'))
- self.assertTrue(mock_logger_error.called)
-
- def test_get_resource_default(self):
- with mock.patch('functest.utils.openstack_utils.'
- 'is_keystone_v3', return_value=True):
- self.assertEqual(openstack_utils.
- get_resource(self.heat_client,
- 'stack_id',
- 'resource'),
- self.resource)
-
- @mock.patch('functest.utils.openstack_utils.logger.error')
- def test_get_resource_exception(self, mock_logger_error):
- self.assertEqual(openstack_utils.
- get_resource(Exception,
- 'stack_id',
- 'resource'),
- None)
- self.assertTrue(mock_logger_error.called)
-
- def test_get_or_create_user_for_vnf_get(self):
- with mock.patch('functest.utils.openstack_utils.'
- 'get_user_id',
- return_value='user_id'), \
- mock.patch('functest.utils.openstack_utils.get_tenant_id',
- return_value='tenant_id'):
- self.assertFalse(openstack_utils.
- get_or_create_user_for_vnf(self.keystone_client,
- 'my_vnf'))
-
- def test_get_or_create_user_for_vnf_create(self):
- with mock.patch('functest.utils.openstack_utils.'
- 'get_user_id',
- return_value=None), \
- mock.patch('functest.utils.openstack_utils.get_tenant_id',
- return_value='tenant_id'):
- self.assertTrue(openstack_utils.
- get_or_create_user_for_vnf(self.keystone_client,
- 'my_vnf'))
-
- def test_get_or_create_user_for_vnf_error_get_user_id(self):
- with mock.patch('functest.utils.openstack_utils.'
- 'get_user_id',
- side_effect=Exception):
- self.assertRaises(Exception)
-
- def test_get_or_create_user_for_vnf_error_get_tenant_id(self):
- with mock.patch('functest.utils.openstack_utils.'
- 'get_user_id',
- return_value='user_id'), \
- mock.patch('functest.utils.openstack_utils.get_tenant_id',
- side_effect='Exception'):
- self.assertRaises(Exception)
-
- def test_get_or_create_tenant_for_vnf_get(self):
- with mock.patch('functest.utils.openstack_utils.'
- 'get_tenant_id',
- return_value='tenant_id'):
- self.assertFalse(
- openstack_utils.get_or_create_tenant_for_vnf(
- self.keystone_client, 'tenant_name', 'tenant_description'))
-
- def test_get_or_create_tenant_for_vnf_create(self):
- with mock.patch('functest.utils.openstack_utils.get_tenant_id',
- return_value=None):
- self.assertTrue(
- openstack_utils.get_or_create_tenant_for_vnf(
- self.keystone_client, 'tenant_name', 'tenant_description'))
-
- def test_get_or_create_tenant_for_vnf_error_get_tenant_id(self):
- with mock.patch('functest.utils.openstack_utils.'
- 'get_tenant_id',
- side_effect=Exception):
- self.assertRaises(Exception)
-
- def test_download_and_add_image_on_glance_image_creation_failure(self):
- with mock.patch('functest.utils.openstack_utils.'
- 'os.makedirs'), \
- mock.patch('functest.utils.openstack_utils.'
- 'ft_utils.download_url',
- return_value=True), \
- mock.patch('functest.utils.openstack_utils.'
- 'create_glance_image',
- return_value=''):
- resp = openstack_utils.download_and_add_image_on_glance(
- self.glance_client,
- 'image_name',
- 'http://url',
- 'data_dir')
- self.assertEqual(resp, False)
-
-
-if __name__ == "__main__":
- logging.disable(logging.CRITICAL)
- unittest.main(verbosity=2)
diff --git a/functest/opnfv_tests/openstack/refstack_client/__init__.py b/functest/tests/unit/vnf/epc/__init__.py
index e69de29bb..e69de29bb 100644
--- a/functest/opnfv_tests/openstack/refstack_client/__init__.py
+++ b/functest/tests/unit/vnf/epc/__init__.py
diff --git a/functest/tests/unit/vnf/epc/test_juju_epc.py b/functest/tests/unit/vnf/epc/test_juju_epc.py
index 2b7453128..a72c61586 100644
--- a/functest/tests/unit/vnf/epc/test_juju_epc.py
+++ b/functest/tests/unit/vnf/epc/test_juju_epc.py
@@ -18,7 +18,7 @@ from functest.opnfv_tests.vnf.epc import juju_epc
class JujuEpcTesting(unittest.TestCase):
-
+ # pylint: disable=missing-docstring
"""Unittest for ABoT EPC with juju orchestrator"""
def setUp(self):
@@ -52,15 +52,7 @@ class JujuEpcTesting(unittest.TestCase):
return_value={'tenant_images': 'foo',
'orchestrator': self.orchestrator,
'vnf': self.vnf, 'vnf_test_suite': '',
- 'version': 'whatever'}), \
- mock.patch('functest.utils.openstack_utils.get_keystone_client',
- return_value='test'), \
- mock.patch('functest.utils.openstack_utils.get_glance_client',
- return_value='test'), \
- mock.patch('functest.utils.openstack_utils.get_neutron_client',
- return_value='test'), \
- mock.patch('functest.utils.openstack_utils.get_nova_client',
- return_value='test'):
+ 'version': 'whatever'}):
self.epc_vnf = juju_epc.JujuEpc()
self.images = {'image1': 'url1',
@@ -69,16 +61,7 @@ class JujuEpcTesting(unittest.TestCase):
'vnf': {},
'test_vnf': {}}
- @mock.patch('functest.utils.openstack_utils.get_keystone_client',
- return_value='test')
- @mock.patch('functest.utils.openstack_utils.get_or_create_tenant_for_vnf',
- return_value=True)
- @mock.patch('functest.utils.openstack_utils.get_or_create_user_for_vnf',
- return_value=True)
- @mock.patch('functest.utils.openstack_utils.get_credentials',
- return_value={'auth_url': 'test/v1',
- 'project_name': 'test_tenant'})
- @mock.patch('snaps.openstack.create_image.OpenStackImage.create')
+ @unittest.skip("It must be fixed. Please see JIRA FUNCTEST-915")
@mock.patch('os.system')
def test_prepare_default(self, *args):
""" Unittest for Prepare testcase """
diff --git a/functest/tests/unit/vnf/ims/test_ims_base.py b/functest/tests/unit/vnf/ims/test_clearwater.py
index 66d35e39f..f590a2857 100644
--- a/functest/tests/unit/vnf/ims/test_ims_base.py
+++ b/functest/tests/unit/vnf/ims/test_clearwater.py
@@ -5,20 +5,23 @@
# which accompanies this distribution, and is available at
# http://www.apache.org/licenses/LICENSE-2.0
+# pylint: disable=missing-docstring
+
import logging
import unittest
import mock
-from functest.opnfv_tests.vnf.ims import clearwater_ims_base as ims_base
+from functest.opnfv_tests.vnf.ims import clearwater
-class ClearwaterOnBoardingBaseTesting(unittest.TestCase):
+class ClearwaterTesting(unittest.TestCase):
def setUp(self):
with mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
'os.makedirs'):
- self.ims_vnf = ims_base.ClearwaterOnBoardingBase()
+ self.ims_vnf = clearwater.ClearwaterTesting(
+ "foo", "0.0.0.0", "0.0.0.0")
self.mock_post = mock.Mock()
attrs = {'status_code': 201,
@@ -35,6 +38,7 @@ class ClearwaterOnBoardingBaseTesting(unittest.TestCase):
'cookies': ""}
self.mock_post_200.configure_mock(**attrs)
+
if __name__ == "__main__":
logging.disable(logging.CRITICAL)
unittest.main(verbosity=2)
diff --git a/functest/tests/unit/vnf/ims/test_cloudify_ims.py b/functest/tests/unit/vnf/ims/test_cloudify_ims.py
index cdd657aac..c84adf0ff 100644
--- a/functest/tests/unit/vnf/ims/test_cloudify_ims.py
+++ b/functest/tests/unit/vnf/ims/test_cloudify_ims.py
@@ -5,59 +5,14 @@
# which accompanies this distribution, and is available at
# http://www.apache.org/licenses/LICENSE-2.0
+# pylint: disable=missing-docstring
+
import logging
import unittest
-import mock
-
-from functest.core import vnf
-from functest.opnfv_tests.vnf.ims import cloudify_ims
-
class CloudifyImsTesting(unittest.TestCase):
-
- def setUp(self):
-
- self.tenant = 'cloudify_ims'
- self.creds = {'username': 'user',
- 'password': 'pwd'}
- self.orchestrator = {'name': 'cloudify',
- 'version': '4.0',
- 'object': 'foo',
- 'requirements': {'flavor': {'name': 'm1.medium',
- 'ram_min': 4096},
- 'os_image': 'manager_4.0'}}
-
- self.vnf = {'name': 'clearwater',
- 'descriptor': {'version': '108',
- 'file_name': 'openstack-blueprint.yaml',
- 'name': 'clearwater-opnfv',
- 'url': 'https://foo',
- 'requirements': {'flavor':
- {'name': 'm1.medium',
- 'ram_min': 2048}}}}
-
- with mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
- 'os.makedirs'), \
- mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
- 'get_config', return_value={
- 'tenant_images': 'foo',
- 'orchestrator': self.orchestrator,
- 'vnf': self.vnf,
- 'vnf_test_suite': '',
- 'version': 'whatever'}):
-
- self.ims_vnf = cloudify_ims.CloudifyIms()
-
- self.images = {'image1': 'url1',
- 'image2': 'url2'}
- self.details = {'orchestrator': {'status': 'PASS', 'duration': 120},
- 'vnf': {},
- 'test_vnf': {}}
-
- def test_prepare_missing_param(self):
- with self.assertRaises(vnf.VnfPreparationException):
- self.ims_vnf.prepare()
+ pass
if __name__ == "__main__":
diff --git a/functest/tests/unit/vnf/ims/test_orchestra_clearwaterims.py b/functest/tests/unit/vnf/ims/test_orchestra_clearwaterims.py
deleted file mode 100644
index 2e83f30a4..000000000
--- a/functest/tests/unit/vnf/ims/test_orchestra_clearwaterims.py
+++ /dev/null
@@ -1,120 +0,0 @@
-#!/usr/bin/env python
-
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-
-"""Test module for orchestra_clearwaterims"""
-
-import logging
-import unittest
-
-import mock
-
-from functest.core import vnf
-from functest.opnfv_tests.vnf.ims import orchestra_clearwaterims
-
-
-class OrchestraClearwaterImsTesting(unittest.TestCase):
- """Test class for orchestra_clearwaterims"""
- def setUp(self):
-
- self.tenant = 'orchestra_clearwaterims'
- self.creds = {'username': 'mocked_username',
- 'password': 'mocked_password'}
- self.tenant_images = {
- 'image1': 'mocked_image_url_1',
- 'image2': 'mocked_image_url_2'
- }
- self.mano = {
- 'name': 'openbaton',
- 'version': '3.2.0',
- 'object': 'foo',
- 'requirements': {
- 'flavor': {
- 'name': 'mocked_flavor',
- 'ram_min': 4096,
- 'disk': 5,
- 'vcpus': 2
- },
- 'os_image': 'mocked_image'
- },
- 'bootstrap': {
- 'url': 'mocked_bootstrap_url',
- 'config': {
- 'url': 'mocked_config_url'}
- },
- 'gvnfm': {
- 'userdata': {
- 'url': 'mocked_userdata_url'
- }
- },
- 'credentials': {
- 'username': 'mocked_username',
- 'password': 'mocked_password'
- }
- }
- self.vnf = {
- 'name': 'openims',
- 'descriptor': {
- 'url': 'mocked_descriptor_url'
- },
- 'requirements': {
- 'flavor': {
- 'name': 'mocked_flavor',
- 'ram_min': 2048,
- 'disk': 5,
- 'vcpus': 2}
- }
- }
- self.clearwaterims = {
- 'scscf': {
- 'ports': [3870, 6060]
- },
- 'pcscf': {
- 'ports': [4060]
- },
- 'icscf': {
- 'ports': [3869, 5060]
- },
- 'fhoss': {
- 'ports': [3868]
- },
- 'bind9': {
- 'ports': []
- }
- }
- with mock.patch('functest.opnfv_tests.vnf.ims.orchestra_clearwaterims.'
- 'os.makedirs'),\
- mock.patch('functest.opnfv_tests.vnf.ims.orchestra_clearwaterims.'
- 'get_config', return_value={
- 'orchestrator': self.mano,
- 'name': self.mano['name'],
- 'version': self.mano['version'],
- 'requirements': self.mano['requirements'],
- 'credentials': self.mano['credentials'],
- 'bootstrap': self.mano['bootstrap'],
- 'gvnfm': self.mano['gvnfm'],
- 'os_image': self.mano['requirements']['os_image'],
- 'flavor': self.mano['requirements']['flavor'],
- 'url': self.mano['bootstrap']['url'],
- 'config': self.mano['bootstrap']['config'],
- 'tenant_images': self.tenant_images,
- 'vnf': self.vnf,
- 'orchestra_clearwaterims': self.clearwaterims}):
- self.ims_vnf = orchestra_clearwaterims.ClearwaterImsVnf()
-
- self.details = {'orchestrator': {'status': 'PASS', 'duration': 120},
- 'vnf': {},
- 'test_vnf': {}}
-
- def test_prepare_missing_param(self):
- """Testing prepare function with missing param"""
- with self.assertRaises(vnf.VnfPreparationException):
- self.ims_vnf.prepare()
-
-
-if __name__ == "__main__":
- logging.disable(logging.CRITICAL)
- unittest.main(verbosity=2)
diff --git a/functest/tests/unit/vnf/ims/test_orchestra_openims.py b/functest/tests/unit/vnf/ims/test_orchestra_openims.py
deleted file mode 100644
index 47a8d0338..000000000
--- a/functest/tests/unit/vnf/ims/test_orchestra_openims.py
+++ /dev/null
@@ -1,122 +0,0 @@
-#!/usr/bin/env python
-
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-
-"""Test module for orchestra_openims"""
-
-import logging
-import unittest
-
-import mock
-
-from functest.core import vnf
-from functest.opnfv_tests.vnf.ims import orchestra_openims
-
-
-class OrchestraOpenImsTesting(unittest.TestCase):
- """Test class for orchestra_openims"""
- def setUp(self):
-
- self.tenant = 'orchestra_openims'
- self.creds = {'username': 'mocked_username',
- 'password': 'mocked_password'}
- self.tenant_images = {
- 'image1': 'mocked_image_url_1',
- 'image2': 'mocked_image_url_2'
- }
- self.mano = {
- 'name': 'openbaton',
- 'version': '3.2.0',
- 'object': 'foo',
- 'requirements': {
- 'flavor': {
- 'name': 'mocked_flavor',
- 'ram_min': 4096,
- 'disk': 5,
- 'vcpus': 2
- },
- 'os_image': 'mocked_image'
- },
- 'bootstrap': {
- 'url': 'mocked_bootstrap_url',
- 'config': {
- 'url': 'mocked_config_url'}
- },
- 'gvnfm': {
- 'userdata': {
- 'url': 'mocked_userdata_url'
- }
- },
- 'credentials': {
- 'username': 'mocked_username',
- 'password': 'mocked_password'
- }
- }
- self.vnf = {
- 'name': 'openims',
- 'descriptor': {
- 'url': 'mocked_descriptor_url'
- },
- 'requirements': {
- 'flavor': {
- 'name': 'mocked_flavor',
- 'ram_min': 2048,
- 'disk': 5,
- 'vcpus': 2}
- }
- }
- self.openims = {
- 'scscf': {
- 'ports': [3870, 6060]
- },
- 'pcscf': {
- 'ports': [4060]
- },
- 'icscf': {
- 'ports': [3869, 5060]
- },
- 'fhoss': {
- 'ports': [3868]
- },
- 'bind9': {
- 'ports': []
- }
- }
- with mock.patch('functest.opnfv_tests.vnf.ims.orchestra_openims.'
- 'os.makedirs'),\
- mock.patch('functest.opnfv_tests.vnf.ims.orchestra_openims.'
- 'get_config', return_value={
- 'orchestrator': self.mano,
- 'name': self.mano['name'],
- 'version': self.mano['version'],
- 'requirements': self.mano['requirements'],
- 'credentials': self.mano['credentials'],
- 'bootstrap': self.mano['bootstrap'],
- 'gvnfm': self.mano['gvnfm'],
- 'os_image':
- self.mano['requirements']['os_image'],
- 'flavor':
- self.mano['requirements']['flavor'],
- 'url': self.mano['bootstrap']['url'],
- 'config': self.mano['bootstrap']['config'],
- 'tenant_images': self.tenant_images,
- 'vnf': self.vnf,
- 'orchestra_openims': self.openims}):
- self.ims_vnf = orchestra_openims.OpenImsVnf()
-
- self.details = {'orchestrator': {'status': 'PASS', 'duration': 120},
- 'vnf': {},
- 'test_vnf': {}}
-
- def test_prepare_missing_param(self):
- """Testing prepare function with missing param"""
- with self.assertRaises(vnf.VnfPreparationException):
- self.ims_vnf.prepare()
-
-
-if __name__ == "__main__":
- logging.disable(logging.CRITICAL)
- unittest.main(verbosity=2)
diff --git a/functest/tests/unit/vnf/router/test_cloudify_vrouter.py b/functest/tests/unit/vnf/router/test_cloudify_vrouter.py
index 4d8e9405b..b3f83e946 100644
--- a/functest/tests/unit/vnf/router/test_cloudify_vrouter.py
+++ b/functest/tests/unit/vnf/router/test_cloudify_vrouter.py
@@ -7,62 +7,15 @@
# which accompanies this distribution, and is available at
# http://www.apache.org/licenses/LICENSE-2.0
+# pylint: disable=missing-docstring
+
import logging
import unittest
-import mock
-
-from functest.core import vnf
-from functest.opnfv_tests.vnf.router import cloudify_vrouter
-
class CloudifyVrouterTesting(unittest.TestCase):
- @mock.patch('functest.opnfv_tests.vnf.router.cloudify_vrouter.Utilvnf')
- @mock.patch('functest.opnfv_tests.vnf.router.cloudify_vrouter.vrouter_base'
- '.Utilvnf')
- @mock.patch('os.makedirs')
- def setUp(self, *args):
-
- self.tenant = 'cloudify_vrouter'
- self.creds = {'username': 'user',
- 'password': 'pwd'}
- self.orchestrator = {'name': 'cloudify',
- 'version': '4.0',
- 'object': 'foo',
- 'requirements': {'flavor': {'name': 'm1.medium',
- 'ram_min': 4096},
- 'os_image': 'manager_4.0'}}
-
- self.vnf = {'name': 'vrouter',
- 'descriptor': {'version': '100',
- 'file_name': 'function-test-' +
- 'openstack-blueprint.yaml',
- 'name': 'vrouter-opnfv',
- 'url': 'https://foo',
- 'requirements': {'flavor':
- {'name': 'm1.medium',
- 'ram_min': 2048}}}}
-
- with mock.patch('functest.opnfv_tests.vnf.router.cloudify_vrouter.'
- 'get_config', return_value={
- 'tenant_images': 'foo',
- 'orchestrator': self.orchestrator,
- 'vnf': self.vnf,
- 'vnf_test_suite': '',
- 'version': 'whatever'}):
-
- self.router_vnf = cloudify_vrouter.CloudifyVrouter()
-
- self.images = {'image1': 'url1',
- 'image2': 'url2'}
- self.details = {'orchestrator': {'status': 'PASS', 'duration': 120},
- 'vnf': {},
- 'test_vnf': {}}
-
- def test_prepare_missing_param(self):
- with self.assertRaises(vnf.VnfPreparationException):
- self.router_vnf.prepare()
+ pass
if __name__ == "__main__":
diff --git a/functest/tests/unit/vnf/router/test_vrouter_base.py b/functest/tests/unit/vnf/router/test_vrouter_base.py
index def201d16..330093658 100644
--- a/functest/tests/unit/vnf/router/test_vrouter_base.py
+++ b/functest/tests/unit/vnf/router/test_vrouter_base.py
@@ -7,20 +7,14 @@
# which accompanies this distribution, and is available at
# http://www.apache.org/licenses/LICENSE-2.0
+# pylint: disable=missing-docstring
+
import logging
import unittest
-import mock
-
-from functest.opnfv_tests.vnf.router import vrouter_base
-
class VrouterOnBoardingBaseTesting(unittest.TestCase):
-
- def setUp(self):
- with mock.patch('functest.opnfv_tests.vnf.router.cloudify_vrouter.'
- 'os.makedirs'):
- self.vrouter_vnf = vrouter_base.VrouterOnBoardingBase()
+ pass
if __name__ == "__main__":
diff --git a/functest/utils/config.py b/functest/utils/config.py
index f4749a75b..40414b88b 100644
--- a/functest/utils/config.py
+++ b/functest/utils/config.py
@@ -2,21 +2,24 @@
# pylint: disable=missing-docstring
-import os
import pkg_resources
import yaml
import six
+from functest.utils import env
-class Config(object):
+
+class Config():
def __init__(self):
try:
with open(pkg_resources.resource_filename(
- 'functest', 'ci/config_functest.yaml')) as yfile:
+ 'functest', 'ci/config_functest.yaml'),
+ encoding='utf-8') as yfile:
self.functest_yaml = yaml.safe_load(yfile)
except Exception as error:
- raise Exception('Parse config failed: {}'.format(str(error)))
+ raise Exception(
+ f'Parse config failed: {str(error)}') from error
@staticmethod
def _merge_dicts(dict1, dict2):
@@ -32,11 +35,11 @@ class Config(object):
yield (k, dict2[k])
def patch_file(self, patch_file_path):
- with open(patch_file_path) as yfile:
+ with open(patch_file_path, encoding='utf-8') as yfile:
patch_file = yaml.safe_load(yfile)
for key in patch_file:
- if key in os.environ.get('DEPLOY_SCENARIO', ""):
+ if key in env.get('DEPLOY_SCENARIO'):
self.functest_yaml = dict(Config._merge_dicts(
self.functest_yaml, patch_file[key]))
@@ -44,26 +47,27 @@ class Config(object):
for param_n, param_v in six.iteritems(left_parametes):
attr_further = self._get_attr_further(attr_now, param_n)
if attr_further:
- self.__setattr__(attr_further, param_v)
+ setattr(self, attr_further, param_v)
if isinstance(param_v, dict):
self._parse(attr_further, param_v)
@staticmethod
def _get_attr_further(attr_now, next): # pylint: disable=redefined-builtin
return attr_now if next == 'general' else (
- '{}_{}'.format(attr_now, next) if attr_now else next)
+ f'{attr_now}_{next}' if attr_now else next)
def fill(self):
try:
self._parse(None, self.functest_yaml)
except Exception as error:
- raise Exception('Parse config failed: {}'.format(str(error)))
+ raise Exception(
+ f'Parse config failed: {str(error)}') from error
CONF = Config()
CONF.patch_file(pkg_resources.resource_filename(
'functest', 'ci/config_patch.yaml'))
-if os.getenv("POD_ARCH", None) and os.getenv("POD_ARCH", None) in ['aarch64']:
+if env.get("POD_ARCH") in ['aarch64']:
CONF.patch_file(pkg_resources.resource_filename(
'functest', 'ci/config_aarch64_patch.yaml'))
CONF.fill()
diff --git a/functest/utils/constants.py b/functest/utils/constants.py
index 75c97c765..5e7c24422 100644
--- a/functest/utils/constants.py
+++ b/functest/utils/constants.py
@@ -1,17 +1,11 @@
#!/usr/bin/env python
-import six
+# pylint: disable=missing-docstring
-from functest.utils import config
-from functest.utils import env
+import pkg_resources
+from xtesting.utils import constants
+CONFIG_FUNCTEST_YAML = pkg_resources.resource_filename(
+ 'functest', 'ci/config_functest.yaml')
-class Constants(object):
- def __init__(self):
- for attr_n, attr_v in six.iteritems(config.CONF.__dict__):
- self.__setattr__(attr_n, attr_v)
- for env_n, env_v in six.iteritems(env.ENV.__dict__):
- self.__setattr__(env_n, env_v)
-
-
-CONST = Constants()
+ENV_FILE = constants.ENV_FILE
diff --git a/functest/utils/decorators.py b/functest/utils/decorators.py
deleted file mode 100644
index 230a99e75..000000000
--- a/functest/utils/decorators.py
+++ /dev/null
@@ -1,57 +0,0 @@
-#!/usr/bin/env python
-
-# Copyright (c) 2017 Orange and others.
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-
-# pylint: disable=missing-docstring
-
-import errno
-import functools
-import os
-
-import mock
-import requests.sessions
-from six.moves import urllib
-
-
-def can_dump_request_to_file(method):
-
- def dump_preparedrequest(request, **kwargs):
- # pylint: disable=unused-argument
- parseresult = urllib.parse.urlparse(request.url)
- if parseresult.scheme == "file":
- try:
- dirname = os.path.dirname(parseresult.path)
- os.makedirs(dirname)
- except OSError as ex:
- if ex.errno != errno.EEXIST:
- raise
- with open(parseresult.path, 'a') as dumpfile:
- headers = ""
- for key in request.headers:
- headers += key + " " + request.headers[key] + "\n"
- message = "{} {}\n{}\n{}\n\n\n".format(
- request.method, request.url, headers, request.body)
- dumpfile.write(message)
- return mock.Mock()
-
- def patch_request(method, url, **kwargs):
- with requests.sessions.Session() as session:
- parseresult = urllib.parse.urlparse(url)
- if parseresult.scheme == "file":
- with mock.patch.object(session, 'send',
- side_effect=dump_preparedrequest):
- return session.request(method=method, url=url, **kwargs)
- else:
- return session.request(method=method, url=url, **kwargs)
-
- @functools.wraps(method)
- def hook(*args, **kwargs):
- with mock.patch('requests.api.request', side_effect=patch_request):
- return method(*args, **kwargs)
-
- return hook
diff --git a/functest/utils/env.py b/functest/utils/env.py
index f0952500c..2e312726c 100644
--- a/functest/utils/env.py
+++ b/functest/utils/env.py
@@ -1,52 +1,60 @@
#!/usr/bin/env python
-import pkg_resources
-import os
-import re
-
-import six
-
-
-default_envs = {
- 'NODE_NAME': 'unknown_pod',
- 'CI_DEBUG': 'false',
- 'DEPLOY_SCENARIO': 'os-nosdn-nofeature-noha',
- 'DEPLOY_TYPE': 'virt',
- 'INSTALLER_TYPE': None,
- 'INSTALLER_IP': None,
- 'BUILD_TAG': None,
- 'OS_ENDPOINT_TYPE': None,
- 'OS_AUTH_URL': None,
- 'CONFIG_FUNCTEST_YAML': pkg_resources.resource_filename(
- 'functest', 'ci/config_functest.yaml'),
- 'OS_INSECURE': '',
- 'OS_REGION_NAME': 'RegionOne'
-}
+# Copyright (c) 2018 Orange and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+# pylint: disable=missing-docstring
-class Environment(object):
+import os
- def __init__(self):
- for k, v in six.iteritems(os.environ):
- self.__setattr__(k, v)
- for k, v in six.iteritems(default_envs):
- if k not in os.environ:
- self.__setattr__(k, v)
- self._set_ci_run()
- if 'CI_LOOP' not in os.environ:
- self._set_ci_loop()
+import prettytable
+from xtesting.utils import env
+
+INPUTS = {
+ 'EXTERNAL_NETWORK': None,
+ 'CI_LOOP': env.INPUTS['CI_LOOP'],
+ 'DEBUG': env.INPUTS['DEBUG'],
+ 'DEPLOY_SCENARIO': env.INPUTS['DEPLOY_SCENARIO'],
+ 'INSTALLER_TYPE': env.INPUTS['INSTALLER_TYPE'],
+ 'SDN_CONTROLLER_IP': None,
+ 'SDN_CONTROLLER_USER': 'admin',
+ 'SDN_CONTROLLER_PASSWORD': 'admin',
+ 'SDN_CONTROLLER_WEBPORT': '8080',
+ 'SDN_CONTROLLER_RESTCONFPORT': '8181',
+ 'BUILD_TAG': env.INPUTS['BUILD_TAG'],
+ 'NODE_NAME': env.INPUTS['NODE_NAME'],
+ 'POD_ARCH': None,
+ 'TEST_DB_URL': env.INPUTS['TEST_DB_URL'],
+ 'VOLUME_DEVICE_NAME': 'vdb',
+ 'IMAGE_PROPERTIES': '',
+ 'FLAVOR_EXTRA_SPECS': '',
+ 'NAMESERVER': '8.8.8.8',
+ 'NEW_USER_ROLE': 'Member',
+ 'USE_DYNAMIC_CREDENTIALS': 'True',
+ 'BLOCK_MIGRATION': 'False',
+ 'CLEAN_ORPHAN_SECURITY_GROUPS': 'True',
+ 'SKIP_DOWN_HYPERVISORS': 'False',
+ 'PUBLIC_ENDPOINT_ONLY': 'False',
+ 'DASHBOARD_URL': '',
+ 'VMTP_HYPERVISORS': '',
+ 'NO_TENANT_NETWORK': 'False'
+}
- def _set_ci_run(self):
- if self.BUILD_TAG:
- self.IS_CI_RUN = True
- else:
- self.IS_CI_RUN = False
- def _set_ci_loop(self):
- if self.BUILD_TAG and re.search("daily", self.BUILD_TAG):
- self.CI_LOOP = "daily"
- else:
- self.CI_LOOP = "weekly"
+def get(env_var):
+ if env_var not in INPUTS.keys():
+ return os.environ.get(env_var, None)
+ return os.environ.get(env_var, INPUTS[env_var])
-ENV = Environment()
+def string():
+ msg = prettytable.PrettyTable(
+ header_style='upper', padding_width=5,
+ field_names=['env var', 'value'])
+ for env_var in INPUTS:
+ msg.add_row([env_var, get(env_var) if get(env_var) else ''])
+ return msg
diff --git a/functest/utils/functest_utils.py b/functest/utils/functest_utils.py
index 6d0b345d5..eec544489 100644
--- a/functest/utils/functest_utils.py
+++ b/functest/utils/functest_utils.py
@@ -6,194 +6,20 @@
# are made available under the terms of the Apache License, Version 2.0
# which accompanies this distribution, and is available at
# http://www.apache.org/licenses/LICENSE-2.0
-#
-import functools
-import json
+
+# pylint: disable=missing-docstring
+
+from __future__ import print_function
import logging
import os
-import pkg_resources
-import re
-import shutil
import subprocess
import sys
-import time
-from datetime import datetime as dt
-
-import dns.resolver
-import requests
-from six.moves import urllib
import yaml
-from functest.utils import constants
-from functest.utils import decorators
-from functest.utils.constants import CONST
-
-logger = logging.getLogger(__name__)
-
-
-# ----------------------------------------------------------
-#
-# INTERNET UTILS
-#
-# -----------------------------------------------------------
-def check_internet_connectivity(url='http://www.opnfv.org/'):
- """
- Check if there is access to the internet
- """
- try:
- urllib.request.urlopen(url, timeout=5)
- return True
- except urllib.error.URLError:
- return False
-
+from shade import _utils
+import six
-def download_url(url, dest_path):
- """
- Download a file to a destination path given a URL
- """
- name = url.rsplit('/')[-1]
- dest = dest_path + "/" + name
- try:
- response = urllib.request.urlopen(url)
- except (urllib.error.HTTPError, urllib.error.URLError):
- return False
-
- with open(dest, 'wb') as f:
- shutil.copyfileobj(response, f)
- return True
-
-
-# ----------------------------------------------------------
-#
-# CI UTILS
-#
-# -----------------------------------------------------------
-def get_version():
- """
- Get version
- """
- # Use the build tag to retrieve the version
- # By default version is unknown
- # if launched through CI the build tag has the following format
- # jenkins-<project>-<installer>-<pod>-<job>-<branch>-<id>
- # e.g. jenkins-functest-fuel-opnfv-jump-2-daily-master-190
- # jenkins-functest-fuel-baremetal-weekly-master-8
- # use regex to match branch info
- rule = "(dai|week)ly-(.+?)-[0-9]*"
- build_tag = CONST.__getattribute__('BUILD_TAG')
- if not build_tag:
- build_tag = 'none'
- m = re.search(rule, build_tag)
- if m:
- return m.group(2)
- else:
- return "unknown"
-
-
-@decorators.can_dump_request_to_file
-def push_results_to_db(project, case_name,
- start_date, stop_date, result, details):
- """
- POST results to the Result target DB
- """
- # Retrieve params from CI and conf
- if (hasattr(CONST, 'TEST_DB_URL')):
- url = CONST.__getattribute__('TEST_DB_URL')
- else:
- url = CONST.__getattribute__("results_test_db_url")
-
- try:
- installer = os.environ['INSTALLER_TYPE']
- scenario = os.environ['DEPLOY_SCENARIO']
- pod_name = os.environ['NODE_NAME']
- build_tag = os.environ['BUILD_TAG']
- except KeyError as e:
- logger.error("Please set env var: " + str(e))
- return False
- version = get_version()
- test_start = dt.fromtimestamp(start_date).strftime('%Y-%m-%d %H:%M:%S')
- test_stop = dt.fromtimestamp(stop_date).strftime('%Y-%m-%d %H:%M:%S')
-
- params = {"project_name": project, "case_name": case_name,
- "pod_name": pod_name, "installer": installer,
- "version": version, "scenario": scenario, "criteria": result,
- "build_tag": build_tag, "start_date": test_start,
- "stop_date": test_stop, "details": details}
-
- error = None
- headers = {'Content-Type': 'application/json'}
- try:
- r = requests.post(url, data=json.dumps(params, sort_keys=True),
- headers=headers)
- logger.debug(r)
- r.raise_for_status()
- except requests.RequestException as exc:
- if 'r' in locals():
- error = ("Pushing Result to DB(%s) failed: %s" %
- (r.url, r.content))
- else:
- error = ("Pushing Result to DB(%s) failed: %s" % (url, exc))
- except Exception as e:
- error = ("Error [push_results_to_db("
- "DB: '%(db)s', "
- "project: '%(project)s', "
- "case: '%(case)s', "
- "pod: '%(pod)s', "
- "version: '%(v)s', "
- "scenario: '%(s)s', "
- "criteria: '%(c)s', "
- "build_tag: '%(t)s', "
- "details: '%(d)s')]: "
- "%(error)s" %
- {
- 'db': url,
- 'project': project,
- 'case': case_name,
- 'pod': pod_name,
- 'v': version,
- 's': scenario,
- 'c': result,
- 't': build_tag,
- 'd': details,
- 'error': e
- })
- finally:
- if error:
- logger.error(error)
- return False
- return True
-
-
-def get_resolvconf_ns():
- """
- Get nameservers from current resolv.conf
- """
- nameservers = []
- rconf = open("/etc/resolv.conf", "r")
- line = rconf.readline()
- resolver = dns.resolver.Resolver()
- while line:
- ip = re.search(r"\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b", line)
- if ip:
- resolver.nameservers = [ip.group(0)]
- try:
- result = resolver.query('opnfv.org')[0]
- if result != "":
- nameservers.append(ip.group())
- except dns.exception.Timeout:
- pass
- line = rconf.readline()
- return nameservers
-
-
-def get_ci_envvars():
- """
- Get the CI env variables
- """
- ci_env_var = {
- "installer": os.environ.get('INSTALLER_TYPE'),
- "scenario": os.environ.get('DEPLOY_SCENARIO')}
- return ci_env_var
+LOGGER = logging.getLogger(__name__)
def execute_command_raise(cmd, info=False, error_msg="",
@@ -206,104 +32,194 @@ def execute_command_raise(cmd, info=False, error_msg="",
def execute_command(cmd, info=False, error_msg="",
verbose=True, output_file=None):
if not error_msg:
- error_msg = ("The command '%s' failed." % cmd)
- msg_exec = ("Executing command: '%s'" % cmd)
+ error_msg = f"The command '{cmd}' failed."
+ msg_exec = f"Executing command: '{cmd}'"
if verbose:
if info:
- logger.info(msg_exec)
+ LOGGER.info(msg_exec)
else:
- logger.debug(msg_exec)
- p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE,
- stderr=subprocess.STDOUT)
- if output_file:
- f = open(output_file, "w")
- for line in iter(p.stdout.readline, b''):
+ LOGGER.debug(msg_exec)
+ with subprocess.Popen(
+ cmd, shell=True, stdout=subprocess.PIPE,
+ stderr=subprocess.STDOUT) as popen:
if output_file:
- f.write(line)
- else:
- line = line.replace('\n', '')
- print(line)
- sys.stdout.flush()
- if output_file:
- f.close()
- p.stdout.close()
- returncode = p.wait()
+ with open(output_file, "w", encoding='utf-8') as ofd:
+ for line in iter(popen.stdout.readline, b''):
+ if output_file:
+ ofd.write(line.decode("utf-8"))
+ else:
+ line = line.decode("utf-8").replace('\n', '')
+ print(line)
+ sys.stdout.flush()
+ returncode = popen.wait()
if returncode != 0:
if verbose:
- logger.error(error_msg)
+ LOGGER.error(error_msg)
return returncode
-def get_dict_by_test(testname):
- with open(pkg_resources.resource_filename(
- 'functest', 'ci/testcases.yaml')) as f:
- testcases_yaml = yaml.safe_load(f)
-
- for dic_tier in testcases_yaml.get("tiers"):
- for dic_testcase in dic_tier['testcases']:
- if dic_testcase['case_name'] == testname:
- return dic_testcase
-
- logger.error('Project %s is not defined in testcases.yaml' % testname)
- return None
-
-
-def get_criteria_by_test(testname):
- dict = get_dict_by_test(testname)
- if dict:
- return dict['criteria']
- return None
-
-
-# ----------------------------------------------------------
-#
-# YAML UTILS
-#
-# -----------------------------------------------------------
-def get_parameter_from_yaml(parameter, file):
+def get_parameter_from_yaml(parameter, yfile):
"""
Returns the value of a given parameter in file.yaml
parameter must be given in string format with dots
Example: general.openstack.image_name
"""
- with open(file) as f:
- file_yaml = yaml.safe_load(f)
- f.close()
+ with open(yfile, encoding='utf-8') as yfd:
+ file_yaml = yaml.safe_load(yfd)
value = file_yaml
for element in parameter.split("."):
value = value.get(element)
if value is None:
- raise ValueError("The parameter %s is not defined in"
- " %s" % (parameter, file))
+ raise ValueError(f"The parameter {parameter} is not defined in"
+ f" {yfile}")
return value
-def get_functest_config(parameter):
- yaml_ = constants.CONST.__getattribute__('CONFIG_FUNCTEST_YAML')
- return get_parameter_from_yaml(parameter, yaml_)
+def get_nova_version(cloud):
+ """ Get Nova API microversion
+
+ Returns:
+
+ - Nova API microversion
+ - None on operation error
+ """
+ # pylint: disable=protected-access
+ try:
+ request = cloud._compute_client.request("/", "GET")
+ LOGGER.debug('cloud._compute_client.request: %s', request)
+ version = request["version"]["version"]
+ major, minor = version.split('.')
+ LOGGER.debug('nova version: %s', (int(major), int(minor)))
+ return (int(major), int(minor))
+ except Exception: # pylint: disable=broad-except
+ LOGGER.exception("Cannot detect Nova version")
+ return None
+
+
+def get_openstack_version(cloud):
+ """ Detect OpenStack version via Nova API microversion
+
+ It follows `MicroversionHistory
+ <https://docs.openstack.org/nova/latest/reference/api-microversion-history.html>`_.
+ Returns:
+
+ - OpenStack release
+ - Unknown on operation error
+ """
+ # pylint: disable=too-many-branches
+ version = get_nova_version(cloud)
+ try:
+ assert version
+ if version > (2, 93):
+ osversion = "Master"
+ elif version > (2, 90):
+ osversion = "Zed"
+ elif version > (2, 88):
+ osversion = "Xena"
+ elif version > (2, 87):
+ osversion = "Wallaby"
+ elif version > (2, 79):
+ osversion = "Ussuri"
+ elif version > (2, 72):
+ osversion = "Train"
+ elif version > (2, 65):
+ osversion = "Stein"
+ elif version > (2, 60):
+ osversion = "Rocky"
+ elif version > (2, 53):
+ osversion = "Queens"
+ elif version > (2, 42):
+ osversion = "Pike"
+ elif version > (2, 38):
+ osversion = "Ocata"
+ elif version > (2, 25):
+ osversion = "Newton"
+ elif version > (2, 12):
+ osversion = "Mitaka"
+ elif version > (2, 3):
+ osversion = "Liberty"
+ elif version >= (2, 1):
+ osversion = "Kilo"
+ else:
+ osversion = "Unknown"
+ LOGGER.info('Detect OpenStack version: %s', osversion)
+ return osversion
+ except AssertionError:
+ LOGGER.exception("Cannot detect OpenStack version")
+ return "Unknown"
-def get_functest_yaml():
- with open(constants.CONST.__getattribute__('CONFIG_FUNCTEST_YAML')) as f:
- functest_yaml = yaml.safe_load(f)
- f.close()
- return functest_yaml
+def list_services(cloud):
+ # pylint: disable=protected-access
+ """Search Keystone services via $OS_INTERFACE.
-def print_separator():
- logger.info("==============================================")
+ It mainly conforms with `Shade
+ <https://docs.openstack.org/shade/latest>`_ but allows testing vs
+ public endpoints. It's worth mentioning that it doesn't support keystone
+ v2.
+
+ :returns: a list of ``munch.Munch`` containing the services description
+
+ :raises: ``OpenStackCloudException`` if something goes wrong during the
+ openstack API call.
+ """
+ url, key = '/services', 'services'
+ data = cloud._identity_client.get(
+ url, endpoint_filter={
+ 'interface': os.environ.get('OS_INTERFACE', 'public')},
+ error_message="Failed to list services")
+ services = cloud._get_and_munchify(key, data)
+ return _utils.normalize_keystone_services(services)
+
+
+def search_services(cloud, name_or_id=None, filters=None):
+ # pylint: disable=protected-access
+ """Search Keystone services ia $OS_INTERFACE.
+
+ It mainly conforms with `Shade
+ <https://docs.openstack.org/shade/latest>`_ but allows testing vs
+ public endpoints. It's worth mentioning that it doesn't support keystone
+ v2.
+
+ :param name_or_id: Name or id of the desired service.
+ :param filters: a dict containing additional filters to use. e.g.
+ {'type': 'network'}.
+
+ :returns: a list of ``munch.Munch`` containing the services description
+
+ :raises: ``OpenStackCloudException`` if something goes wrong during the
+ openstack API call.
+ """
+ services = list_services(cloud)
+ return _utils._filter_list(services, name_or_id, filters)
+
+
+def convert_dict_to_ini(value):
+ "Convert dict to oslo.conf input"
+ assert isinstance(value, dict)
+ return ",".join(f"{key}:{val}" for (key, val) in six.iteritems(value))
+
+
+def convert_list_to_ini(value):
+ "Convert list to oslo.conf input"
+ assert isinstance(value, list)
+ return ",".join(val for val in value)
+
+
+def convert_ini_to_dict(value):
+ "Convert oslo.conf input to dict"
+ assert isinstance(value, str)
+ try:
+ return dict((x.rsplit(':', 1) for x in value.split(',')))
+ except ValueError:
+ return {}
-def timethis(func):
- """Measure the time it takes for a function to complete"""
- @functools.wraps(func)
- def timed(*args, **kwargs):
- ts = time.time()
- result = func(*args, **kwargs)
- te = time.time()
- elapsed = '{0}'.format(te - ts)
- logger.info('{f}(*{a}, **{kw}) took: {t} sec'.format(
- f=func.__name__, a=args, kw=kwargs, t=elapsed))
- return result, elapsed
- return timed
+def convert_ini_to_list(value):
+ "Convert list to oslo.conf input"
+ assert isinstance(value, str)
+ if not value:
+ return []
+ return list(value.split(','))
diff --git a/functest/utils/functest_vacation.py b/functest/utils/functest_vacation.py
deleted file mode 100644
index 71861ba7c..000000000
--- a/functest/utils/functest_vacation.py
+++ /dev/null
@@ -1,53 +0,0 @@
-from os import environ
-from curses import initscr, curs_set, newwin, endwin
-from curses import KEY_RIGHT, KEY_LEFT, KEY_DOWN, KEY_UP
-from random import randrange
-
-
-def main():
- environ["TERM"] = 'Eterm'
- initscr()
- curs_set(0)
- try:
- win = newwin(16, 60, 0, 0)
- win.keypad(True)
- win.nodelay(True)
- win.border('|', '|', '-', '-', '+', '+', '+', '+')
- win.addch(4, 44, '@')
- win.addstr(0, 5, ' Eat all the OPNFV bugs by FunTest! ')
- win.addstr(15, 7, ' Left,Right,Up,Down: move; other keys: quit ')
- snake = [[20, 7], [19, 7], [18, 7], [17, 7],
- [16, 7], [15, 7], [14, 7], [13, 7]]
- key = KEY_RIGHT
- body = '~FUNTEST'
- ind = 0
- while key != 27:
- win.addstr(0, 44, ' Score: ' + str(len(snake) - len(body)) + ' ')
- win.timeout(140 - 2 * len(snake))
- getkey = win.getch()
- key = key if getkey == -1 else getkey
- snake.insert(
- 0, [snake[0][0] + (key == KEY_RIGHT and 1 or
- key == KEY_LEFT and -1),
- snake[0][1] + (key == KEY_DOWN and 1 or
- key == KEY_UP and -1)])
- win.addch(snake[len(snake) - 1][1], snake[len(snake) - 1][0], ' ')
- if win.inch(snake[0][1], snake[0][0]) & 255 == 32:
- snake.pop()
- elif win.inch(snake[0][1], snake[0][0]) & 255 == ord('@'):
- c = [n for n in [[randrange(1, 58, 1), randrange(1, 14, 1)]
- for x in range(len(snake))] if n not in snake]
- win.addch(c == [] and 4 or c[0][1],
- c == [] and 44 or c[0][0], '@')
- else:
- break
- ind += 1
- win.addch(snake[0][1], snake[0][0], body[ind % len(body)])
- finally:
- endwin()
-
- print('\nSnake.PY-26ines by Kris Cieslak (defaultset.blogspot.com).')
- print('OPNFV adaptation by Functest dream team.')
- score = str(len(snake) - len(body) - 1)
- print ('Thanks for playing, your score: %s.' % score)
- print('Find and fix more bugs in your real OPNFV setup!\n')
diff --git a/functest/utils/openstack_utils.py b/functest/utils/openstack_utils.py
deleted file mode 100644
index 1d7cdafb9..000000000
--- a/functest/utils/openstack_utils.py
+++ /dev/null
@@ -1,1499 +0,0 @@
-#!/usr/bin/env python
-#
-# jose.lausuch@ericsson.com
-# valentin.boucher@orange.com
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-
-import logging
-import os.path
-import re
-import sys
-import time
-
-from keystoneauth1 import loading
-from keystoneauth1 import session
-from cinderclient import client as cinderclient
-from glanceclient import client as glanceclient
-from heatclient import client as heatclient
-from novaclient import client as novaclient
-from keystoneclient import client as keystoneclient
-from neutronclient.neutron import client as neutronclient
-
-from functest.utils.constants import CONST
-import functest.utils.functest_utils as ft_utils
-
-logger = logging.getLogger(__name__)
-
-DEFAULT_API_VERSION = '2'
-DEFAULT_HEAT_API_VERSION = '1'
-
-
-# *********************************************
-# CREDENTIALS
-# *********************************************
-class MissingEnvVar(Exception):
-
- def __init__(self, var):
- self.var = var
-
- def __str__(self):
- return str.format("Please set the mandatory env var: {}", self.var)
-
-
-def is_keystone_v3():
- keystone_api_version = os.getenv('OS_IDENTITY_API_VERSION')
- if (keystone_api_version is None or
- keystone_api_version == '2'):
- return False
- else:
- return True
-
-
-def get_rc_env_vars():
- env_vars = ['OS_AUTH_URL', 'OS_USERNAME', 'OS_PASSWORD']
- if is_keystone_v3():
- env_vars.extend(['OS_PROJECT_NAME',
- 'OS_USER_DOMAIN_NAME',
- 'OS_PROJECT_DOMAIN_NAME'])
- else:
- env_vars.extend(['OS_TENANT_NAME'])
- return env_vars
-
-
-def check_credentials():
- """
- Check if the OpenStack credentials (openrc) are sourced
- """
- env_vars = get_rc_env_vars()
- return all(map(lambda v: v in os.environ and os.environ[v], env_vars))
-
-
-def get_env_cred_dict():
- env_cred_dict = {
- 'OS_USERNAME': 'username',
- 'OS_PASSWORD': 'password',
- 'OS_AUTH_URL': 'auth_url',
- 'OS_TENANT_NAME': 'tenant_name',
- 'OS_USER_DOMAIN_NAME': 'user_domain_name',
- 'OS_PROJECT_DOMAIN_NAME': 'project_domain_name',
- 'OS_PROJECT_NAME': 'project_name',
- 'OS_ENDPOINT_TYPE': 'endpoint_type',
- 'OS_REGION_NAME': 'region_name',
- 'OS_CACERT': 'https_cacert',
- 'OS_INSECURE': 'https_insecure'
- }
- return env_cred_dict
-
-
-def get_credentials(other_creds={}):
- """Returns a creds dictionary filled with parsed from env
- """
- creds = {}
- env_vars = get_rc_env_vars()
- env_cred_dict = get_env_cred_dict()
-
- for envvar in env_vars:
- if os.getenv(envvar) is None:
- raise MissingEnvVar(envvar)
- else:
- creds_key = env_cred_dict.get(envvar)
- creds.update({creds_key: os.getenv(envvar)})
-
- if 'tenant' in other_creds.keys():
- if is_keystone_v3():
- tenant = 'project_name'
- else:
- tenant = 'tenant_name'
- other_creds[tenant] = other_creds.pop('tenant')
-
- creds.update(other_creds)
-
- return creds
-
-
-def source_credentials(rc_file):
- with open(rc_file, "r") as f:
- for line in f:
- var = (line.rstrip('"\n').replace('export ', '').split("=")
- if re.search(r'(.*)=(.*)', line) else None)
- # The two next lines should be modified as soon as rc_file
- # conforms with common rules. Be aware that it could induce
- # issues if value starts with '
- if var:
- key = re.sub(r'^["\' ]*|[ \'"]*$', '', var[0])
- value = re.sub(r'^["\' ]*|[ \'"]*$', '', "".join(var[1:]))
- os.environ[key] = value
- CONST.__setattr__(key, value)
-
-
-def get_session_auth(other_creds={}):
- loader = loading.get_plugin_loader('password')
- creds = get_credentials(other_creds)
- auth = loader.load_from_options(**creds)
- return auth
-
-
-def get_endpoint(service_type, interface='public'):
- auth = get_session_auth()
- return get_session().get_endpoint(auth=auth,
- service_type=service_type,
- interface=interface)
-
-
-def get_session(other_creds={}):
- auth = get_session_auth(other_creds)
- https_cacert = os.getenv('OS_CACERT', '')
- https_insecure = os.getenv('OS_INSECURE', '').lower() == 'true'
- return session.Session(auth=auth,
- verify=(https_cacert or not https_insecure))
-
-
-# *********************************************
-# CLIENTS
-# *********************************************
-def get_keystone_client_version():
- api_version = os.getenv('OS_IDENTITY_API_VERSION')
- if api_version is not None:
- logger.info("OS_IDENTITY_API_VERSION is set in env as '%s'",
- api_version)
- return api_version
- return DEFAULT_API_VERSION
-
-
-def get_keystone_client(other_creds={}):
- sess = get_session(other_creds)
- return keystoneclient.Client(get_keystone_client_version(),
- session=sess,
- interface=os.getenv('OS_INTERFACE', 'admin'))
-
-
-def get_nova_client_version():
- api_version = os.getenv('OS_COMPUTE_API_VERSION')
- if api_version is not None:
- logger.info("OS_COMPUTE_API_VERSION is set in env as '%s'",
- api_version)
- return api_version
- return DEFAULT_API_VERSION
-
-
-def get_nova_client(other_creds={}):
- sess = get_session(other_creds)
- return novaclient.Client(get_nova_client_version(), session=sess)
-
-
-def get_cinder_client_version():
- api_version = os.getenv('OS_VOLUME_API_VERSION')
- if api_version is not None:
- logger.info("OS_VOLUME_API_VERSION is set in env as '%s'",
- api_version)
- return api_version
- return DEFAULT_API_VERSION
-
-
-def get_cinder_client(other_creds={}):
- sess = get_session(other_creds)
- return cinderclient.Client(get_cinder_client_version(), session=sess)
-
-
-def get_neutron_client_version():
- api_version = os.getenv('OS_NETWORK_API_VERSION')
- if api_version is not None:
- logger.info("OS_NETWORK_API_VERSION is set in env as '%s'",
- api_version)
- return api_version
- return DEFAULT_API_VERSION
-
-
-def get_neutron_client(other_creds={}):
- sess = get_session(other_creds)
- return neutronclient.Client(get_neutron_client_version(), session=sess)
-
-
-def get_glance_client_version():
- api_version = os.getenv('OS_IMAGE_API_VERSION')
- if api_version is not None:
- logger.info("OS_IMAGE_API_VERSION is set in env as '%s'", api_version)
- return api_version
- return DEFAULT_API_VERSION
-
-
-def get_glance_client(other_creds={}):
- sess = get_session(other_creds)
- return glanceclient.Client(get_glance_client_version(), session=sess)
-
-
-def get_heat_client_version():
- api_version = os.getenv('OS_ORCHESTRATION_API_VERSION')
- if api_version is not None:
- logger.info("OS_ORCHESTRATION_API_VERSION is set in env as '%s'",
- api_version)
- return api_version
- return DEFAULT_HEAT_API_VERSION
-
-
-def get_heat_client(other_creds={}):
- sess = get_session(other_creds)
- return heatclient.Client(get_heat_client_version(), session=sess)
-
-
-def download_and_add_image_on_glance(glance, image_name, image_url, data_dir):
- try:
- dest_path = data_dir
- if not os.path.exists(dest_path):
- os.makedirs(dest_path)
- file_name = image_url.rsplit('/')[-1]
- if not ft_utils.download_url(image_url, dest_path):
- return False
- except Exception:
- raise Exception("Impossible to download image from {}".format(
- image_url))
-
- try:
- image = create_glance_image(
- glance, image_name, dest_path + file_name)
- if not image:
- return False
- else:
- return image
- except Exception:
- raise Exception("Impossible to put image {} in glance".format(
- image_name))
-
-
-# *********************************************
-# NOVA
-# *********************************************
-def get_instances(nova_client):
- try:
- instances = nova_client.servers.list(search_opts={'all_tenants': 1})
- return instances
- except Exception as e:
- logger.error("Error [get_instances(nova_client)]: %s" % e)
- return None
-
-
-def get_instance_status(nova_client, instance):
- try:
- instance = nova_client.servers.get(instance.id)
- return instance.status
- except Exception as e:
- logger.error("Error [get_instance_status(nova_client)]: %s" % e)
- return None
-
-
-def get_instance_by_name(nova_client, instance_name):
- try:
- instance = nova_client.servers.find(name=instance_name)
- return instance
- except Exception as e:
- logger.error("Error [get_instance_by_name(nova_client, '%s')]: %s"
- % (instance_name, e))
- return None
-
-
-def get_flavor_id(nova_client, flavor_name):
- flavors = nova_client.flavors.list(detailed=True)
- id = ''
- for f in flavors:
- if f.name == flavor_name:
- id = f.id
- break
- return id
-
-
-def get_flavor_id_by_ram_range(nova_client, min_ram, max_ram):
- flavors = nova_client.flavors.list(detailed=True)
- id = ''
- for f in flavors:
- if min_ram <= f.ram and f.ram <= max_ram:
- id = f.id
- break
- return id
-
-
-def get_aggregates(nova_client):
- try:
- aggregates = nova_client.aggregates.list()
- return aggregates
- except Exception as e:
- logger.error("Error [get_aggregates(nova_client)]: %s" % e)
- return None
-
-
-def get_aggregate_id(nova_client, aggregate_name):
- try:
- aggregates = get_aggregates(nova_client)
- _id = [ag.id for ag in aggregates if ag.name == aggregate_name][0]
- return _id
- except Exception as e:
- logger.error("Error [get_aggregate_id(nova_client, %s)]:"
- " %s" % (aggregate_name, e))
- return None
-
-
-def get_availability_zones(nova_client):
- try:
- availability_zones = nova_client.availability_zones.list()
- return availability_zones
- except Exception as e:
- logger.error("Error [get_availability_zones(nova_client)]: %s" % e)
- return None
-
-
-def get_availability_zone_names(nova_client):
- try:
- az_names = [az.zoneName for az in get_availability_zones(nova_client)]
- return az_names
- except Exception as e:
- logger.error("Error [get_availability_zone_names(nova_client)]:"
- " %s" % e)
- return None
-
-
-def create_flavor(nova_client, flavor_name, ram, disk, vcpus, public=True):
- try:
- flavor = nova_client.flavors.create(
- flavor_name, ram, vcpus, disk, is_public=public)
- try:
- extra_specs = ft_utils.get_functest_config(
- 'general.flavor_extra_specs')
- flavor.set_keys(extra_specs)
- except ValueError:
- # flavor extra specs are not configured, therefore skip the update
- pass
-
- except Exception as e:
- logger.error("Error [create_flavor(nova_client, '%s', '%s', '%s', "
- "'%s')]: %s" % (flavor_name, ram, disk, vcpus, e))
- return None
- return flavor.id
-
-
-def get_or_create_flavor(flavor_name, ram, disk, vcpus, public=True):
- flavor_exists = False
- nova_client = get_nova_client()
-
- flavor_id = get_flavor_id(nova_client, flavor_name)
- if flavor_id != '':
- logger.info("Using existing flavor '%s'..." % flavor_name)
- flavor_exists = True
- else:
- logger.info("Creating flavor '%s' with '%s' RAM, '%s' disk size, "
- "'%s' vcpus..." % (flavor_name, ram, disk, vcpus))
- flavor_id = create_flavor(
- nova_client, flavor_name, ram, disk, vcpus, public=public)
- if not flavor_id:
- raise Exception("Failed to create flavor '%s'..." % (flavor_name))
- else:
- logger.debug("Flavor '%s' with ID=%s created successfully."
- % (flavor_name, flavor_id))
-
- return flavor_exists, flavor_id
-
-
-def get_floating_ips(neutron_client):
- try:
- floating_ips = neutron_client.list_floatingips()
- return floating_ips['floatingips']
- except Exception as e:
- logger.error("Error [get_floating_ips(neutron_client)]: %s" % e)
- return None
-
-
-def get_hypervisors(nova_client):
- try:
- nodes = []
- hypervisors = nova_client.hypervisors.list()
- for hypervisor in hypervisors:
- if hypervisor.state == "up":
- nodes.append(hypervisor.hypervisor_hostname)
- return nodes
- except Exception as e:
- logger.error("Error [get_hypervisors(nova_client)]: %s" % e)
- return None
-
-
-def create_aggregate(nova_client, aggregate_name, av_zone):
- try:
- nova_client.aggregates.create(aggregate_name, av_zone)
- return True
- except Exception as e:
- logger.error("Error [create_aggregate(nova_client, %s, %s)]: %s"
- % (aggregate_name, av_zone, e))
- return None
-
-
-def add_host_to_aggregate(nova_client, aggregate_name, compute_host):
- try:
- aggregate_id = get_aggregate_id(nova_client, aggregate_name)
- nova_client.aggregates.add_host(aggregate_id, compute_host)
- return True
- except Exception as e:
- logger.error("Error [add_host_to_aggregate(nova_client, %s, %s)]: %s"
- % (aggregate_name, compute_host, e))
- return None
-
-
-def create_aggregate_with_host(
- nova_client, aggregate_name, av_zone, compute_host):
- try:
- create_aggregate(nova_client, aggregate_name, av_zone)
- add_host_to_aggregate(nova_client, aggregate_name, compute_host)
- return True
- except Exception as e:
- logger.error("Error [create_aggregate_with_host("
- "nova_client, %s, %s, %s)]: %s"
- % (aggregate_name, av_zone, compute_host, e))
- return None
-
-
-def create_instance(flavor_name,
- image_id,
- network_id,
- instance_name="functest-vm",
- confdrive=True,
- userdata=None,
- av_zone='',
- fixed_ip=None,
- files=None):
- nova_client = get_nova_client()
- try:
- flavor = nova_client.flavors.find(name=flavor_name)
- except:
- flavors = nova_client.flavors.list()
- logger.error("Error: Flavor '%s' not found. Available flavors are: "
- "\n%s" % (flavor_name, flavors))
- return None
- if fixed_ip is not None:
- nics = {"net-id": network_id, "v4-fixed-ip": fixed_ip}
- else:
- nics = {"net-id": network_id}
- if userdata is None:
- instance = nova_client.servers.create(
- name=instance_name,
- flavor=flavor,
- image=image_id,
- nics=[nics],
- availability_zone=av_zone,
- files=files
- )
- else:
- instance = nova_client.servers.create(
- name=instance_name,
- flavor=flavor,
- image=image_id,
- nics=[nics],
- config_drive=confdrive,
- userdata=userdata,
- availability_zone=av_zone,
- files=files
- )
- return instance
-
-
-def create_instance_and_wait_for_active(flavor_name,
- image_id,
- network_id,
- instance_name="",
- config_drive=False,
- userdata="",
- av_zone='',
- fixed_ip=None,
- files=None):
- SLEEP = 3
- VM_BOOT_TIMEOUT = 180
- nova_client = get_nova_client()
- instance = create_instance(flavor_name,
- image_id,
- network_id,
- instance_name,
- config_drive,
- userdata,
- av_zone=av_zone,
- fixed_ip=fixed_ip,
- files=files)
- count = VM_BOOT_TIMEOUT / SLEEP
- for n in range(count, -1, -1):
- status = get_instance_status(nova_client, instance)
- if status.lower() == "active":
- return instance
- elif status.lower() == "error":
- logger.error("The instance %s went to ERROR status."
- % instance_name)
- return None
- time.sleep(SLEEP)
- logger.error("Timeout booting the instance %s." % instance_name)
- return None
-
-
-def create_floating_ip(neutron_client):
- extnet_id = get_external_net_id(neutron_client)
- props = {'floating_network_id': extnet_id}
- try:
- ip_json = neutron_client.create_floatingip({'floatingip': props})
- fip_addr = ip_json['floatingip']['floating_ip_address']
- fip_id = ip_json['floatingip']['id']
- except Exception as e:
- logger.error("Error [create_floating_ip(neutron_client)]: %s" % e)
- return None
- return {'fip_addr': fip_addr, 'fip_id': fip_id}
-
-
-def add_floating_ip(nova_client, server_id, floatingip_addr):
- try:
- nova_client.servers.add_floating_ip(server_id, floatingip_addr)
- return True
- except Exception as e:
- logger.error("Error [add_floating_ip(nova_client, '%s', '%s')]: %s"
- % (server_id, floatingip_addr, e))
- return False
-
-
-def delete_instance(nova_client, instance_id):
- try:
- nova_client.servers.force_delete(instance_id)
- return True
- except Exception as e:
- logger.error("Error [delete_instance(nova_client, '%s')]: %s"
- % (instance_id, e))
- return False
-
-
-def delete_floating_ip(neutron_client, floatingip_id):
- try:
- neutron_client.delete_floatingip(floatingip_id)
- return True
- except Exception as e:
- logger.error("Error [delete_floating_ip(neutron_client, '%s')]: %s"
- % (floatingip_id, e))
- return False
-
-
-def remove_host_from_aggregate(nova_client, aggregate_name, compute_host):
- try:
- aggregate_id = get_aggregate_id(nova_client, aggregate_name)
- nova_client.aggregates.remove_host(aggregate_id, compute_host)
- return True
- except Exception as e:
- logger.error("Error [remove_host_from_aggregate(nova_client, %s, %s)]:"
- " %s" % (aggregate_name, compute_host, e))
- return False
-
-
-def remove_hosts_from_aggregate(nova_client, aggregate_name):
- aggregate_id = get_aggregate_id(nova_client, aggregate_name)
- hosts = nova_client.aggregates.get(aggregate_id).hosts
- assert(
- all(remove_host_from_aggregate(nova_client, aggregate_name, host)
- for host in hosts))
-
-
-def delete_aggregate(nova_client, aggregate_name):
- try:
- remove_hosts_from_aggregate(nova_client, aggregate_name)
- nova_client.aggregates.delete(aggregate_name)
- return True
- except Exception as e:
- logger.error("Error [delete_aggregate(nova_client, %s)]: %s"
- % (aggregate_name, e))
- return False
-
-
-# *********************************************
-# NEUTRON
-# *********************************************
-def get_network_list(neutron_client):
- network_list = neutron_client.list_networks()['networks']
- if len(network_list) == 0:
- return None
- else:
- return network_list
-
-
-def get_router_list(neutron_client):
- router_list = neutron_client.list_routers()['routers']
- if len(router_list) == 0:
- return None
- else:
- return router_list
-
-
-def get_port_list(neutron_client):
- port_list = neutron_client.list_ports()['ports']
- if len(port_list) == 0:
- return None
- else:
- return port_list
-
-
-def get_network_id(neutron_client, network_name):
- networks = neutron_client.list_networks()['networks']
- id = ''
- for n in networks:
- if n['name'] == network_name:
- id = n['id']
- break
- return id
-
-
-def get_subnet_id(neutron_client, subnet_name):
- subnets = neutron_client.list_subnets()['subnets']
- id = ''
- for s in subnets:
- if s['name'] == subnet_name:
- id = s['id']
- break
- return id
-
-
-def get_router_id(neutron_client, router_name):
- routers = neutron_client.list_routers()['routers']
- id = ''
- for r in routers:
- if r['name'] == router_name:
- id = r['id']
- break
- return id
-
-
-def get_private_net(neutron_client):
- # Checks if there is an existing shared private network
- networks = neutron_client.list_networks()['networks']
- if len(networks) == 0:
- return None
- for net in networks:
- if (net['router:external'] is False) and (net['shared'] is True):
- return net
- return None
-
-
-def get_external_net(neutron_client):
- if (hasattr(CONST, 'EXTERNAL_NETWORK')):
- return CONST.__getattribute__('EXTERNAL_NETWORK')
- for network in neutron_client.list_networks()['networks']:
- if network['router:external']:
- return network['name']
- return None
-
-
-def get_external_net_id(neutron_client):
- if (hasattr(CONST, 'EXTERNAL_NETWORK')):
- networks = neutron_client.list_networks(
- name=CONST.__getattribute__('EXTERNAL_NETWORK'))
- net_id = networks['networks'][0]['id']
- return net_id
- for network in neutron_client.list_networks()['networks']:
- if network['router:external']:
- return network['id']
- return None
-
-
-def check_neutron_net(neutron_client, net_name):
- for network in neutron_client.list_networks()['networks']:
- if network['name'] == net_name:
- for subnet in network['subnets']:
- return True
- return False
-
-
-def create_neutron_net(neutron_client, name):
- json_body = {'network': {'name': name,
- 'admin_state_up': True}}
- try:
- network = neutron_client.create_network(body=json_body)
- network_dict = network['network']
- return network_dict['id']
- except Exception as e:
- logger.error("Error [create_neutron_net(neutron_client, '%s')]: %s"
- % (name, e))
- return None
-
-
-def create_neutron_subnet(neutron_client, name, cidr, net_id,
- dns=['8.8.8.8', '8.8.4.4']):
- json_body = {'subnets': [{'name': name, 'cidr': cidr,
- 'ip_version': 4, 'network_id': net_id,
- 'dns_nameservers': dns}]}
-
- try:
- subnet = neutron_client.create_subnet(body=json_body)
- return subnet['subnets'][0]['id']
- except Exception as e:
- logger.error("Error [create_neutron_subnet(neutron_client, '%s', "
- "'%s', '%s')]: %s" % (name, cidr, net_id, e))
- return None
-
-
-def create_neutron_router(neutron_client, name):
- json_body = {'router': {'name': name, 'admin_state_up': True}}
- try:
- router = neutron_client.create_router(json_body)
- return router['router']['id']
- except Exception as e:
- logger.error("Error [create_neutron_router(neutron_client, '%s')]: %s"
- % (name, e))
- return None
-
-
-def create_neutron_port(neutron_client, name, network_id, ip):
- json_body = {'port': {
- 'admin_state_up': True,
- 'name': name,
- 'network_id': network_id,
- 'fixed_ips': [{"ip_address": ip}]
- }}
- try:
- port = neutron_client.create_port(body=json_body)
- return port['port']['id']
- except Exception as e:
- logger.error("Error [create_neutron_port(neutron_client, '%s', '%s', "
- "'%s')]: %s" % (name, network_id, ip, e))
- return None
-
-
-def update_neutron_net(neutron_client, network_id, shared=False):
- json_body = {'network': {'shared': shared}}
- try:
- neutron_client.update_network(network_id, body=json_body)
- return True
- except Exception as e:
- logger.error("Error [update_neutron_net(neutron_client, '%s', '%s')]: "
- "%s" % (network_id, str(shared), e))
- return False
-
-
-def update_neutron_port(neutron_client, port_id, device_owner):
- json_body = {'port': {
- 'device_owner': device_owner,
- }}
- try:
- port = neutron_client.update_port(port=port_id,
- body=json_body)
- return port['port']['id']
- except Exception as e:
- logger.error("Error [update_neutron_port(neutron_client, '%s', '%s')]:"
- " %s" % (port_id, device_owner, e))
- return None
-
-
-def add_interface_router(neutron_client, router_id, subnet_id):
- json_body = {"subnet_id": subnet_id}
- try:
- neutron_client.add_interface_router(router=router_id, body=json_body)
- return True
- except Exception as e:
- logger.error("Error [add_interface_router(neutron_client, '%s', "
- "'%s')]: %s" % (router_id, subnet_id, e))
- return False
-
-
-def add_gateway_router(neutron_client, router_id):
- ext_net_id = get_external_net_id(neutron_client)
- router_dict = {'network_id': ext_net_id}
- try:
- neutron_client.add_gateway_router(router_id, router_dict)
- return True
- except Exception as e:
- logger.error("Error [add_gateway_router(neutron_client, '%s')]: %s"
- % (router_id, e))
- return False
-
-
-def delete_neutron_net(neutron_client, network_id):
- try:
- neutron_client.delete_network(network_id)
- return True
- except Exception as e:
- logger.error("Error [delete_neutron_net(neutron_client, '%s')]: %s"
- % (network_id, e))
- return False
-
-
-def delete_neutron_subnet(neutron_client, subnet_id):
- try:
- neutron_client.delete_subnet(subnet_id)
- return True
- except Exception as e:
- logger.error("Error [delete_neutron_subnet(neutron_client, '%s')]: %s"
- % (subnet_id, e))
- return False
-
-
-def delete_neutron_router(neutron_client, router_id):
- try:
- neutron_client.delete_router(router=router_id)
- return True
- except Exception as e:
- logger.error("Error [delete_neutron_router(neutron_client, '%s')]: %s"
- % (router_id, e))
- return False
-
-
-def delete_neutron_port(neutron_client, port_id):
- try:
- neutron_client.delete_port(port_id)
- return True
- except Exception as e:
- logger.error("Error [delete_neutron_port(neutron_client, '%s')]: %s"
- % (port_id, e))
- return False
-
-
-def remove_interface_router(neutron_client, router_id, subnet_id):
- json_body = {"subnet_id": subnet_id}
- try:
- neutron_client.remove_interface_router(router=router_id,
- body=json_body)
- return True
- except Exception as e:
- logger.error("Error [remove_interface_router(neutron_client, '%s', "
- "'%s')]: %s" % (router_id, subnet_id, e))
- return False
-
-
-def remove_gateway_router(neutron_client, router_id):
- try:
- neutron_client.remove_gateway_router(router_id)
- return True
- except Exception as e:
- logger.error("Error [remove_gateway_router(neutron_client, '%s')]: %s"
- % (router_id, e))
- return False
-
-
-def create_network_full(neutron_client,
- net_name,
- subnet_name,
- router_name,
- cidr,
- dns=['8.8.8.8', '8.8.4.4']):
-
- # Check if the network already exists
- network_id = get_network_id(neutron_client, net_name)
- subnet_id = get_subnet_id(neutron_client, subnet_name)
- router_id = get_router_id(neutron_client, router_name)
-
- if network_id != '' and subnet_id != '' and router_id != '':
- logger.info("A network with name '%s' already exists..." % net_name)
- else:
- neutron_client.format = 'json'
- logger.info('Creating neutron network %s...' % net_name)
- network_id = create_neutron_net(neutron_client, net_name)
-
- if not network_id:
- return False
-
- logger.debug("Network '%s' created successfully" % network_id)
- logger.debug('Creating Subnet....')
- subnet_id = create_neutron_subnet(neutron_client, subnet_name,
- cidr, network_id, dns)
- if not subnet_id:
- return None
-
- logger.debug("Subnet '%s' created successfully" % subnet_id)
- logger.debug('Creating Router...')
- router_id = create_neutron_router(neutron_client, router_name)
-
- if not router_id:
- return None
-
- logger.debug("Router '%s' created successfully" % router_id)
- logger.debug('Adding router to subnet...')
-
- if not add_interface_router(neutron_client, router_id, subnet_id):
- return None
-
- logger.debug("Interface added successfully.")
-
- logger.debug('Adding gateway to router...')
- if not add_gateway_router(neutron_client, router_id):
- return None
-
- logger.debug("Gateway added successfully.")
-
- network_dic = {'net_id': network_id,
- 'subnet_id': subnet_id,
- 'router_id': router_id}
- return network_dic
-
-
-def create_shared_network_full(net_name, subnt_name, router_name, subnet_cidr):
- neutron_client = get_neutron_client()
-
- network_dic = create_network_full(neutron_client,
- net_name,
- subnt_name,
- router_name,
- subnet_cidr)
- if network_dic:
- if not update_neutron_net(neutron_client,
- network_dic['net_id'],
- shared=True):
- logger.error("Failed to update network %s..." % net_name)
- return None
- else:
- logger.debug("Network '%s' is available..." % net_name)
- else:
- logger.error("Network %s creation failed" % net_name)
- return None
- return network_dic
-
-
-# *********************************************
-# SEC GROUPS
-# *********************************************
-
-
-def get_security_groups(neutron_client):
- try:
- security_groups = neutron_client.list_security_groups()[
- 'security_groups']
- return security_groups
- except Exception as e:
- logger.error("Error [get_security_groups(neutron_client)]: %s" % e)
- return None
-
-
-def get_security_group_id(neutron_client, sg_name):
- security_groups = get_security_groups(neutron_client)
- id = ''
- for sg in security_groups:
- if sg['name'] == sg_name:
- id = sg['id']
- break
- return id
-
-
-def create_security_group(neutron_client, sg_name, sg_description):
- json_body = {'security_group': {'name': sg_name,
- 'description': sg_description}}
- try:
- secgroup = neutron_client.create_security_group(json_body)
- return secgroup['security_group']
- except Exception as e:
- logger.error("Error [create_security_group(neutron_client, '%s', "
- "'%s')]: %s" % (sg_name, sg_description, e))
- return None
-
-
-def create_secgroup_rule(neutron_client, sg_id, direction, protocol,
- port_range_min=None, port_range_max=None):
- # We create a security group in 2 steps
- # 1 - we check the format and set the json body accordingly
- # 2 - we call neturon client to create the security group
-
- # Format check
- json_body = {'security_group_rule': {'direction': direction,
- 'security_group_id': sg_id,
- 'protocol': protocol}}
- # parameters may be
- # - both None => we do nothing
- # - both Not None => we add them to the json description
- # but one cannot be None is the other is not None
- if (port_range_min is not None and port_range_max is not None):
- # add port_range in json description
- json_body['security_group_rule']['port_range_min'] = port_range_min
- json_body['security_group_rule']['port_range_max'] = port_range_max
- logger.debug("Security_group format set (port range included)")
- else:
- # either both port range are set to None => do nothing
- # or one is set but not the other => log it and return False
- if port_range_min is None and port_range_max is None:
- logger.debug("Security_group format set (no port range mentioned)")
- else:
- logger.error("Bad security group format."
- "One of the port range is not properly set:"
- "range min: {},"
- "range max: {}".format(port_range_min,
- port_range_max))
- return False
-
- # Create security group using neutron client
- try:
- neutron_client.create_security_group_rule(json_body)
- return True
- except:
- logger.exception("Impossible to create_security_group_rule,"
- "security group rule probably already exists")
- return False
-
-
-def get_security_group_rules(neutron_client, sg_id):
- try:
- security_rules = neutron_client.list_security_group_rules()[
- 'security_group_rules']
- security_rules = [rule for rule in security_rules
- if rule["security_group_id"] == sg_id]
- return security_rules
- except Exception as e:
- logger.error("Error [get_security_group_rules(neutron_client, sg_id)]:"
- " %s" % e)
- return None
-
-
-def check_security_group_rules(neutron_client, sg_id, direction, protocol,
- port_min=None, port_max=None):
- try:
- security_rules = get_security_group_rules(neutron_client, sg_id)
- security_rules = [rule for rule in security_rules
- if (rule["direction"].lower() == direction and
- rule["protocol"].lower() == protocol and
- rule["port_range_min"] == port_min and
- rule["port_range_max"] == port_max)]
- if len(security_rules) == 0:
- return True
- else:
- return False
- except Exception as e:
- logger.error("Error [check_security_group_rules("
- " neutron_client, sg_id, direction,"
- " protocol, port_min=None, port_max=None)]: "
- "%s" % e)
- return None
-
-
-def create_security_group_full(neutron_client,
- sg_name, sg_description):
- sg_id = get_security_group_id(neutron_client, sg_name)
- if sg_id != '':
- logger.info("Using existing security group '%s'..." % sg_name)
- else:
- logger.info("Creating security group '%s'..." % sg_name)
- SECGROUP = create_security_group(neutron_client,
- sg_name,
- sg_description)
- if not SECGROUP:
- logger.error("Failed to create the security group...")
- return None
-
- sg_id = SECGROUP['id']
-
- logger.debug("Security group '%s' with ID=%s created successfully."
- % (SECGROUP['name'], sg_id))
-
- logger.debug("Adding ICMP rules in security group '%s'..."
- % sg_name)
- if not create_secgroup_rule(neutron_client, sg_id,
- 'ingress', 'icmp'):
- logger.error("Failed to create the security group rule...")
- return None
-
- logger.debug("Adding SSH rules in security group '%s'..."
- % sg_name)
- if not create_secgroup_rule(
- neutron_client, sg_id, 'ingress', 'tcp', '22', '22'):
- logger.error("Failed to create the security group rule...")
- return None
-
- if not create_secgroup_rule(
- neutron_client, sg_id, 'egress', 'tcp', '22', '22'):
- logger.error("Failed to create the security group rule...")
- return None
- return sg_id
-
-
-def add_secgroup_to_instance(nova_client, instance_id, secgroup_id):
- try:
- nova_client.servers.add_security_group(instance_id, secgroup_id)
- return True
- except Exception as e:
- logger.error("Error [add_secgroup_to_instance(nova_client, '%s', "
- "'%s')]: %s" % (instance_id, secgroup_id, e))
- return False
-
-
-def update_sg_quota(neutron_client, tenant_id, sg_quota, sg_rule_quota):
- json_body = {"quota": {
- "security_group": sg_quota,
- "security_group_rule": sg_rule_quota
- }}
-
- try:
- neutron_client.update_quota(tenant_id=tenant_id,
- body=json_body)
- return True
- except Exception as e:
- logger.error("Error [update_sg_quota(neutron_client, '%s', '%s', "
- "'%s')]: %s" % (tenant_id, sg_quota, sg_rule_quota, e))
- return False
-
-
-def delete_security_group(neutron_client, secgroup_id):
- try:
- neutron_client.delete_security_group(secgroup_id)
- return True
- except Exception as e:
- logger.error("Error [delete_security_group(neutron_client, '%s')]: %s"
- % (secgroup_id, e))
- return False
-
-
-# *********************************************
-# GLANCE
-# *********************************************
-def get_images(glance_client):
- try:
- images = glance_client.images.list()
- return images
- except Exception as e:
- logger.error("Error [get_images]: %s" % e)
- return None
-
-
-def get_image_id(glance_client, image_name):
- images = glance_client.images.list()
- id = ''
- for i in images:
- if i.name == image_name:
- id = i.id
- break
- return id
-
-
-def create_glance_image(glance_client,
- image_name,
- file_path,
- disk="qcow2",
- extra_properties={},
- container="bare",
- public="public"):
- if not os.path.isfile(file_path):
- logger.error("Error: file %s does not exist." % file_path)
- return None
- try:
- image_id = get_image_id(glance_client, image_name)
- if image_id != '':
- logger.info("Image %s already exists." % image_name)
- else:
- logger.info("Creating image '%s' from '%s'..." % (image_name,
- file_path))
-
- image = glance_client.images.create(name=image_name,
- visibility=public,
- disk_format=disk,
- container_format=container,
- **extra_properties)
- image_id = image.id
- with open(file_path) as image_data:
- glance_client.images.upload(image_id, image_data)
- return image_id
- except Exception as e:
- logger.error("Error [create_glance_image(glance_client, '%s', '%s', "
- "'%s')]: %s" % (image_name, file_path, public, e))
- return None
-
-
-def get_or_create_image(name, path, format, extra_properties):
- image_exists = False
- glance_client = get_glance_client()
-
- image_id = get_image_id(glance_client, name)
- if image_id != '':
- logger.info("Using existing image '%s'..." % name)
- image_exists = True
- else:
- logger.info("Creating image '%s' from '%s'..." % (name, path))
- image_id = create_glance_image(glance_client,
- name,
- path,
- format,
- extra_properties)
- if not image_id:
- logger.error("Failed to create a Glance image...")
- else:
- logger.debug("Image '%s' with ID=%s created successfully."
- % (name, image_id))
-
- return image_exists, image_id
-
-
-def delete_glance_image(glance_client, image_id):
- try:
- glance_client.images.delete(image_id)
- return True
- except Exception as e:
- logger.error("Error [delete_glance_image(glance_client, '%s')]: %s"
- % (image_id, e))
- return False
-
-
-# *********************************************
-# CINDER
-# *********************************************
-def get_volumes(cinder_client):
- try:
- volumes = cinder_client.volumes.list(search_opts={'all_tenants': 1})
- return volumes
- except Exception as e:
- logger.error("Error [get_volumes(cinder_client)]: %s" % e)
- return None
-
-
-def update_cinder_quota(cinder_client, tenant_id, vols_quota,
- snapshots_quota, gigabytes_quota):
- quotas_values = {"volumes": vols_quota,
- "snapshots": snapshots_quota,
- "gigabytes": gigabytes_quota}
-
- try:
- cinder_client.quotas.update(tenant_id, **quotas_values)
- return True
- except Exception as e:
- logger.error("Error [update_cinder_quota(cinder_client, '%s', '%s', "
- "'%s' '%s')]: %s" % (tenant_id, vols_quota,
- snapshots_quota, gigabytes_quota, e))
- return False
-
-
-def delete_volume(cinder_client, volume_id, forced=False):
- try:
- if forced:
- try:
- cinder_client.volumes.detach(volume_id)
- except:
- logger.error(sys.exc_info()[0])
- cinder_client.volumes.force_delete(volume_id)
- else:
- cinder_client.volumes.delete(volume_id)
- return True
- except Exception as e:
- logger.error("Error [delete_volume(cinder_client, '%s', '%s')]: %s"
- % (volume_id, str(forced), e))
- return False
-
-
-# *********************************************
-# KEYSTONE
-# *********************************************
-def get_tenants(keystone_client):
- try:
- if is_keystone_v3():
- tenants = keystone_client.projects.list()
- else:
- tenants = keystone_client.tenants.list()
- return tenants
- except Exception as e:
- logger.error("Error [get_tenants(keystone_client)]: %s" % e)
- return None
-
-
-def get_users(keystone_client):
- try:
- users = keystone_client.users.list()
- return users
- except Exception as e:
- logger.error("Error [get_users(keystone_client)]: %s" % e)
- return None
-
-
-def get_tenant_id(keystone_client, tenant_name):
- tenants = get_tenants(keystone_client)
- id = ''
- for t in tenants:
- if t.name == tenant_name:
- id = t.id
- break
- return id
-
-
-def get_user_id(keystone_client, user_name):
- users = get_users(keystone_client)
- id = ''
- for u in users:
- if u.name == user_name:
- id = u.id
- break
- return id
-
-
-def get_role_id(keystone_client, role_name):
- roles = keystone_client.roles.list()
- id = ''
- for r in roles:
- if r.name == role_name:
- id = r.id
- break
- return id
-
-
-def get_domain_id(keystone_client, domain_name):
- domains = keystone_client.domains.list()
- id = ''
- for d in domains:
- if d.name == domain_name:
- id = d.id
- break
- return id
-
-
-def create_tenant(keystone_client, tenant_name, tenant_description):
- try:
- if is_keystone_v3():
- domain_name = CONST.__getattribute__('OS_PROJECT_DOMAIN_NAME')
- domain_id = get_domain_id(keystone_client, domain_name)
- tenant = keystone_client.projects.create(
- name=tenant_name,
- description=tenant_description,
- domain=domain_id,
- enabled=True)
- else:
- tenant = keystone_client.tenants.create(tenant_name,
- tenant_description,
- enabled=True)
- return tenant.id
- except Exception as e:
- logger.error("Error [create_tenant(keystone_client, '%s', '%s')]: %s"
- % (tenant_name, tenant_description, e))
- return None
-
-
-def get_or_create_tenant(keystone_client, tenant_name, tenant_description):
- tenant_id = get_tenant_id(keystone_client, tenant_name)
- if not tenant_id:
- tenant_id = create_tenant(keystone_client, tenant_name,
- tenant_description)
-
- return tenant_id
-
-
-def get_or_create_tenant_for_vnf(keystone_client, tenant_name,
- tenant_description):
- """Get or Create a Tenant
-
- Args:
- keystone_client: keystone client reference
- tenant_name: the name of the tenant
- tenant_description: the description of the tenant
-
- return False if tenant retrieved though get
- return True if tenant created
- raise Exception if error during processing
- """
- try:
- tenant_id = get_tenant_id(keystone_client, tenant_name)
- if not tenant_id:
- tenant_id = create_tenant(keystone_client, tenant_name,
- tenant_description)
- return True
- else:
- return False
- except:
- raise Exception("Impossible to create a Tenant for the VNF {}".format(
- tenant_name))
-
-
-def create_user(keystone_client, user_name, user_password,
- user_email, tenant_id):
- try:
- if is_keystone_v3():
- user = keystone_client.users.create(name=user_name,
- password=user_password,
- email=user_email,
- project_id=tenant_id,
- enabled=True)
- else:
- user = keystone_client.users.create(user_name,
- user_password,
- user_email,
- tenant_id,
- enabled=True)
- return user.id
- except Exception as e:
- logger.error("Error [create_user(keystone_client, '%s', '%s', '%s'"
- "'%s')]: %s" % (user_name, user_password,
- user_email, tenant_id, e))
- return None
-
-
-def get_or_create_user(keystone_client, user_name, user_password,
- tenant_id, user_email=None):
- user_id = get_user_id(keystone_client, user_name)
- if not user_id:
- user_id = create_user(keystone_client, user_name, user_password,
- user_email, tenant_id)
- return user_id
-
-
-def get_or_create_user_for_vnf(keystone_client, vnf_ref):
- """Get or Create user for VNF
-
- Args:
- keystone_client: keystone client reference
- vnf_ref: VNF reference used as user name & password, tenant name
-
- return False if user retrieved through get
- return True if user created
- raise Exception if error during processing
- """
- try:
- user_id = get_user_id(keystone_client, vnf_ref)
- tenant_id = get_tenant_id(keystone_client, vnf_ref)
- created = False
- if not user_id:
- user_id = create_user(keystone_client, vnf_ref, vnf_ref,
- "", tenant_id)
- created = True
- try:
- role_id = get_role_id(keystone_client, 'admin')
- tenant_id = get_tenant_id(keystone_client, vnf_ref)
- add_role_user(keystone_client, user_id, role_id, tenant_id)
- except:
- logger.warn("Cannot associate user to role admin on tenant")
- return created
- except:
- raise Exception("Impossible to create a user for the VNF {}".format(
- vnf_ref))
-
-
-def add_role_user(keystone_client, user_id, role_id, tenant_id):
- try:
- if is_keystone_v3():
- keystone_client.roles.grant(role=role_id,
- user=user_id,
- project=tenant_id)
- else:
- keystone_client.roles.add_user_role(user_id, role_id, tenant_id)
- return True
- except Exception as e:
- logger.error("Error [add_role_user(keystone_client, '%s', '%s'"
- "'%s')]: %s " % (user_id, role_id, tenant_id, e))
- return False
-
-
-def delete_tenant(keystone_client, tenant_id):
- try:
- if is_keystone_v3():
- keystone_client.projects.delete(tenant_id)
- else:
- keystone_client.tenants.delete(tenant_id)
- return True
- except Exception as e:
- logger.error("Error [delete_tenant(keystone_client, '%s')]: %s"
- % (tenant_id, e))
- return False
-
-
-def delete_user(keystone_client, user_id):
- try:
- keystone_client.users.delete(user_id)
- return True
- except Exception as e:
- logger.error("Error [delete_user(keystone_client, '%s')]: %s"
- % (user_id, e))
- return False
-
-
-# *********************************************
-# HEAT
-# *********************************************
-def get_resource(heat_client, stack_id, resource):
- try:
- resources = heat_client.resources.get(stack_id, resource)
- return resources
- except Exception as e:
- logger.error("Error [get_resource]: %s" % e)
- return None
diff --git a/requirements.txt b/requirements.txt
index 8c83f0a8a..385f8d8e6 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,35 +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.10.0 # MIT
-GitPython>=1.0.1 # BSD License (3 clause)
-keystoneauth1>=3.1.0 # Apache-2.0
-python-cinderclient>=3.1.0 # Apache-2.0
-python-glanceclient>=2.8.0 # Apache-2.0
-python-heatclient>=1.6.1 # Apache-2.0
-python-keystoneclient>=3.8.0 # Apache-2.0
-python-neutronclient>=6.3.0 # Apache-2.0
-python-novaclient>=9.0.0 # Apache-2.0
-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 # BSD
-PrettyTable<0.8,>=0.7.1 # BSD
-six>=1.9.0 # MIT
-snaps
-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
+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
+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 e52341ec7..3b466985a 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -1,19 +1,50 @@
[metadata]
name = functest
-version = 5
+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
- functest_refstack_client = functest.opnfv_tests.openstack.refstack_client.refstack_client:main
- functest_tempest_conf = functest.opnfv_tests.openstack.refstack_client.tempest_conf:main
- run_tests = functest.ci.run_tests: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
+build-dir = api/build/
+source-dir = api
+
+[wheel]
+universal = 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 569b80c3d..03f57b9cc 100644
--- a/test-requirements.txt
+++ b/test-requirements.txt
@@ -1,10 +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 # BSD
-nose # LGPL
-flake8<2.6.0,>=2.5.4 # MIT
-pylint==1.4.5 # GPLv2
-sphinx>=1.6.2 # BSD
+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 # Apache-2.0
+bashate # Apache-2.0
+bandit
+sphinxcontrib-spelling
+pre-commit
diff --git a/tox.ini b/tox.ini
index 7d92b17c1..1bebeb93a 100644
--- a/tox.ini
+++ b/tox.ini
@@ -1,94 +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/pike
+ -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
-commands = sphinx-build -W -b html api/ api/_build
+basepython = python3.10
+commands =
+ doc8 \
+ --ignore-path api/build \
+ --ignore-path docs/build \
+ --ignore-path docs/_build \
+ api \
+ docs
+ sphinx-build -W -b html api/ api/build
+ 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.core
- functest.energy
- functest.opnfv_tests.sdn.odl
- functest.tests.unit.ci.test_tier_handler
- functest.tests.unit.ci.test_tier_builder
- functest.tests.unit.core
- functest.tests.unit.energy
- functest.tests.unit.odl
- functest.tests.unit.utils.test_decorators
- functest.utils.decorators
+basepython = python3.10
commands =
- bash -c "\
- pylint -f parseable --disable=locally-disabled functest | \
- tee pylint.out | sed -ne '/Raw metrics/,//p'"
- pylint --disable=locally-disabled --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 {[testenv:yamllint]files}
+ yamllint -s {[testenv:yamllint]files}
-[testenv:py35]
-dirs =
- functest/tests/unit/ci
- functest/tests/unit/cli
- functest/tests/unit/core
- functest/tests/unit/energy
- 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/core
- functest/tests/unit/energy
functest/tests/unit/odl
- functest/tests/unit/utils/test_decorators.py
-commands = nosetests --with-coverage --cover-tests \
- --cover-package functest.core \
- --cover-package functest.energy \
- --cover-package functest.opnfv_tests.sdn.odl \
- --cover-package functest.tests.unit \
- --cover-package functest.utils.decorators \
- --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 a453fc6c3..5eff3d20f 100644
--- a/upper-constraints.txt
+++ b/upper-constraints.txt
@@ -1,21 +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/promise#egg=promise
--e git+https://gerrit.opnfv.org/gerrit/doctor#egg=doctor-tests
-git+https://gerrit.opnfv.org/gerrit/domino#egg=domino
-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
-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
-yamllint===1.10.0
+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