Merge "Move response validation schema's in sub folder"
diff --git a/tempest/api/compute/limits/test_absolute_limits_negative.py b/tempest/api/compute/limits/test_absolute_limits_negative.py
index f88699b..b2e2981 100644
--- a/tempest/api/compute/limits/test_absolute_limits_negative.py
+++ b/tempest/api/compute/limits/test_absolute_limits_negative.py
@@ -39,7 +39,9 @@
         for xx in range(max_meta_data):
             meta_data[str(xx)] = str(xx)
 
-        self.assertRaises(exceptions.OverLimit,
+        # A 403 Forbidden or 413 Overlimit (old behaviour) exception
+        # will be raised when out of quota
+        self.assertRaises((exceptions.Unauthorized, exceptions.OverLimit),
                           self.server_client.create_server,
                           name='test', meta=meta_data,
                           flavor_ref=self.flavor_ref,
diff --git a/tempest/api/compute/servers/test_server_personality.py b/tempest/api/compute/servers/test_server_personality.py
index b7e4e38..6cc463d 100644
--- a/tempest/api/compute/servers/test_server_personality.py
+++ b/tempest/api/compute/servers/test_server_personality.py
@@ -40,8 +40,10 @@
             path = 'etc/test' + str(i) + '.txt'
             personality.append({'path': path,
                                 'contents': base64.b64encode(file_contents)})
-        self.assertRaises(exceptions.OverLimit, self.create_test_server,
-                          personality=personality)
+        # A 403 Forbidden or 413 Overlimit (old behaviour) exception
+        # will be raised when out of quota
+        self.assertRaises((exceptions.Unauthorized, exceptions.OverLimit),
+                          self.create_test_server, personality=personality)
 
     @test.attr(type='gate')
     def test_can_create_server_with_max_number_personality_files(self):
diff --git a/tempest/api/identity/admin/test_roles.py b/tempest/api/identity/admin/test_roles.py
index 7a6d07f..492d56f 100644
--- a/tempest/api/identity/admin/test_roles.py
+++ b/tempest/api/identity/admin/test_roles.py
@@ -49,7 +49,7 @@
 
     @test.attr(type='gate')
     def test_list_roles(self):
-        # Return a list of all roles
+        """Return a list of all roles."""
         _, body = self.client.list_roles()
         found = [role for role in body if role in self.data.roles]
         self.assertTrue(any(found))
@@ -57,7 +57,7 @@
 
     @test.attr(type='gate')
     def test_role_create_delete(self):
-        # Role should be created, verified, and deleted
+        """Role should be created, verified, and deleted."""
         role_name = data_utils.rand_name(name='role-test-')
         _, body = self.client.create_role(role_name)
         self.assertEqual(role_name, body['name'])
@@ -74,7 +74,7 @@
 
     @test.attr(type='gate')
     def test_get_role_by_id(self):
-        # Get a role by its id
+        """Get a role by its id."""
         self.data.setup_test_role()
         role_id = self.data.role['id']
         role_name = self.data.role['name']
@@ -84,7 +84,7 @@
 
     @test.attr(type='gate')
     def test_assign_user_role(self):
-        # Assign a role to a user on a tenant
+        """Assign a role to a user on a tenant."""
         (user, tenant, role) = self._get_role_params()
         self.client.assign_user_role(tenant['id'], user['id'], role['id'])
         _, roles = self.client.list_user_roles(tenant['id'], user['id'])
@@ -92,7 +92,7 @@
 
     @test.attr(type='gate')
     def test_remove_user_role(self):
-        # Remove a role assigned to a user on a tenant
+        """Remove a role assigned to a user on a tenant."""
         (user, tenant, role) = self._get_role_params()
         _, user_role = self.client.assign_user_role(tenant['id'],
                                                     user['id'], role['id'])
@@ -101,7 +101,7 @@
 
     @test.attr(type='gate')
     def test_list_user_roles(self):
-        # List roles assigned to a user on tenant
+        """List roles assigned to a user on tenant."""
         (user, tenant, role) = self._get_role_params()
         self.client.assign_user_role(tenant['id'], user['id'], role['id'])
         _, roles = self.client.list_user_roles(tenant['id'], user['id'])
diff --git a/tempest/api/telemetry/test_telemetry_notification_api.py b/tempest/api/telemetry/test_telemetry_notification_api.py
index 2a170c7..9b15c51 100644
--- a/tempest/api/telemetry/test_telemetry_notification_api.py
+++ b/tempest/api/telemetry/test_telemetry_notification_api.py
@@ -47,6 +47,7 @@
     @test.services("image")
     @testtools.skipIf(not CONF.image_feature_enabled.api_v1,
                       "Glance api v1 is disabled")
+    @test.skip_because(bug='1351627')
     def test_check_glance_v1_notifications(self):
         _, body = self.create_image(self.image_client)
         self.image_client.update_image(body['id'], data='data')
@@ -62,6 +63,7 @@
     @test.services("image")
     @testtools.skipIf(not CONF.image_feature_enabled.api_v2,
                       "Glance api v2 is disabled")
+    @test.skip_because(bug='1351627')
     def test_check_glance_v2_notifications(self):
         _, body = self.create_image(self.image_client_v2)
 
diff --git a/tempest/cmd/javelin.py b/tempest/cmd/javelin.py
index 67b92b0..3616a82 100755
--- a/tempest/cmd/javelin.py
+++ b/tempest/cmd/javelin.py
@@ -309,6 +309,14 @@
     return name, fname
 
 
+def _get_image_by_name(client, name):
+    r, body = client.images.image_list()
+    for image in body:
+        if name == image['name']:
+            return image
+    return None
+
+
 def create_images(images):
     if not images:
         return
@@ -317,9 +325,7 @@
         client = client_for_user(image['owner'])
 
         # only upload a new image if the name isn't there
-        r, body = client.images.image_list()
-        names = [x['name'] for x in body]
-        if image['name'] in names:
+        if _get_image_by_name(client, image['name']):
             LOG.info("Image '%s' already exists" % image['name'])
             continue
 
@@ -345,6 +351,20 @@
         client.images.store_image(image_id, open(fname, 'r'))
 
 
+def destroy_images(images):
+    if not images:
+        return
+    LOG.info("Destroying images")
+    for image in images:
+        client = client_for_user(image['owner'])
+
+        response = _get_image_by_name(client, image['name'])
+        if not response:
+            LOG.info("Image '%s' does not exists" % image['name'])
+            continue
+        client.images.delete_image(response['id'])
+
+
 #######################
 #
 # SERVERS
@@ -359,14 +379,6 @@
     return None
 
 
-def _get_image_by_name(client, name):
-    r, body = client.images.image_list()
-    for image in body:
-        if name == image['name']:
-            return image
-    return None
-
-
 def _get_flavor_by_name(client, name):
     r, body = client.flavors.list_flavors()
     for flavor in body:
@@ -478,13 +490,14 @@
     # destroy_volumes
 
     destroy_servers(RES['servers'])
-    LOG.warn("Destroy mode incomplete")
-    # destroy_images
+    destroy_images(RES['images'])
     # destroy_objects
 
     # destroy_users
     # destroy_tenants
 
+    LOG.warn("Destroy mode incomplete")
+
 
 def get_options():
     global OPTS
diff --git a/tempest/test.py b/tempest/test.py
index 5b7330b..95ae23f 100644
--- a/tempest/test.py
+++ b/tempest/test.py
@@ -623,7 +623,6 @@
     while now < timeout:
         if func():
             return True
-        LOG.debug("Sleeping for %d seconds", sleep_for)
         time.sleep(sleep_for)
         now = time.time()
     return False