aboutsummaryrefslogtreecommitdiffstats
path: root/functest/opnfv_tests/OpenStack/tempest
diff options
context:
space:
mode:
authorMorgan Richomme <morgan.richomme@orange.com>2016-11-08 14:18:12 +0100
committerMorgan Richomme <morgan.richomme@orange.com>2016-11-09 16:55:45 +0100
commit107e61635c2ab1feb5263380ea63e21cf2e6e65b (patch)
tree4966b77605bd34a40f452b1d268868691e84d008 /functest/opnfv_tests/OpenStack/tempest
parente74c9b347f2623eb1a3c477921a84da4c31b364f (diff)
Repo structure modification
- create functest subdirectory - rename unit tests - adapt path in exec and config files JIRA: FUNCTEST-525 Change-Id: Ifd5c6edfb5bda1b09f82848e2269ad5fbeb84d0a Signed-off-by: Morgan Richomme <morgan.richomme@orange.com>
Diffstat (limited to 'functest/opnfv_tests/OpenStack/tempest')
-rw-r--r--functest/opnfv_tests/OpenStack/tempest/custom_tests/blacklist.txt96
-rw-r--r--functest/opnfv_tests/OpenStack/tempest/custom_tests/defcore_req.txt122
-rwxr-xr-xfunctest/opnfv_tests/OpenStack/tempest/gen_tempest_conf.py124
-rwxr-xr-xfunctest/opnfv_tests/OpenStack/tempest/run_tempest.py471
4 files changed, 813 insertions, 0 deletions
diff --git a/functest/opnfv_tests/OpenStack/tempest/custom_tests/blacklist.txt b/functest/opnfv_tests/OpenStack/tempest/custom_tests/blacklist.txt
new file mode 100644
index 00000000..5c8581f6
--- /dev/null
+++ b/functest/opnfv_tests/OpenStack/tempest/custom_tests/blacklist.txt
@@ -0,0 +1,96 @@
+-
+ scenarios:
+ - os-odl_l2-bgpvpn-ha
+ - os-odl_l2-bgpvpn-noha
+ installers:
+ - fuel
+ - apex
+ tests:
+ - tempest.api.compute.servers.test_create_server.ServersTestJSON.test_list_servers
+ - tempest.api.compute.servers.test_create_server.ServersTestJSON.test_verify_server_details
+ - tempest.api.compute.servers.test_create_server.ServersTestManualDisk.test_list_servers
+ - tempest.api.compute.servers.test_create_server.ServersTestManualDisk.test_verify_server_details
+ - tempest.api.compute.servers.test_server_actions.ServerActionsTestJSON.test_reboot_server_hard
+ - tempest.api.network.test_floating_ips.FloatingIPTestJSON.test_create_list_show_update_delete_floating_ip
+ - tempest.api.network.test_floating_ips.FloatingIPTestJSON.test_create_floating_ip_specifying_a_fixed_ip_address
+ - tempest.scenario.test_network_basic_ops.TestNetworkBasicOps.test_network_basic_ops
+ - tempest.scenario.test_server_basic_ops.TestServerBasicOps.test_server_basic_ops
+ - tempest.scenario.test_volume_boot_pattern.TestVolumeBootPattern.test_volume_boot_pattern
+ - tempest.scenario.test_volume_boot_pattern.TestVolumeBootPatternV2.test_volume_boot_pattern
+
+-
+ scenarios:
+ - os-odl_l2-nofeature-ha
+ - os-odl_l2-nofeature-noha
+ - os-nosdn-nofeature-ha
+ - os-nosdn-nofeature-noha
+ installers:
+ - joid
+ tests:
+ - tempest.api.object_storage
+
+-
+ scenarios:
+ - os-nosdn-lxd-ha
+ - os-nosdn-lxd-noha
+ installers:
+ - joid
+ tests:
+ - tempest.api.object_storage
+ - tempest.scenario.test_network_basic_ops.TestNetworkBasicOps.test_network_basic_ops
+ - tempest.scenario.test_server_basic_ops.TestServerBasicOps.test_server_basic_ops
+ - tempest.scenario.test_volume_boot_pattern.TestVolumeBootPattern.test_volume_boot_pattern
+ - tempest.scenario.test_volume_boot_pattern.TestVolumeBootPatternV2.test_volume_boot_pattern
+
+-
+ scenarios:
+ - os-onos-nofeature-ha
+ - os-onos-nofeature-noha
+ - os-onos-sfc-ha
+ - os-onos-sfc-noha
+ installers:
+ - fuel
+ - apex
+ - compass
+ tests:
+ - tempest.api.compute.servers.test_server_actions.ServerActionsTestJSON.test_reboot_server_hard
+ - tempest.scenario.test_network_basic_ops.TestNetworkBasicOps.test_network_basic_ops
+ - tempest.scenario.test_server_basic_ops.TestServerBasicOps.test_server_basic_ops
+ - tempest.scenario.test_volume_boot_pattern.TestVolumeBootPattern.test_volume_boot_pattern
+ - tempest.scenario.test_volume_boot_pattern.TestVolumeBootPatternV2.test_volume_boot_pattern
+
+-
+ scenarios:
+ - os-onos-nofeature-ha
+ - os-onos-nofeature-noha
+ - os-onos-sfc-ha
+ - os-onos-sfc-noha
+ installers:
+ - joid
+ tests:
+ - tempest.api.object_storage
+ - tempest.api.compute.servers.test_server_actions.ServerActionsTestJSON.test_reboot_server_hard
+ - tempest.scenario.test_network_basic_ops.TestNetworkBasicOps.test_network_basic_ops
+ - tempest.scenario.test_server_basic_ops.TestServerBasicOps.test_server_basic_ops
+ - tempest.scenario.test_volume_boot_pattern.TestVolumeBootPattern.test_volume_boot_pattern
+ - tempest.scenario.test_volume_boot_pattern.TestVolumeBootPatternV2.test_volume_boot_pattern
+
+-
+ # https://bugs.launchpad.net/tempest/+bug/1586931
+ scenarios:
+ - os-odl_l2-nofeature-ha
+ - os-odl_l2-nofeature-noha
+ - os-odl_l2-sfc-ha
+ - os-odl_l2-sfc-noha
+ - os-odl_l3-nofeature-ha
+ - os-odl_l3-nofeature-noha
+ - os-nosdn-kvm-ha
+ - os-nosdn-kvm-noha
+ - os-nosdn-nofeature-ha
+ - os-nosdn-nofeature-noha
+ - os-nosdn-ovs-ha
+ - os-nosdn-ovs-noha
+ installers:
+ - fuel
+ tests:
+ - tempest.scenario.test_server_basic_ops.TestServerBasicOps.test_server_basic_ops
diff --git a/functest/opnfv_tests/OpenStack/tempest/custom_tests/defcore_req.txt b/functest/opnfv_tests/OpenStack/tempest/custom_tests/defcore_req.txt
new file mode 100644
index 00000000..bb1d172d
--- /dev/null
+++ b/functest/opnfv_tests/OpenStack/tempest/custom_tests/defcore_req.txt
@@ -0,0 +1,122 @@
+# Set of DefCore tempest test cases (see http://www.openstack.org/brand/interop)
+# This approved version (2016.01) is valid for Juno, Kilo, and Liberty releases of OpenStack
+# The list is stored at http://git.openstack.org/cgit/openstack/defcore/plain/2016.01/2016.01.required.txt
+tempest.api.compute.images.test_images.ImagesTestJSON.test_delete_saving_image[id-aa06b52b-2db5-4807-b218-9441f75d74e3]
+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.images.test_list_image_filters.ListImageFiltersTestJSON.test_list_images_filter_by_changes_since[id-18bac3ae-da27-436c-92a9-b22474d13aab]
+tempest.api.compute.images.test_list_image_filters.ListImageFiltersTestJSON.test_list_images_filter_by_name[id-33163b73-79f5-4d07-a7ea-9213bcc468ff]
+tempest.api.compute.images.test_list_image_filters.ListImageFiltersTestJSON.test_list_images_filter_by_server_id[id-9f238683-c763-45aa-b848-232ec3ce3105]
+tempest.api.compute.images.test_list_image_filters.ListImageFiltersTestJSON.test_list_images_filter_by_server_ref[id-05a377b8-28cf-4734-a1e6-2ab5c38bf606]
+tempest.api.compute.images.test_list_image_filters.ListImageFiltersTestJSON.test_list_images_filter_by_status[id-a3f5b513-aeb3-42a9-b18e-f091ef73254d]
+tempest.api.compute.images.test_list_image_filters.ListImageFiltersTestJSON.test_list_images_filter_by_type[id-e3356918-4d3e-4756-81d5-abc4524ba29f]
+tempest.api.compute.images.test_list_image_filters.ListImageFiltersTestJSON.test_list_images_limit_results[id-3a484ca9-67ba-451e-b494-7fcf28d32d62]
+tempest.api.compute.images.test_list_image_filters.ListImageFiltersTestJSON.test_list_images_with_detail_filter_by_changes_since[id-7d439e18-ac2e-4827-b049-7e18004712c4]
+tempest.api.compute.images.test_list_image_filters.ListImageFiltersTestJSON.test_list_images_with_detail_filter_by_name[id-644ea267-9bd9-4f3b-af9f-dffa02396a17]
+tempest.api.compute.images.test_list_image_filters.ListImageFiltersTestJSON.test_list_images_with_detail_filter_by_server_ref[id-8c78f822-203b-4bf6-8bba-56ebd551cf84]
+tempest.api.compute.images.test_list_image_filters.ListImageFiltersTestJSON.test_list_images_with_detail_filter_by_status[id-9b0ea018-6185-4f71-948a-a123a107988e]
+tempest.api.compute.images.test_list_image_filters.ListImageFiltersTestJSON.test_list_images_with_detail_filter_by_type[id-888c0cc0-7223-43c5-9db0-b125fd0a393b]
+tempest.api.compute.images.test_list_image_filters.ListImageFiltersTestJSON.test_list_images_with_detail_limit_results[id-ba2fa9a9-b672-47cc-b354-3b4c0600e2cb]
+tempest.api.compute.images.test_list_images.ListImagesTestJSON.test_get_image[id-490d0898-e12a-463f-aef0-c50156b9f789]
+tempest.api.compute.images.test_list_images.ListImagesTestJSON.test_list_images[id-fd51b7f4-d4a3-4331-9885-866658112a6f]
+tempest.api.compute.images.test_list_images.ListImagesTestJSON.test_list_images_with_detail[id-9f94cb6b-7f10-48c5-b911-a0b84d7d4cd6]
+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,smoke]
+tempest.api.compute.servers.test_create_server.ServersTestJSON.test_list_servers_with_detail[id-585e934c-448e-43c4-acbf-d06a9b899997]
+tempest.api.compute.servers.test_create_server.ServersTestJSON.test_verify_created_server_vcpus[id-cbc0f52f-05aa-492b-bdc1-84b575ca294b]
+tempest.api.compute.servers.test_create_server.ServersTestJSON.test_verify_server_details[id-5de47127-9977-400a-936f-abcfbec1218f,smoke]
+tempest.api.compute.servers.test_create_server.ServersTestManualDisk.test_host_name_is_same_as_server_name[id-ac1ad47f-984b-4441-9274-c9079b7a0666]
+tempest.api.compute.servers.test_create_server.ServersTestManualDisk.test_list_servers[id-9a438d88-10c6-4bcd-8b5b-5b6e25e1346f,smoke]
+tempest.api.compute.servers.test_create_server.ServersTestManualDisk.test_list_servers_with_detail[id-585e934c-448e-43c4-acbf-d06a9b899997]
+tempest.api.compute.servers.test_create_server.ServersTestManualDisk.test_verify_created_server_vcpus[id-cbc0f52f-05aa-492b-bdc1-84b575ca294b]
+tempest.api.compute.servers.test_create_server.ServersTestManualDisk.test_verify_server_details[id-5de47127-9977-400a-936f-abcfbec1218f,smoke]
+tempest.api.compute.servers.test_instance_actions.InstanceActionsTestJSON.test_get_instance_action[id-aacc71ca-1d70-4aa5-bbf6-0ff71470e43c]
+tempest.api.compute.servers.test_instance_actions.InstanceActionsTestJSON.test_list_instance_actions[id-77ca5cc5-9990-45e0-ab98-1de8fead201a]
+tempest.api.compute.servers.test_list_server_filters.ListServerFiltersTestJSON.test_list_servers_detailed_filter_by_flavor[id-80c574cc-0925-44ba-8602-299028357dd9]
+tempest.api.compute.servers.test_list_server_filters.ListServerFiltersTestJSON.test_list_servers_detailed_filter_by_image[id-b3304c3b-97df-46d2-8cd3-e2b6659724e7]
+tempest.api.compute.servers.test_list_server_filters.ListServerFiltersTestJSON.test_list_servers_detailed_filter_by_server_name[id-f9eb2b70-735f-416c-b260-9914ac6181e4]
+tempest.api.compute.servers.test_list_server_filters.ListServerFiltersTestJSON.test_list_servers_detailed_filter_by_server_status[id-de2612ab-b7dd-4044-b0b1-d2539601911f]
+tempest.api.compute.servers.test_list_server_filters.ListServerFiltersTestJSON.test_list_servers_detailed_limit_results[id-67aec2d0-35fe-4503-9f92-f13272b867ed]
+tempest.api.compute.servers.test_list_server_filters.ListServerFiltersTestJSON.test_list_servers_filter_by_flavor[id-573637f5-7325-47bb-9144-3476d0416908]
+tempest.api.compute.servers.test_list_server_filters.ListServerFiltersTestJSON.test_list_servers_filter_by_image[id-05e8a8e7-9659-459a-989d-92c2f501f4ba]
+tempest.api.compute.servers.test_list_server_filters.ListServerFiltersTestJSON.test_list_servers_filter_by_limit[id-614cdfc1-d557-4bac-915b-3e67b48eee76]
+tempest.api.compute.servers.test_list_server_filters.ListServerFiltersTestJSON.test_list_servers_filter_by_server_name[id-9b067a7b-7fee-4f6a-b29c-be43fe18fc5a]
+tempest.api.compute.servers.test_list_server_filters.ListServerFiltersTestJSON.test_list_servers_filter_by_server_status[id-ca78e20e-fddb-4ce6-b7f7-bcbf8605e66e]
+tempest.api.compute.servers.test_list_server_filters.ListServerFiltersTestJSON.test_list_servers_filtered_by_ip[id-43a1242e-7b31-48d1-88f2-3f72aa9f2077]
+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,negative]
+tempest.api.compute.servers.test_list_servers_negative.ListServersNegativeTestJSON.test_list_servers_by_changes_since_invalid_date[id-87d12517-e20a-4c9c-97b6-dd1628d6d6c9,negative]
+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,negative]
+tempest.api.compute.servers.test_list_servers_negative.ListServersNegativeTestJSON.test_list_servers_by_limits_pass_negative_value[id-62610dd9-4713-4ee0-8beb-fd2c1aa7f950,negative]
+tempest.api.compute.servers.test_list_servers_negative.ListServersNegativeTestJSON.test_list_servers_by_limits_pass_string[id-679bc053-5e70-4514-9800-3dfab1a380a6,negative]
+tempest.api.compute.servers.test_list_servers_negative.ListServersNegativeTestJSON.test_list_servers_by_non_existing_flavor[id-5913660b-223b-44d4-a651-a0fbfd44ca75,negative]
+tempest.api.compute.servers.test_list_servers_negative.ListServersNegativeTestJSON.test_list_servers_by_non_existing_image[id-ff01387d-c7ad-47b4-ae9e-64fa214638fe,negative]
+tempest.api.compute.servers.test_list_servers_negative.ListServersNegativeTestJSON.test_list_servers_by_non_existing_server_name[id-e2c77c4a-000a-4af3-a0bd-629a328bde7c,negative]
+tempest.api.compute.servers.test_list_servers_negative.ListServersNegativeTestJSON.test_list_servers_detail_server_is_deleted[id-93055106-2d34-46fe-af68-d9ddbf7ee570,negative]
+tempest.api.compute.servers.test_list_servers_negative.ListServersNegativeTestJSON.test_list_servers_status_non_existing[id-fcdf192d-0f74-4d89-911f-1ec002b822c4,negative]
+tempest.api.compute.servers.test_list_servers_negative.ListServersNegativeTestJSON.test_list_servers_with_a_deleted_server[id-24a26f1a-1ddc-4eea-b0d7-a90cc874ad8f,negative]
+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,smoke]
+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_resize_server_confirm[id-1499262a-9328-4eda-9068-db1ac57498d2]
+tempest.api.compute.servers.test_server_actions.ServerActionsTestJSON.test_resize_server_revert[id-c03aab19-adb1-44f5-917d-c419577e9e68]
+tempest.api.compute.servers.test_server_actions.ServerActionsTestJSON.test_stop_start_server[id-af8eafd4-38a7-4a4b-bdbc-75145a580560]
+tempest.api.compute.servers.test_server_metadata.ServerMetadataTestJSON.test_delete_server_metadata_item[id-127642d6-4c7b-4486-b7cd-07265a378658]
+tempest.api.compute.servers.test_server_metadata.ServerMetadataTestJSON.test_get_server_metadata_item[id-3043c57d-7e0e-49a6-9a96-ad569c265e6a]
+tempest.api.compute.servers.test_server_metadata.ServerMetadataTestJSON.test_list_server_metadata[id-479da087-92b3-4dcf-aeb3-fd293b2d14ce]
+tempest.api.compute.servers.test_server_metadata.ServerMetadataTestJSON.test_set_server_metadata[id-211021f6-21de-4657-a68f-908878cfe251]
+tempest.api.compute.servers.test_server_metadata.ServerMetadataTestJSON.test_set_server_metadata_item[id-58c02d4f-5c67-40be-8744-d3fa5982eb1c]
+tempest.api.compute.servers.test_server_metadata.ServerMetadataTestJSON.test_update_server_metadata[id-344d981e-0c33-4997-8a5d-6c1d803e4134]
+tempest.api.compute.servers.test_servers.ServersTestJSON.test_create_server_with_admin_password[id-b92d5ec7-b1dd-44a2-87e4-45e888c46ef0]
+tempest.api.compute.servers.test_servers.ServersTestJSON.test_create_specify_keypair[id-f9e15296-d7f9-4e62-b53f-a04e89160833]
+tempest.api.compute.servers.test_servers.ServersTestJSON.test_create_with_existing_server_name[id-8fea6be7-065e-47cf-89b8-496e6f96c699]
+tempest.api.compute.servers.test_servers.ServersTestJSON.test_update_access_server_address[id-89b90870-bc13-4b73-96af-f9d4f2b70077]
+tempest.api.compute.servers.test_servers.ServersTestJSON.test_update_server_name[id-5e6ccff8-349d-4852-a8b3-055df7988dd2]
+tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_create_numeric_server_name[id-fd57f159-68d6-4c2a-902b-03070828a87e,negative]
+tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_create_server_metadata_exceeds_length_limit[id-7fc74810-0bd2-4cd7-8244-4f33a9db865a,negative]
+tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_create_server_name_length_exceeds_256[id-c3e0fb12-07fc-4d76-a22e-37409887afe8,negative]
+tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_create_with_invalid_flavor[id-18f5227f-d155-4429-807c-ccb103887537,negative]
+tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_create_with_invalid_image[id-fcba1052-0a50-4cf3-b1ac-fae241edf02f,negative]
+tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_create_with_invalid_network_uuid[id-4e72dc2d-44c5-4336-9667-f7972e95c402,negative]
+tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_delete_server_pass_id_exceeding_length_limit[id-f4d7279b-5fd2-4bf2-9ba4-ae35df0d18c5,negative]
+tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_delete_server_pass_negative_id[id-75f79124-277c-45e6-a373-a1d6803f4cc4,negative]
+tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_get_non_existent_server[id-3436b02f-1b1e-4f03-881e-c6a602327439,negative]
+tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_invalid_ip_v6_address[id-5226dd80-1e9c-4d8a-b5f9-b26ca4763fd0,negative]
+tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_reboot_non_existent_server[id-d4c023a0-9c55-4747-9dd5-413b820143c7,negative]
+tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_rebuild_deleted_server[id-98fa0458-1485-440f-873b-fe7f0d714930,negative]
+tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_rebuild_non_existent_server[id-d86141a7-906e-4731-b187-d64a2ea61422,negative]
+tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_resize_server_with_non_existent_flavor[id-ced1a1d7-2ab6-45c9-b90f-b27d87b30efd,negative]
+tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_resize_server_with_null_flavor[id-45436a7d-a388-4a35-a9d8-3adc5d0d940b,negative]
+tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_server_name_blank[id-dbbfd247-c40c-449e-8f6c-d2aa7c7da7cf,negative]
+tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_stop_non_existent_server[id-a31460a9-49e1-42aa-82ee-06e0bb7c2d03,negative]
+tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_update_name_of_non_existent_server[id-aa8eed43-e2cb-4ebf-930b-da14f6a21d81,negative]
+tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_update_server_name_length_exceeds_256[id-5c8e244c-dada-4590-9944-749c455b431f,negative]
+tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_update_server_set_empty_name[id-38204696-17c6-44da-9590-40f87fb5a899,negative]
+tempest.api.compute.servers.test_servers_negative.ServersNegativeTestMultiTenantJSON.test_delete_a_server_of_another_tenant[id-5c75009d-3eea-423e-bea3-61b09fd25f9c,negative]
+tempest.api.compute.servers.test_servers_negative.ServersNegativeTestMultiTenantJSON.test_update_server_of_another_tenant[id-543d84c1-dd2e-4c6d-8cb2-b9da0efaa384,negative]
+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.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.compute.volumes.test_volumes_list.VolumesTestJSON.test_volume_list[id-bc2dd1a0-15af-48e5-9990-f2e75a48325d]
+tempest.api.compute.volumes.test_volumes_list.VolumesTestJSON.test_volume_list_with_details[id-bad0567a-5a4f-420b-851e-780b55bb867c]
+tempest.api.compute.volumes.test_volumes_negative.VolumesNegativeTest.test_get_invalid_volume_id[id-f01904f2-e975-4915-98ce-cb5fa27bde4f,negative]
+tempest.api.compute.volumes.test_volumes_negative.VolumesNegativeTest.test_get_volume_without_passing_volume_id[id-62bab09a-4c03-4617-8cca-8572bc94af9b,negative]
+tempest.api.identity.v3.test_tokens.TokensV3Test.test_create_token[id-6f8e4436-fc96-4282-8122-e41df57197a9]
+tempest.api.image.v2.test_images.ListImagesTest.test_list_no_params[id-1e341d7a-90a9-494c-b143-2cdf2aeb6aee]
+tempest.api.image.v1.test_images.ListImagesTest.test_index_no_params[id-246178ab-3b33-4212-9a4b-a7fe8261794d]
+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,smoke]
+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,smoke]
+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_object_upload_in_segments[id-e3e6a64a-9f50-4955-b987-6ce6767c97fb]
+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/gen_tempest_conf.py b/functest/opnfv_tests/OpenStack/tempest/gen_tempest_conf.py
new file mode 100755
index 00000000..ca671d00
--- /dev/null
+++ b/functest/opnfv_tests/OpenStack/tempest/gen_tempest_conf.py
@@ -0,0 +1,124 @@
+#!/usr/bin/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
+#
+# Execute Multisite Tempest test cases
+##
+
+import ConfigParser
+import os
+import re
+import shutil
+import functest.utils.functest_utils as ft_utils
+import functest.utils.functest_logger as ft_logger
+from run_tempest import configure_tempest
+from run_tempest import TEMPEST_RESULTS_DIR
+
+logger = ft_logger.Logger("multisite").getLogger()
+
+
+def configure_tempest_multisite(deployment_dir):
+ """
+ Add/update needed parameters into tempest.conf file generated by Rally
+ """
+ logger.debug("configure the tempest")
+ configure_tempest(deployment_dir)
+
+ logger.debug("Finding tempest.conf file...")
+ tempest_conf_file = deployment_dir + "/tempest.conf"
+ if not os.path.isfile(tempest_conf_file):
+ logger.error("Tempest configuration file %s NOT found."
+ % tempest_conf_file)
+ exit(-1)
+
+ # Copy tempest.conf to /home/opnfv/functest/results/tempest/
+ cur_path = os.path.split(os.path.realpath(__file__))[0]
+ shutil.copyfile(tempest_conf_file, cur_path + '/tempest_multisite.conf')
+ tempest_conf_file = cur_path + "/tempest_multisite.conf"
+
+ logger.debug("Updating selected tempest.conf parameters...")
+ config = ConfigParser.RawConfigParser()
+ config.read(tempest_conf_file)
+
+ config.set('service_available', 'kingbird', 'true')
+ cmd = "openstack endpoint show kingbird | grep publicurl |\
+ awk '{print $4}' | awk -F '/' '{print $4}'"
+ kingbird_api_version = os.popen(cmd).read()
+ if os.environ.get("INSTALLER_TYPE") == 'fuel':
+ # For MOS based setup, the service is accessible
+ # via bind host
+ kingbird_conf_path = "/etc/kingbird/kingbird.conf"
+ installer_type = os.getenv('INSTALLER_TYPE', 'Unknown')
+ installer_ip = os.getenv('INSTALLER_IP', 'Unknown')
+ installer_username = ft_utils.get_functest_config(
+ "multisite." + installer_type +
+ "_environment.installer_username")
+ installer_password = ft_utils.get_functest_config(
+ "multisite." + installer_type +
+ "_environment.installer_password")
+
+ ssh_options = "-o UserKnownHostsFile=/dev/null -o \
+ StrictHostKeyChecking=no"
+
+ # Get the controller IP from the fuel node
+ cmd = 'sshpass -p %s ssh 2>/dev/null %s %s@%s \
+ \'fuel node --env 1| grep controller | grep "True\| 1" \
+ | awk -F\| "{print \$5}"\'' % (installer_password,
+ ssh_options,
+ installer_username,
+ installer_ip)
+ multisite_controller_ip = \
+ "".join(os.popen(cmd).read().split())
+
+ # Login to controller and get bind host details
+ cmd = 'sshpass -p %s ssh 2>/dev/null %s %s@%s "ssh %s \\" \
+ grep -e "^bind_" %s \\""' % (installer_password,
+ ssh_options,
+ installer_username,
+ installer_ip,
+ multisite_controller_ip,
+ kingbird_conf_path)
+ bind_details = os.popen(cmd).read()
+ bind_details = "".join(bind_details.split())
+ # Extract port number from the bind details
+ bind_port = re.findall(r"\D(\d{4})", bind_details)[0]
+ # Extract ip address from the bind details
+ bind_host = re.findall(r"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}",
+ bind_details)[0]
+ kingbird_endpoint_url = "http://" + bind_host + ":" + bind_port + \
+ "/"
+ else:
+ cmd = "openstack endpoint show kingbird | grep publicurl |\
+ awk '{print $4}' | awk -F '/' '{print $3}'"
+ kingbird_endpoint_url = os.popen(cmd).read()
+
+ try:
+ config.add_section("kingbird")
+ except Exception:
+ logger.info('kingbird section exist')
+ config.set('kingbird', 'endpoint_type', 'publicURL')
+ config.set('kingbird', 'TIME_TO_SYNC', '20')
+ config.set('kingbird', 'endpoint_url', kingbird_endpoint_url)
+ config.set('kingbird', 'api_version', kingbird_api_version)
+ with open(tempest_conf_file, 'wb') as config_file:
+ config.write(config_file)
+
+ return True
+
+
+def main():
+
+ if not os.path.exists(TEMPEST_RESULTS_DIR):
+ os.makedirs(TEMPEST_RESULTS_DIR)
+
+ deployment_dir = ft_utils.get_deployment_dir()
+ configure_tempest_multisite(deployment_dir)
+
+
+if __name__ == '__main__':
+ main()
diff --git a/functest/opnfv_tests/OpenStack/tempest/run_tempest.py b/functest/opnfv_tests/OpenStack/tempest/run_tempest.py
new file mode 100755
index 00000000..d2c01c60
--- /dev/null
+++ b/functest/opnfv_tests/OpenStack/tempest/run_tempest.py
@@ -0,0 +1,471 @@
+#!/usr/bin/env python
+#
+# Description:
+# Runs tempest and pushes the results to the DB
+#
+# Authors:
+# morgan.richomme@orange.com
+# jose.lausuch@ericsson.com
+# viktor.tikkanen@nokia.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 ConfigParser
+import os
+import re
+import shutil
+import subprocess
+import sys
+import time
+
+import argparse
+import yaml
+
+import functest.utils.functest_logger as ft_logger
+import functest.utils.functest_utils as ft_utils
+import functest.utils.openstack_utils as os_utils
+
+modes = ['full', 'smoke', 'baremetal', 'compute', 'data_processing',
+ 'identity', 'image', 'network', 'object_storage', 'orchestration',
+ 'telemetry', 'volume', 'custom', 'defcore', 'feature_multisite']
+
+""" tests configuration """
+parser = argparse.ArgumentParser()
+parser.add_argument("-d", "--debug",
+ help="Debug mode",
+ action="store_true")
+parser.add_argument("-s", "--serial",
+ help="Run tests in one thread",
+ action="store_true")
+parser.add_argument("-m", "--mode",
+ help="Tempest test mode [smoke, all]",
+ default="smoke")
+parser.add_argument("-r", "--report",
+ help="Create json result file",
+ action="store_true")
+parser.add_argument("-n", "--noclean",
+ help="Don't clean the created resources for this test.",
+ action="store_true")
+parser.add_argument("-c", "--conf",
+ help="User-specified Tempest config file location",
+ default="")
+
+args = parser.parse_args()
+
+""" logging configuration """
+logger = ft_logger.Logger("run_tempest").getLogger()
+
+TEST_DB = ft_utils.get_functest_config('results.test_db_url')
+
+MODE = "smoke"
+GLANCE_IMAGE_NAME = \
+ ft_utils.get_functest_config('general.openstack.image_name')
+GLANCE_IMAGE_FILENAME = \
+ ft_utils.get_functest_config('general.openstack.image_file_name')
+GLANCE_IMAGE_FORMAT = \
+ ft_utils.get_functest_config('general.openstack.image_disk_format')
+GLANCE_IMAGE_PATH = \
+ ft_utils.get_functest_config('general.directories.dir_functest_data') + \
+ "/" + GLANCE_IMAGE_FILENAME
+IMAGE_ID = None
+IMAGE_ID_ALT = None
+
+FLAVOR_NAME = \
+ ft_utils.get_functest_config('general.openstack.flavor_name')
+FLAVOR_RAM = ft_utils.get_functest_config('general.openstack.flavor_ram')
+FLAVOR_DISK = ft_utils.get_functest_config('general.openstack.flavor_disk')
+FLAVOR_VCPUS = ft_utils.get_functest_config('general.openstack.flavor_vcpus')
+FLAVOR_ID = None
+FLAVOR_ID_ALT = None
+
+PRIVATE_NET_NAME = \
+ ft_utils.get_functest_config('tempest.private_net_name')
+PRIVATE_SUBNET_NAME = \
+ ft_utils.get_functest_config('tempest.private_subnet_name')
+PRIVATE_SUBNET_CIDR = \
+ ft_utils.get_functest_config('tempest.private_subnet_cidr')
+ROUTER_NAME = \
+ ft_utils.get_functest_config('tempest.router_name')
+TENANT_NAME = \
+ ft_utils.get_functest_config('tempest.identity.tenant_name')
+TENANT_DESCRIPTION = \
+ ft_utils.get_functest_config('tempest.identity.tenant_description')
+USER_NAME = \
+ ft_utils.get_functest_config('tempest.identity.user_name')
+USER_PASSWORD = \
+ ft_utils.get_functest_config('tempest.identity.user_password')
+SSH_TIMEOUT = \
+ ft_utils.get_functest_config('tempest.validation.ssh_timeout')
+USE_CUSTOM_IMAGES = \
+ ft_utils.get_functest_config('tempest.use_custom_images')
+USE_CUSTOM_FLAVORS = \
+ ft_utils.get_functest_config('tempest.use_custom_flavors')
+
+DEPLOYMENT_MAME = \
+ ft_utils.get_functest_config('rally.deployment_name')
+RALLY_INSTALLATION_DIR = \
+ ft_utils.get_functest_config('general.directories.dir_rally_inst')
+
+RESULTS_DIR = \
+ ft_utils.get_functest_config('general.directories.dir_results')
+TEMPEST_RESULTS_DIR = RESULTS_DIR + '/tempest'
+
+REPO_PATH = ft_utils.FUNCTEST_REPO + '/'
+TEST_LIST_DIR = \
+ ft_utils.get_functest_config('general.directories.dir_tempest_cases')
+TEMPEST_CUSTOM = REPO_PATH + TEST_LIST_DIR + 'test_list.txt'
+TEMPEST_BLACKLIST = REPO_PATH + TEST_LIST_DIR + 'blacklist.txt'
+TEMPEST_DEFCORE = REPO_PATH + TEST_LIST_DIR + 'defcore_req.txt'
+TEMPEST_RAW_LIST = TEMPEST_RESULTS_DIR + '/test_raw_list.txt'
+TEMPEST_LIST = TEMPEST_RESULTS_DIR + '/test_list.txt'
+
+
+def get_info(file_result):
+ test_run = ""
+ duration = ""
+ test_failed = ""
+
+ p = subprocess.Popen('cat tempest.log',
+ shell=True, stdout=subprocess.PIPE,
+ stderr=subprocess.STDOUT)
+ for line in p.stdout.readlines():
+ # print line,
+ if (len(test_run) < 1):
+ test_run = re.findall("[0-9]*\.[0-9]*s", line)
+ if (len(duration) < 1):
+ duration = re.findall("[0-9]*\ tests", line)
+ regexp = r"(failures=[0-9]+)"
+ if (len(test_failed) < 1):
+ test_failed = re.findall(regexp, line)
+
+ logger.debug("test_run:" + test_run)
+ logger.debug("duration:" + duration)
+
+
+def create_tempest_resources():
+ keystone_client = os_utils.get_keystone_client()
+
+ logger.debug("Creating tenant and user for Tempest suite")
+ tenant_id = os_utils.create_tenant(keystone_client,
+ TENANT_NAME,
+ TENANT_DESCRIPTION)
+ if not tenant_id:
+ logger.error("Error : Failed to create %s tenant" % TENANT_NAME)
+
+ user_id = os_utils.create_user(keystone_client, USER_NAME, USER_PASSWORD,
+ None, tenant_id)
+ if not user_id:
+ logger.error("Error : Failed to create %s user" % USER_NAME)
+
+ logger.debug("Creating private network for Tempest suite")
+ network_dic = os_utils.create_shared_network_full(PRIVATE_NET_NAME,
+ PRIVATE_SUBNET_NAME,
+ ROUTER_NAME,
+ PRIVATE_SUBNET_CIDR)
+ if not network_dic:
+ exit(1)
+
+ if USE_CUSTOM_IMAGES:
+ # adding alternative image should be trivial should we need it
+ logger.debug("Creating image for Tempest suite")
+ global IMAGE_ID
+ _, IMAGE_ID = os_utils.get_or_create_image(GLANCE_IMAGE_NAME,
+ GLANCE_IMAGE_PATH,
+ GLANCE_IMAGE_FORMAT)
+ if not IMAGE_ID:
+ exit(-1)
+
+ if USE_CUSTOM_FLAVORS:
+ # adding alternative flavor should be trivial should we need it
+ logger.debug("Creating flavor for Tempest suite")
+ global FLAVOR_ID
+ _, FLAVOR_ID = os_utils.get_or_create_flavor(FLAVOR_NAME,
+ FLAVOR_RAM,
+ FLAVOR_DISK,
+ FLAVOR_VCPUS)
+ if not FLAVOR_ID:
+ exit(-1)
+
+
+def configure_tempest(deployment_dir):
+ """
+ Add/update needed parameters into tempest.conf file generated by Rally
+ """
+
+ tempest_conf_file = deployment_dir + "/tempest.conf"
+ if os.path.isfile(tempest_conf_file):
+ logger.debug("Deleting old tempest.conf file...")
+ os.remove(tempest_conf_file)
+
+ logger.debug("Generating new tempest.conf file...")
+ cmd = "rally verify genconfig"
+ ft_utils.execute_command(cmd)
+
+ logger.debug("Finding tempest.conf file...")
+ if not os.path.isfile(tempest_conf_file):
+ logger.error("Tempest configuration file %s NOT found."
+ % tempest_conf_file)
+ exit(-1)
+
+ logger.debug("Updating selected tempest.conf parameters...")
+ config = ConfigParser.RawConfigParser()
+ config.read(tempest_conf_file)
+ config.set('compute', 'fixed_network_name', PRIVATE_NET_NAME)
+ if USE_CUSTOM_IMAGES:
+ 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 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)
+ config.set('identity', 'tenant_name', TENANT_NAME)
+ config.set('identity', 'username', USER_NAME)
+ config.set('identity', 'password', USER_PASSWORD)
+ config.set('validation', 'ssh_timeout', SSH_TIMEOUT)
+
+ if os.getenv('OS_ENDPOINT_TYPE') is not None:
+ services_list = ['compute', 'volume', 'image', 'network',
+ 'data-processing', 'object-storage', 'orchestration']
+ sections = config.sections()
+ for service in services_list:
+ if service not in sections:
+ config.add_section(service)
+ config.set(service, 'endpoint_type',
+ os.environ.get("OS_ENDPOINT_TYPE"))
+
+ with open(tempest_conf_file, 'wb') as config_file:
+ config.write(config_file)
+
+ # Copy tempest.conf to /home/opnfv/functest/results/tempest/
+ shutil.copyfile(tempest_conf_file, TEMPEST_RESULTS_DIR + '/tempest.conf')
+ return True
+
+
+def read_file(filename):
+ with open(filename) as src:
+ return [line.strip() for line in src.readlines()]
+
+
+def generate_test_list(deployment_dir, mode):
+ logger.debug("Generating test case list...")
+ if mode == 'defcore':
+ shutil.copyfile(TEMPEST_DEFCORE, TEMPEST_RAW_LIST)
+ elif mode == 'custom':
+ if os.path.isfile(TEMPEST_CUSTOM):
+ shutil.copyfile(TEMPEST_CUSTOM, TEMPEST_RAW_LIST)
+ else:
+ logger.error("Tempest test list file %s NOT found."
+ % TEMPEST_CUSTOM)
+ exit(-1)
+ else:
+ if mode == 'smoke':
+ testr_mode = "smoke"
+ elif mode == 'feature_multisite':
+ testr_mode = " | grep -i kingbird "
+ elif mode == 'full':
+ testr_mode = ""
+ else:
+ testr_mode = 'tempest.api.' + mode
+ cmd = ("cd " + deployment_dir + ";" + "testr list-tests " +
+ testr_mode + ">" + TEMPEST_RAW_LIST + ";cd")
+ ft_utils.execute_command(cmd)
+
+
+def apply_tempest_blacklist():
+ logger.debug("Applying tempest blacklist...")
+ cases_file = read_file(TEMPEST_RAW_LIST)
+ result_file = open(TEMPEST_LIST, 'w')
+ black_tests = []
+ try:
+ installer_type = os.getenv('INSTALLER_TYPE')
+ deploy_scenario = os.getenv('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(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:
+ 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_tempest(OPTION):
+ #
+ # the "main" function of the script which launches Rally to run Tempest
+ # :param option: tempest option (smoke, ..)
+ # :return: void
+ #
+ logger.info("Starting Tempest test suite: '%s'." % OPTION)
+ start_time = time.time()
+ stop_time = start_time
+ cmd_line = "rally verify start " + OPTION + " --system-wide"
+
+ header = ("Tempest environment:\n"
+ " Installer: %s\n Scenario: %s\n Node: %s\n Date: %s\n" %
+ (os.getenv('INSTALLER_TYPE', 'Unknown'),
+ os.getenv('DEPLOY_SCENARIO', 'Unknown'),
+ os.getenv('NODE_NAME', 'Unknown'),
+ time.strftime("%a %b %d %H:%M:%S %Z %Y")))
+
+ f_stdout = open(TEMPEST_RESULTS_DIR + "/tempest.log", 'w+')
+ f_stderr = open(TEMPEST_RESULTS_DIR + "/tempest-error.log", 'w+')
+ f_env = open(TEMPEST_RESULTS_DIR + "/environment.log", 'w+')
+ f_env.write(header)
+
+ # subprocess.call(cmd_line, shell=True, stdout=f_stdout, stderr=f_stderr)
+ 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', ''))
+ f_stdout.write(line)
+ p.wait()
+
+ f_stdout.close()
+ f_stderr.close()
+ f_env.close()
+
+ cmd_line = "rally verify show"
+ output = ""
+ p = subprocess.Popen(
+ cmd_line, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+ for line in p.stdout:
+ if re.search("Tests\:", line):
+ break
+ output += line
+ logger.info(output)
+
+ cmd_line = "rally verify list"
+ cmd = os.popen(cmd_line)
+ output = (((cmd.read()).splitlines()[-2]).replace(" ", "")).split("|")
+ # Format:
+ # | UUID | Deployment UUID | smoke | tests | failures | Created at |
+ # Duration | Status |
+ num_tests = output[4]
+ num_failures = output[5]
+ time_start = output[6]
+ duration = output[7]
+ # Compute duration (lets assume it does not take more than 60 min)
+ dur_min = int(duration.split(':')[1])
+ dur_sec_float = float(duration.split(':')[2])
+ dur_sec_int = int(round(dur_sec_float, 0))
+ dur_sec_int = dur_sec_int + 60 * dur_min
+ stop_time = time.time()
+
+ try:
+ diff = (int(num_tests) - int(num_failures))
+ success_rate = 100 * diff / int(num_tests)
+ except:
+ success_rate = 0
+
+ if 'smoke' in args.mode:
+ case_name = 'tempest_smoke_serial'
+ elif 'feature' in args.mode:
+ case_name = args.mode.replace("feature_", "")
+ else:
+ case_name = 'tempest_full_parallel'
+
+ status = ft_utils.check_success_rate(case_name, success_rate)
+ logger.info("Tempest %s success_rate is %s%%, is marked as %s"
+ % (case_name, success_rate, status))
+
+ # Push results in payload of testcase
+ if args.report:
+ # add the test in error in the details sections
+ # should be possible to do it during the test
+ logger.debug("Pushing tempest results into DB...")
+ with open(TEMPEST_RESULTS_DIR + "/tempest.log", 'r') as myfile:
+ output = myfile.read()
+ error_logs = ""
+
+ for match in re.findall('(.*?)[. ]*FAILED', output):
+ error_logs += match
+
+ # Generate json results for DB
+ json_results = {"timestart": time_start, "duration": dur_sec_int,
+ "tests": int(num_tests), "failures": int(num_failures),
+ "errors": error_logs}
+ logger.info("Results: " + str(json_results))
+ # split Tempest smoke and full
+
+ try:
+ ft_utils.push_results_to_db("functest",
+ case_name,
+ start_time,
+ stop_time,
+ status,
+ json_results)
+ except:
+ logger.error("Error pushing results into Database '%s'"
+ % sys.exc_info()[0])
+
+ if status == "PASS":
+ return 0
+ else:
+ return -1
+
+
+def main():
+ global MODE
+
+ if not (args.mode in modes):
+ logger.error("Tempest mode not valid. "
+ "Possible values are:\n" + str(modes))
+ exit(-1)
+
+ if not os.path.exists(TEMPEST_RESULTS_DIR):
+ os.makedirs(TEMPEST_RESULTS_DIR)
+
+ deployment_dir = ft_utils.get_deployment_dir()
+ create_tempest_resources()
+
+ if "" == args.conf:
+ MODE = ""
+ configure_tempest(deployment_dir)
+ else:
+ MODE = " --tempest-config " + args.conf
+
+ generate_test_list(deployment_dir, args.mode)
+ apply_tempest_blacklist()
+
+ MODE += " --tests-file " + TEMPEST_LIST
+ if args.serial:
+ MODE += " --concur 1"
+
+ ret_val = run_tempest(MODE)
+ if ret_val != 0:
+ sys.exit(-1)
+
+ sys.exit(0)
+
+
+if __name__ == '__main__':
+ main()