Fix smoke tests to delete resources synchronously.

 * As per a recommendation by Jay Pipes.

Change-Id: I55c07c82de795409ac0cf70f3b78af4937fa530a
diff --git a/tempest/smoke.py b/tempest/smoke.py
index c929273..68d0927 100644
--- a/tempest/smoke.py
+++ b/tempest/smoke.py
@@ -51,15 +51,29 @@
         # order, and because test methods in smoke tests generally create
         # resources in a particular order, we destroy resources in the reverse
         # order in which resources are added to the smoke test class object
-        if not cls.resources:
-            return
-        thing = cls.resources.pop()
-        while True:
+        while cls.resources:
+            thing = cls.resources.pop()
             LOG.debug("Deleting %r from shared resources of %s" %
                       (thing, cls.__name__))
-            # Resources in novaclient all have a delete() method
-            # which destroys the resource...
+
+            # OpenStack resources are assumed to have a delete()
+            # method which destroys the resource...
             thing.delete()
-            if not cls.resources:
-                return
-            thing = cls.resources.pop()
+
+            def is_deletion_complete():
+                # Deletion testing is only required for objects whose
+                # existence cannot be checked via retrieval.
+                if isinstance(thing, dict):
+                    return True
+                try:
+                    thing.get()
+                except Exception as e:
+                    # Clients are expected to return an exception
+                    # called 'NotFound' if retrieval fails.
+                    if e.__class__.__name__ == 'NotFound':
+                        return True
+                    raise
+                return False
+
+            # Block until resource deletion has completed or timed-out
+            test.call_until_true(is_deletion_complete, 10, 1)