Merge "[part1] Remove six"
diff --git a/tempest/api/compute/admin/test_live_migration.py b/tempest/api/compute/admin/test_live_migration.py
index 941315e..52ccea7 100644
--- a/tempest/api/compute/admin/test_live_migration.py
+++ b/tempest/api/compute/admin/test_live_migration.py
@@ -169,8 +169,13 @@
block_migrate_cinder_iscsi,
'Block Live migration not configured for iSCSI')
@utils.services('volume')
- def test_iscsi_volume(self):
- """Test live migrating a server with volume attached"""
+ def test_live_block_migration_with_attached_volume(self):
+ """Test the live-migration of an instance with an attached volume.
+
+ This tests the live-migration of an instance with both a local disk and
+ attach volume. This differs from test_volume_backed_live_migration
+ above that tests live-migration with only an attached volume.
+ """
server = self.create_test_server(wait_until="ACTIVE")
server_id = server['id']
if not CONF.compute_feature_enabled.can_migrate_between_any_hosts:
diff --git a/tempest/api/object_storage/base.py b/tempest/api/object_storage/base.py
index e8f3f8b..478a834 100644
--- a/tempest/api/object_storage/base.py
+++ b/tempest/api/object_storage/base.py
@@ -13,12 +13,9 @@
# License for the specific language governing permissions and limitations
# under the License.
-import time
-
from tempest.common import custom_matchers
from tempest import config
from tempest.lib.common.utils import data_utils
-from tempest.lib.common.utils import test_utils
from tempest.lib import exceptions as lib_exc
import tempest.test
@@ -50,12 +47,11 @@
_, objlist = container_client.list_container_objects(cont, params)
# delete every object in the container
for obj in objlist:
- test_utils.call_and_ignore_notfound_exc(
- object_client.delete_object, cont, obj['name'])
- # sleep 2 seconds to sync the deletion of the objects
- # in HA deployment
- time.sleep(2)
+ object_client.delete_object(cont, obj['name'])
+ object_client.wait_for_resource_deletion(obj['name'], cont)
+ # Verify resource deletion
container_client.delete_container(cont)
+ container_client.wait_for_resource_deletion(cont)
except lib_exc.NotFound:
pass
diff --git a/tempest/lib/common/rest_client.py b/tempest/lib/common/rest_client.py
index 94adaa8..00f2aeb 100644
--- a/tempest/lib/common/rest_client.py
+++ b/tempest/lib/common/rest_client.py
@@ -890,7 +890,7 @@
return True
return 'exceed' in resp_body.get('message', 'blabla')
- def wait_for_resource_deletion(self, id):
+ def wait_for_resource_deletion(self, id, *args, **kwargs):
"""Waits for a resource to be deleted
This method will loop over is_resource_deleted until either
@@ -903,7 +903,7 @@
"""
start_time = int(time.time())
while True:
- if self.is_resource_deleted(id):
+ if self.is_resource_deleted(id, *args, **kwargs):
return
if int(time.time()) - start_time >= self.build_timeout:
message = ('Failed to delete %(resource_type)s %(id)s within '
diff --git a/tempest/lib/services/object_storage/container_client.py b/tempest/lib/services/object_storage/container_client.py
index 8472a97..6d07ec1 100644
--- a/tempest/lib/services/object_storage/container_client.py
+++ b/tempest/lib/services/object_storage/container_client.py
@@ -20,10 +20,18 @@
from oslo_serialization import jsonutils as json
from tempest.lib.common import rest_client
+from tempest.lib import exceptions
class ContainerClient(rest_client.RestClient):
+ def is_resource_deleted(self, container):
+ try:
+ self.list_container_metadata(container)
+ except exceptions.NotFound:
+ return True
+ return False
+
def update_container(self, container_name, **headers):
"""Creates or Updates a container
diff --git a/tempest/lib/services/object_storage/object_client.py b/tempest/lib/services/object_storage/object_client.py
index 8845d79..bb82975 100644
--- a/tempest/lib/services/object_storage/object_client.py
+++ b/tempest/lib/services/object_storage/object_client.py
@@ -23,6 +23,13 @@
class ObjectClient(rest_client.RestClient):
+ def is_resource_deleted(self, object_name, container):
+ try:
+ self.get_object(container, object_name)
+ except exceptions.NotFound:
+ return True
+ return False
+
def create_object(self, container, object_name, data,
params=None, metadata=None, headers=None,
chunked=False):
diff --git a/tempest/lib/services/placement/resource_providers_client.py b/tempest/lib/services/placement/resource_providers_client.py
index fcd220f..e6fbcb2 100644
--- a/tempest/lib/services/placement/resource_providers_client.py
+++ b/tempest/lib/services/placement/resource_providers_client.py
@@ -81,3 +81,29 @@
self.expected_success(200, resp.status)
body = json.loads(body)
return rest_client.ResponseBody(resp, body)
+
+ def update_resource_providers_inventories(self, rp_uuid, **kwargs):
+ """Update resource providers inventories.
+
+ For full list of available parameters, please refer to the official
+ API reference:
+ https://docs.openstack.org/api-ref/placement/#update-resource-provider-inventories
+ """
+ url = '/resource_providers/{}/inventories'.format(rp_uuid)
+ data = json.dumps(kwargs)
+ resp, body = self.put(url, data)
+ self.expected_success(200, resp.status)
+ body = json.loads(body)
+ return rest_client.ResponseBody(resp, body)
+
+ def delete_resource_providers_inventories(self, rp_uuid):
+ """Delete resource providers inventories.
+
+ For full list of available parameters, please refer to the official
+ API reference:
+ https://docs.openstack.org/api-ref/placement/#delete-resource-provider-inventories
+ """
+ url = '/resource_providers/{}/inventories'.format(rp_uuid)
+ resp, body = self.delete(url)
+ self.expected_success(204, resp.status)
+ return rest_client.ResponseBody(resp, body)
diff --git a/tempest/tests/lib/services/placement/test_resource_providers_client.py b/tempest/tests/lib/services/placement/test_resource_providers_client.py
index 11aeaf2..485f584 100644
--- a/tempest/tests/lib/services/placement/test_resource_providers_client.py
+++ b/tempest/tests/lib/services/placement/test_resource_providers_client.py
@@ -48,6 +48,43 @@
FAKE_RESOURCE_PROVIDER_AGGREGATES = {
'aggregates': [FAKE_AGGREGATE_UUID]
}
+ FAKE_RESOURCE_UPDATE_INVENTORIES_RESPONSE = {
+ "inventories": {
+ "MEMORY_MB": {
+ "allocation_ratio": 2.0,
+ "max_unit": 16,
+ "min_unit": 1,
+ "reserved": 0,
+ "step_size": 4,
+ "total": 128
+ },
+ "VCPU": {
+ "allocation_ratio": 10.0,
+ "max_unit": 2147483647,
+ "min_unit": 1,
+ "reserved": 2,
+ "step_size": 1,
+ "total": 64
+ }
+ },
+ "resource_provider_generation": 2
+ }
+ FAKE_RESOURCE_UPDATE_INVENTORIES_REQUEST = {
+ "inventories": {
+ "MEMORY_MB": {
+ "allocation_ratio": 2.0,
+ "max_unit": 16,
+ "step_size": 4,
+ "total": 128
+ },
+ "VCPU": {
+ "allocation_ratio": 10.0,
+ "reserved": 2,
+ "total": 64
+ }
+ },
+ "resource_provider_generation": 1
+ }
def setUp(self):
super(TestResourceProvidersClient, self).setUp()
@@ -102,6 +139,32 @@
def test_list_resource_provider_inventories_with_bytes_body(self):
self._test_list_resource_provider_inventories(bytes_body=True)
+ def _test_update_resource_providers_inventories(self, bytes_body=False):
+ self.check_service_client_function(
+ self.client.update_resource_providers_inventories,
+ 'tempest.lib.common.rest_client.RestClient.put',
+ self.FAKE_RESOURCE_UPDATE_INVENTORIES_RESPONSE,
+ to_utf=bytes_body,
+ status=200,
+ rp_uuid=self.FAKE_RESOURCE_PROVIDER_UUID,
+ **self.FAKE_RESOURCE_UPDATE_INVENTORIES_REQUEST
+ )
+
+ def test_update_resource_providers_inventories_with_str_body(self):
+ self._test_update_resource_providers_inventories()
+
+ def test_update_resource_providers_inventories_with_bytes_body(self):
+ self._test_update_resource_providers_inventories(bytes_body=True)
+
+ def test_delete_resource_providers_inventories(self):
+ self.check_service_client_function(
+ self.client.delete_resource_providers_inventories,
+ 'tempest.lib.common.rest_client.RestClient.delete',
+ {},
+ status=204,
+ rp_uuid=self.FAKE_RESOURCE_PROVIDER_UUID,
+ )
+
def _test_list_resource_provider_aggregates(self, bytes_body=False):
self.check_service_client_function(
self.client.list_resource_provider_aggregates,