Merge "Adds a script for tracking bug skips in tempest"
diff --git a/tempest/tests/compute/__init__.py b/tempest/tests/compute/__init__.py
index 14b2be0..e196bd5 100644
--- a/tempest/tests/compute/__init__.py
+++ b/tempest/tests/compute/__init__.py
@@ -31,6 +31,7 @@
 FLAVOR_EXTRA_DATA_ENABLED = False
 MULTI_USER = False
 
+
 # All compute tests -- single setup function
 def setup_package():
     LOG.debug("Entering tempest.tests.compute.setup_package")
@@ -72,8 +73,8 @@
         if user2 and user1 != user2:
             user2_password = CONFIG.compute.alt_password
             user2_tenant_name = CONFIG.compute.alt_tenant_name
-            if not user2_password or user2_tenant_name:
+            if not user2_password or not user2_tenant_name:
                 msg = ("Alternate user specified but not alternate "
-                       "tenant or password") % e
+                       "tenant or password")
                 raise nose.SkipTest(msg)
             MULTI_USER = True
diff --git a/tempest/tests/compute/test_create_server.py b/tempest/tests/compute/test_create_server.py
index 29f98ae..9cc3e45 100644
--- a/tempest/tests/compute/test_create_server.py
+++ b/tempest/tests/compute/test_create_server.py
@@ -65,7 +65,7 @@
         self.assertTrue(self.server_initial['adminPass'] is not None)
 
     @attr(type='smoke')
-    def test_created_server_fields(self):
+    def test_verify_server_details(self):
         """Verify the specified server attributes are set correctly"""
 
         self.assertEqual(self.accessIPv4, self.server['accessIPv4'])
@@ -75,6 +75,22 @@
         self.assertEqual(str(self.flavor_ref), self.server['flavor']['id'])
         self.assertEqual(self.meta, self.server['metadata'])
 
+    @attr(type='smoke')
+    def test_list_servers(self):
+        """The created server should be in the list of all servers"""
+        resp, body = self.client.list_servers()
+        servers = body['servers']
+        found = any([i for i in servers if i['id'] == self.server['id']])
+        self.assertTrue(found)
+
+    @attr(type='smoke')
+    def test_list_servers_with_detail(self):
+        """The created server should be in the detailed list of all servers"""
+        resp, body = self.client.list_servers_with_detail()
+        servers = body['servers']
+        found = any([i for i in servers if i['id'] == self.server['id']])
+        self.assertTrue(found)
+
     @attr(type='positive')
     @unittest.skipIf(not run_ssh, 'Instance validation tests are disabled.')
     def test_can_log_into_created_server(self):
diff --git a/tempest/tests/compute/test_extensions.py b/tempest/tests/compute/test_extensions.py
index 893bc85..1448f05 100644
--- a/tempest/tests/compute/test_extensions.py
+++ b/tempest/tests/compute/test_extensions.py
@@ -27,7 +27,7 @@
         super(ExtensionsTest, cls).setUpClass()
         cls.client = cls.extensions_client
 
-    @attr(type='smoke')
+    @attr(type='positive')
     def test_list_extensions(self):
         """List of all extensions"""
         resp, extensions = self.client.list_extensions()
diff --git a/tempest/tests/compute/test_keypairs.py b/tempest/tests/compute/test_keypairs.py
index 7f07eaf..1c21678 100644
--- a/tempest/tests/compute/test_keypairs.py
+++ b/tempest/tests/compute/test_keypairs.py
@@ -30,7 +30,7 @@
         super(KeyPairsTest, cls).setUpClass()
         cls.client = cls.keypairs_client
 
-    @attr(type='smoke')
+    @attr(type='positive')
     def test_keypairs_create_list_delete(self):
         """Keypairs created should be available in the response list"""
         #Create 3 keypairs
@@ -64,7 +64,7 @@
             resp, _ = self.client.delete_keypair(keypair['name'])
             self.assertEqual(202, resp.status)
 
-    @attr(type='smoke')
+    @attr(type='positive')
     def test_keypair_create_delete(self):
         """Keypair should be created, verified and deleted"""
         k_name = rand_name('keypair-')
@@ -79,7 +79,7 @@
         resp, _ = self.client.delete_keypair(k_name)
         self.assertEqual(202, resp.status)
 
-    @attr(type='smoke')
+    @attr(type='positive')
     @unittest.skip("Skipped until the Bug #980688 is resolved")
     def test_get_keypair_detail(self):
         """Keypair should be created, Got details by name and deleted"""
@@ -102,7 +102,7 @@
             resp, _ = self.client.delete_keypair(k_name)
             self.assertEqual(202, resp.status)
 
-    @attr(type='smoke')
+    @attr(type='positive')
     def test_keypair_create_with_pub_key(self):
         """Keypair should be created with a given public key"""
         k_name = rand_name('keypair-')
diff --git a/tempest/tests/compute/test_list_image_filters.py b/tempest/tests/compute/test_list_image_filters.py
new file mode 100644
index 0000000..4f9fa22
--- /dev/null
+++ b/tempest/tests/compute/test_list_image_filters.py
@@ -0,0 +1,248 @@
+# vim: tabstop=4 shiftwidth=4 softtabstop=4
+
+# Copyright 2012 OpenStack, LLC
+# All Rights Reserved.
+#
+#    Licensed under the Apache License, Version 2.0 (the "License"); you may
+#    not use this file except in compliance with the License. You may obtain
+#    a copy of the License at
+#
+#         http://www.apache.org/licenses/LICENSE-2.0
+#
+#    Unless required by applicable law or agreed to in writing, software
+#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+#    License for the specific language governing permissions and limitations
+#    under the License.
+
+from nose.plugins.attrib import attr
+
+from tempest import exceptions
+from tempest.common.utils.data_utils import rand_name, parse_image_id
+from tempest.tests.compute.base import BaseComputeTest
+
+
+class ListImageFiltersTest(BaseComputeTest):
+
+    @classmethod
+    def setUpClass(cls):
+        super(ListImageFiltersTest, cls).setUpClass()
+        cls.client = cls.images_client
+
+        name = rand_name('server')
+        resp, cls.server1 = cls.servers_client.create_server(name,
+                                                             cls.image_ref,
+                                                             cls.flavor_ref)
+        name = rand_name('server')
+        resp, cls.server2 = cls.servers_client.create_server(name,
+                                                             cls.image_ref,
+                                                             cls.flavor_ref)
+        cls.servers_client.wait_for_server_status(cls.server1['id'], 'ACTIVE')
+        cls.servers_client.wait_for_server_status(cls.server2['id'], 'ACTIVE')
+
+        # Create images to be used in the filter tests
+        image1_name = rand_name('image')
+        resp, body = cls.client.create_image(cls.server1['id'], image1_name)
+        cls.image1_id = parse_image_id(resp['location'])
+        cls.client.wait_for_image_resp_code(cls.image1_id, 200)
+        cls.client.wait_for_image_status(cls.image1_id, 'ACTIVE')
+        resp, cls.image1 = cls.client.get_image(cls.image1_id)
+
+        # Servers have a hidden property for when they are being imaged
+        # Performing back-to-back create image calls on a single
+        # server will sometimes cause failures
+        image3_name = rand_name('image')
+        resp, body = cls.client.create_image(cls.server2['id'], image3_name)
+        cls.image3_id = parse_image_id(resp['location'])
+        cls.client.wait_for_image_resp_code(cls.image3_id, 200)
+        cls.client.wait_for_image_status(cls.image3_id, 'ACTIVE')
+        resp, cls.image3 = cls.client.get_image(cls.image3_id)
+
+        image2_name = rand_name('image')
+        resp, body = cls.client.create_image(cls.server1['id'], image2_name)
+        cls.image2_id = parse_image_id(resp['location'])
+        cls.client.wait_for_image_resp_code(cls.image2_id, 200)
+        cls.client.wait_for_image_status(cls.image2_id, 'ACTIVE')
+        resp, cls.image2 = cls.client.get_image(cls.image2_id)
+
+    @classmethod
+    def tearDownClass(cls):
+        cls.client.delete_image(cls.image1_id)
+        cls.client.delete_image(cls.image2_id)
+        cls.client.delete_image(cls.image3_id)
+        cls.servers_client.delete_server(cls.server1['id'])
+        cls.servers_client.delete_server(cls.server2['id'])
+        super(ListImageFiltersTest, cls).tearDownClass()
+
+    @attr(type='negative')
+    def test_get_image_not_existing(self):
+        """Check raises a NotFound"""
+        self.assertRaises(exceptions.NotFound, self.client.get_image,
+                          "nonexistingimageid")
+
+    @attr(type='positive')
+    def test_list_images_filter_by_status(self):
+        """
+        The list of images should contain only images with the provided status
+        """
+        params = {'status': 'ACTIVE'}
+        resp, images = self.client.list_images(params)
+
+        self.assertTrue(any([i for i in images if i['id'] == self.image1_id]))
+        self.assertTrue(any([i for i in images if i['id'] == self.image2_id]))
+        self.assertTrue(any([i for i in images if i['id'] == self.image3_id]))
+
+    @attr(type='positive')
+    def test_list_images_filter_by_name(self):
+        """
+        List of all images should contain the expected images filtered by name
+        """
+        params = {'name': self.image1['name']}
+        resp, images = self.client.list_images(params)
+
+        self.assertTrue(any([i for i in images if i['id'] == self.image1_id]))
+        self.assertFalse(any([i for i in images if i['id'] == self.image2_id]))
+        self.assertFalse(any([i for i in images if i['id'] == self.image3_id]))
+
+    @attr(type='positive')
+    def test_list_images_filter_by_server_id(self):
+        """The images should contain images filtered by server id"""
+        params = {'server': self.server1['id']}
+        resp, images = self.client.list_images(params)
+
+        self.assertTrue(any([i for i in images if i['id'] == self.image1_id]),
+                        "Failed to find image %s in images. Got images %s" %
+                        (self.image1_id, images))
+        self.assertTrue(any([i for i in images if i['id'] == self.image2_id]))
+        self.assertFalse(any([i for i in images if i['id'] == self.image3_id]))
+
+    @attr(type='positive')
+    def test_list_images_filter_by_server_ref(self):
+        """The list of servers should be filtered by server ref"""
+        server_links = self.server2['links']
+
+        # Try all server link types
+        for link in server_links:
+            params = {'server': link['href']}
+            resp, images = self.client.list_images(params)
+
+            self.assertFalse(any([i for i in images
+                            if i['id'] == self.image1_id]))
+            self.assertFalse(any([i for i in images
+                            if i['id'] == self.image2_id]))
+            self.assertTrue(any([i for i in images
+                            if i['id'] == self.image3_id]))
+
+    @attr(type='positive')
+    def test_list_images_filter_by_type(self):
+        """The list of servers should be filtered by image type"""
+        params = {'type': 'snapshot'}
+        resp, images = self.client.list_images(params)
+
+        self.assertTrue(any([i for i in images if i['id'] == self.image1_id]))
+        self.assertTrue(any([i for i in images if i['id'] == self.image2_id]))
+        self.assertTrue(any([i for i in images if i['id'] == self.image3_id]))
+        self.assertFalse(any([i for i in images if i['id'] == self.image_ref]))
+
+    @attr(type='positive')
+    def test_list_images_limit_results(self):
+        """Verify only the expected number of results are returned"""
+        params = {'limit': '1'}
+        resp, images = self.client.list_images(params)
+        self.assertEqual(1, len(images))
+
+    @attr(type='positive')
+    def test_list_images_filter_by_changes_since(self):
+        """Verify only updated images are returned in the detailed list"""
+
+        #Becoming ACTIVE will modify the updated time
+        #Filter by the image's created time
+        params = {'changes-since': self.image3['created']}
+        resp, images = self.client.list_images(params)
+        found = any([i for i in images if i['id'] == self.image3_id])
+        self.assertTrue(found)
+
+    @attr(type='positive')
+    def test_list_images_with_detail_filter_by_status(self):
+        """
+        Detailed list of all images should only contain images
+        with the provided status
+        """
+        params = {'status': 'ACTIVE'}
+        resp, images = self.client.list_images_with_detail(params)
+
+        self.assertTrue(any([i for i in images if i['id'] == self.image1_id]))
+        self.assertTrue(any([i for i in images if i['id'] == self.image2_id]))
+        self.assertTrue(any([i for i in images if i['id'] == self.image3_id]))
+
+    @attr(type='positive')
+    def test_list_images_with_detail_filter_by_name(self):
+        """
+        Detailed list of all images should contain the expected
+        images filtered by name
+        """
+        params = {'name': self.image1['name']}
+        resp, images = self.client.list_images_with_detail(params)
+
+        self.assertTrue(any([i for i in images if i['id'] == self.image1_id]))
+        self.assertFalse(any([i for i in images if i['id'] == self.image2_id]))
+        self.assertFalse(any([i for i in images if i['id'] == self.image3_id]))
+
+    @attr(type='positive')
+    def test_list_images_with_detail_limit_results(self):
+        """
+        Verify only the expected number of results (with full details)
+        are returned
+        """
+        params = {'limit': '1'}
+        resp, images = self.client.list_images_with_detail(params)
+        self.assertEqual(1, len(images))
+
+    @attr(type='positive')
+    def test_list_images_with_detail_filter_by_server_ref(self):
+        """Detailed list of servers should be filtered by server ref"""
+        server_links = self.server2['links']
+
+        # Try all server link types
+        for link in server_links:
+            params = {'server': link['href']}
+            resp, images = self.client.list_images_with_detail(params)
+
+            self.assertFalse(any([i for i in images
+                            if i['id'] == self.image1_id]))
+            self.assertFalse(any([i for i in images
+                            if i['id'] == self.image2_id]))
+            self.assertTrue(any([i for i in images
+                            if i['id'] == self.image3_id]))
+
+    @attr(type='positive')
+    def test_list_images_with_detail_filter_by_type(self):
+        """The detailed list of servers should be filtered by image type"""
+        params = {'type': 'snapshot'}
+        resp, images = self.client.list_images_with_detail(params)
+        resp, image4 = self.client.get_image(self.image_ref)
+
+        self.assertTrue(any([i for i in images if i['id'] == self.image1_id]))
+        self.assertTrue(any([i for i in images if i['id'] == self.image2_id]))
+        self.assertTrue(any([i for i in images if i['id'] == self.image3_id]))
+        self.assertFalse(any([i for i in images if i['id'] == self.image_ref]))
+
+    @attr(type='positive')
+    def test_list_images_with_detail_filter_by_changes_since(self):
+        """Verify an update image is returned"""
+
+        #Becoming ACTIVE will modify the updated time
+        #Filter by the image's created time
+        params = {'changes-since': self.image1['created']}
+        resp, images = self.client.list_images_with_detail(params)
+        self.assertTrue(any([i for i in images if i['id'] == self.image1_id]))
+
+    @attr(type='negative')
+    def test_get_nonexistant_image(self):
+        """Negative test: GET on non existant image should fail"""
+        try:
+            resp, image = self.client.get_image(999)
+        except:
+            pass
+        else:
+            self.fail('GET on non existant image should fail')
diff --git a/tempest/tests/compute/test_list_images.py b/tempest/tests/compute/test_list_images.py
index fc00235..ca8ec18 100644
--- a/tempest/tests/compute/test_list_images.py
+++ b/tempest/tests/compute/test_list_images.py
@@ -29,49 +29,8 @@
         super(ListImagesTest, cls).setUpClass()
         cls.client = cls.images_client
 
-        name = rand_name('server')
-        resp, cls.server1 = cls.servers_client.create_server(name,
-                                                             cls.image_ref,
-                                                             cls.flavor_ref)
-        name = rand_name('server')
-        resp, cls.server2 = cls.servers_client.create_server(name,
-                                                             cls.image_ref,
-                                                             cls.flavor_ref)
-        cls.servers_client.wait_for_server_status(cls.server1['id'], 'ACTIVE')
-        cls.servers_client.wait_for_server_status(cls.server2['id'], 'ACTIVE')
-
-        # Create images to be used in the filter tests
-        image1_name = rand_name('image')
-        resp, body = cls.client.create_image(cls.server1['id'], image1_name)
-        cls.image1_id = parse_image_id(resp['location'])
-        cls.client.wait_for_image_resp_code(cls.image1_id, 200)
-        cls.client.wait_for_image_status(cls.image1_id, 'ACTIVE')
-        resp, cls.image1 = cls.client.get_image(cls.image1_id)
-
-        # Servers have a hidden property for when they are being imaged
-        # Performing back-to-back create image calls on a single
-        # server will sometimes cause failures
-        image3_name = rand_name('image')
-        resp, body = cls.client.create_image(cls.server2['id'], image3_name)
-        cls.image3_id = parse_image_id(resp['location'])
-        cls.client.wait_for_image_resp_code(cls.image3_id, 200)
-        cls.client.wait_for_image_status(cls.image3_id, 'ACTIVE')
-        resp, cls.image3 = cls.client.get_image(cls.image3_id)
-
-        image2_name = rand_name('image')
-        resp, body = cls.client.create_image(cls.server1['id'], image2_name)
-        cls.image2_id = parse_image_id(resp['location'])
-        cls.client.wait_for_image_resp_code(cls.image2_id, 200)
-        cls.client.wait_for_image_status(cls.image2_id, 'ACTIVE')
-        resp, cls.image2 = cls.client.get_image(cls.image2_id)
-
     @classmethod
     def tearDownClass(cls):
-        cls.client.delete_image(cls.image1_id)
-        cls.client.delete_image(cls.image2_id)
-        cls.client.delete_image(cls.image3_id)
-        cls.servers_client.delete_server(cls.server1['id'])
-        cls.servers_client.delete_server(cls.server2['id'])
         super(ListImagesTest, cls).tearDownClass()
 
     @attr(type='smoke')
@@ -80,12 +39,6 @@
         resp, image = self.client.get_image(self.image_ref)
         self.assertEqual(self.image_ref, image['id'])
 
-    @attr(type='negative')
-    def test_get_image_not_existing(self):
-        """Check raises a NotFound"""
-        self.assertRaises(exceptions.NotFound, self.client.get_image,
-                          "nonexistingimageid")
-
     @attr(type='smoke')
     def test_list_images(self):
         """The list of all images should contain the image"""
@@ -93,178 +46,9 @@
         found = any([i for i in images if i['id'] == self.image_ref])
         self.assertTrue(found)
 
-    @attr(type='positive')
-    def test_list_images_filter_by_status(self):
-        """
-        The list of images should contain only images with the provided status
-        """
-        params = {'status': 'ACTIVE'}
-        resp, images = self.client.list_images(params)
-
-        self.assertTrue(any([i for i in images if i['id'] == self.image1_id]))
-        self.assertTrue(any([i for i in images if i['id'] == self.image2_id]))
-        self.assertTrue(any([i for i in images if i['id'] == self.image3_id]))
-
-    @attr(type='positive')
-    def test_list_images_filter_by_name(self):
-        """
-        List of all images should contain the expected images filtered by name
-        """
-        params = {'name': self.image1['name']}
-        resp, images = self.client.list_images(params)
-
-        self.assertTrue(any([i for i in images if i['id'] == self.image1_id]))
-        self.assertFalse(any([i for i in images if i['id'] == self.image2_id]))
-        self.assertFalse(any([i for i in images if i['id'] == self.image3_id]))
-
-    @attr(type='positive')
-    def test_list_images_filter_by_server_id(self):
-        """The images should contain images filtered by server id"""
-        params = {'server': self.server1['id']}
-        resp, images = self.client.list_images(params)
-
-        self.assertTrue(any([i for i in images if i['id'] == self.image1_id]),
-                        "Failed to find image %s in images. Got images %s" %
-                        (self.image1_id, images))
-        self.assertTrue(any([i for i in images if i['id'] == self.image2_id]))
-        self.assertFalse(any([i for i in images if i['id'] == self.image3_id]))
-
-    @attr(type='positive')
-    def test_list_images_filter_by_server_ref(self):
-        """The list of servers should be filtered by server ref"""
-        server_links = self.server2['links']
-
-        # Try all server link types
-        for link in server_links:
-            params = {'server': link['href']}
-            resp, images = self.client.list_images(params)
-
-            self.assertFalse(any([i for i in images
-                            if i['id'] == self.image1_id]))
-            self.assertFalse(any([i for i in images
-                            if i['id'] == self.image2_id]))
-            self.assertTrue(any([i for i in images
-                            if i['id'] == self.image3_id]))
-
-    @attr(type='positive')
-    def test_list_images_filter_by_type(self):
-        """The list of servers should be filtered by image type"""
-        params = {'type': 'snapshot'}
-        resp, images = self.client.list_images(params)
-
-        self.assertTrue(any([i for i in images if i['id'] == self.image1_id]))
-        self.assertTrue(any([i for i in images if i['id'] == self.image2_id]))
-        self.assertTrue(any([i for i in images if i['id'] == self.image3_id]))
-        self.assertFalse(any([i for i in images if i['id'] == self.image_ref]))
-
-    @attr(type='positive')
-    def test_list_images_limit_results(self):
-        """Verify only the expected number of results are returned"""
-        params = {'limit': '1'}
-        resp, images = self.client.list_images(params)
-        self.assertEqual(1, len(images))
-
-    @attr(type='positive')
-    def test_list_images_filter_by_changes_since(self):
-        """Verify only updated images are returned in the detailed list"""
-
-        #Becoming ACTIVE will modify the updated time
-        #Filter by the image's created time
-        params = {'changes-since': self.image3['created']}
-        resp, images = self.client.list_images(params)
-        found = any([i for i in images if i['id'] == self.image3_id])
-        self.assertTrue(found)
-
     @attr(type='smoke')
     def test_list_images_with_detail(self):
         """Detailed list of all images should contain the expected images"""
         resp, images = self.client.list_images_with_detail()
-
-        self.assertTrue(any([i for i in images if i['id'] == self.image1_id]))
-        self.assertTrue(any([i for i in images if i['id'] == self.image2_id]))
-        self.assertTrue(any([i for i in images if i['id'] == self.image3_id]))
-
-    @attr(type='positive')
-    def test_list_images_with_detail_filter_by_status(self):
-        """
-        Detailed list of all images should only contain images
-        with the provided status
-        """
-        params = {'status': 'ACTIVE'}
-        resp, images = self.client.list_images_with_detail(params)
-
-        self.assertTrue(any([i for i in images if i['id'] == self.image1_id]))
-        self.assertTrue(any([i for i in images if i['id'] == self.image2_id]))
-        self.assertTrue(any([i for i in images if i['id'] == self.image3_id]))
-
-    @attr(type='positive')
-    def test_list_images_with_detail_filter_by_name(self):
-        """
-        Detailed list of all images should contain the expected
-        images filtered by name
-        """
-        params = {'name': self.image1['name']}
-        resp, images = self.client.list_images_with_detail(params)
-
-        self.assertTrue(any([i for i in images if i['id'] == self.image1_id]))
-        self.assertFalse(any([i for i in images if i['id'] == self.image2_id]))
-        self.assertFalse(any([i for i in images if i['id'] == self.image3_id]))
-
-    @attr(type='positive')
-    def test_list_images_with_detail_limit_results(self):
-        """
-        Verify only the expected number of results (with full details)
-        are returned
-        """
-        params = {'limit': '1'}
-        resp, images = self.client.list_images_with_detail(params)
-        self.assertEqual(1, len(images))
-
-    @attr(type='positive')
-    def test_list_images_with_detail_filter_by_server_ref(self):
-        """Detailed list of servers should be filtered by server ref"""
-        server_links = self.server2['links']
-
-        # Try all server link types
-        for link in server_links:
-            params = {'server': link['href']}
-            resp, images = self.client.list_images_with_detail(params)
-
-            self.assertFalse(any([i for i in images
-                            if i['id'] == self.image1_id]))
-            self.assertFalse(any([i for i in images
-                            if i['id'] == self.image2_id]))
-            self.assertTrue(any([i for i in images
-                            if i['id'] == self.image3_id]))
-
-    @attr(type='positive')
-    def test_list_images_with_detail_filter_by_type(self):
-        """The detailed list of servers should be filtered by image type"""
-        params = {'type': 'snapshot'}
-        resp, images = self.client.list_images_with_detail(params)
-        resp, image4 = self.client.get_image(self.image_ref)
-
-        self.assertTrue(any([i for i in images if i['id'] == self.image1_id]))
-        self.assertTrue(any([i for i in images if i['id'] == self.image2_id]))
-        self.assertTrue(any([i for i in images if i['id'] == self.image3_id]))
-        self.assertFalse(any([i for i in images if i['id'] == self.image_ref]))
-
-    @attr(type='positive')
-    def test_list_images_with_detail_filter_by_changes_since(self):
-        """Verify an update image is returned"""
-
-        #Becoming ACTIVE will modify the updated time
-        #Filter by the image's created time
-        params = {'changes-since': self.image1['created']}
-        resp, images = self.client.list_images_with_detail(params)
-        self.assertTrue(any([i for i in images if i['id'] == self.image1_id]))
-
-    @attr(type='negative')
-    def test_get_nonexistant_image(self):
-        """Negative test: GET on non existant image should fail"""
-        try:
-            resp, image = self.client.get_image(999)
-        except:
-            pass
-        else:
-            self.fail('GET on non existant image should fail')
+        found = any([i for i in images if i['id'] == self.image_ref])
+        self.assertTrue(found)
diff --git a/tempest/tests/compute/test_list_servers.py b/tempest/tests/compute/test_list_server_filters.py
similarity index 86%
rename from tempest/tests/compute/test_list_servers.py
rename to tempest/tests/compute/test_list_server_filters.py
index 8c35bb3..23f0f94 100644
--- a/tempest/tests/compute/test_list_servers.py
+++ b/tempest/tests/compute/test_list_server_filters.py
@@ -16,6 +16,7 @@
 #    under the License.
 
 import nose.plugins.skip
+from nose.plugins.attrib import attr
 import unittest2 as unittest
 
 from tempest import exceptions
@@ -24,11 +25,11 @@
 from tempest.tests import utils
 
 
-class ServerDetailsTest(BaseComputeTest):
+class ListServerFiltersTest(BaseComputeTest):
 
     @classmethod
     def setUpClass(cls):
-        super(ServerDetailsTest, cls).setUpClass()
+        super(ListServerFiltersTest, cls).setUpClass()
         cls.client = cls.servers_client
 
         # Check to see if the alternate image ref actually exists...
@@ -84,18 +85,10 @@
         cls.client.delete_server(cls.s1['id'])
         cls.client.delete_server(cls.s2['id'])
         cls.client.delete_server(cls.s3['id'])
-        super(ServerDetailsTest, cls).tearDownClass()
-
-    def test_list_servers(self):
-        """Return a list of all servers"""
-        resp, body = self.client.list_servers()
-        servers = body['servers']
-
-        self.assertTrue(self.s1_min in servers)
-        self.assertTrue(self.s2_min in servers)
-        self.assertTrue(self.s3_min in servers)
+        super(ListServerFiltersTest, cls).tearDownClass()
 
     @utils.skip_unless_attr('multiple_images', 'Only one image found')
+    @attr(type='positive')
     def test_list_servers_filter_by_image(self):
         """Filter the list of servers by image"""
         params = {'image': self.image_ref}
@@ -106,6 +99,7 @@
         self.assertTrue(self.s2_min not in servers)
         self.assertTrue(self.s3_min in servers)
 
+    @attr(type='positive')
     def test_list_servers_filter_by_flavor(self):
         """Filter the list of servers by flavor"""
         params = {'flavor': self.flavor_ref_alt}
@@ -116,6 +110,7 @@
         self.assertTrue(self.s2_min not in servers)
         self.assertTrue(self.s3_min in servers)
 
+    @attr(type='positive')
     def test_list_servers_filter_by_server_name(self):
         """Filter the list of servers by server name"""
         params = {'name': self.s1_name}
@@ -126,6 +121,7 @@
         self.assertTrue(self.s2_min not in servers)
         self.assertTrue(self.s3_min not in servers)
 
+    @attr(type='positive')
     def test_list_servers_filter_by_server_status(self):
         """Filter the list of servers by server status"""
         params = {'status': 'active'}
@@ -136,22 +132,15 @@
         self.assertTrue(self.s2_min in servers)
         self.assertTrue(self.s3_min in servers)
 
+    @attr(type='positive')
     def test_list_servers_limit_results(self):
         """Verify only the expected number of servers are returned"""
         params = {'limit': 1}
         resp, servers = self.client.list_servers_with_detail(params)
         self.assertEqual(1, len(servers['servers']))
 
-    def test_list_servers_with_detail(self):
-        """ Return a detailed list of all servers """
-        resp, body = self.client.list_servers_with_detail()
-        servers = body['servers']
-
-        self.assertTrue(self.s1 in servers)
-        self.assertTrue(self.s2 in servers)
-        self.assertTrue(self.s3 in servers)
-
     @utils.skip_unless_attr('multiple_images', 'Only one image found')
+    @attr(type='positive')
     def test_list_servers_detailed_filter_by_image(self):
         """Filter the detailed list of servers by image"""
         params = {'image': self.image_ref}
@@ -162,6 +151,7 @@
         self.assertTrue(self.s2 not in servers)
         self.assertTrue(self.s3 in servers)
 
+    @attr(type='positive')
     def test_list_servers_detailed_filter_by_flavor(self):
         """Filter the detailed list of servers by flavor"""
         params = {'flavor': self.flavor_ref_alt}
@@ -172,6 +162,7 @@
         self.assertTrue(self.s2 not in servers)
         self.assertTrue(self.s3 in servers)
 
+    @attr(type='positive')
     def test_list_servers_detailed_filter_by_server_name(self):
         """Filter the detailed list of servers by server name"""
         params = {'name': self.s1_name}
@@ -182,6 +173,7 @@
         self.assertTrue(self.s2 not in servers)
         self.assertTrue(self.s3 not in servers)
 
+    @attr(type='positive')
     def test_list_servers_detailed_filter_by_server_status(self):
         """Filter the detailed list of servers by server status"""
         params = {'status': 'active'}
@@ -192,20 +184,13 @@
         self.assertTrue(self.s2 in servers)
         self.assertTrue(self.s3 in servers)
 
+    @attr(type='positive')
     def test_list_servers_detailed_limit_results(self):
         """Verify only the expected number of detailed results are returned"""
         params = {'limit': 1}
         resp, servers = self.client.list_servers_with_detail(params)
         self.assertEqual(1, len(servers['servers']))
 
-    def test_get_server_details(self):
-        """Return the full details of a single server"""
-        resp, server = self.client.get_server(self.s1['id'])
-
-        self.assertEqual(self.s1_name, server['name'])
-        self.assertEqual(self.image_ref, server['image']['id'])
-        self.assertEqual(str(self.flavor_ref), server['flavor']['id'])
-
     @classmethod
     def _convert_to_min_details(self, server):
         min_detail = {}
diff --git a/tempest/tests/compute/test_security_groups.py b/tempest/tests/compute/test_security_groups.py
index 70018b5..f5d9848 100644
--- a/tempest/tests/compute/test_security_groups.py
+++ b/tempest/tests/compute/test_security_groups.py
@@ -60,7 +60,7 @@
                 self.client.delete_security_group(securitygroup['id'])
                 self.assertEqual(202, resp.status)
 
-    @attr(type='smoke')
+    @attr(type='positive')
     def test_security_group_create_delete(self):
         """Security Group should be created, verified and deleted"""
         try:
@@ -82,7 +82,7 @@
             resp, _ = self.client.delete_security_group(securitygroup['id'])
             self.assertEqual(202, resp.status)
 
-    @attr(type='smoke')
+    @attr(type='positive')
     def test_security_group_create_get_delete(self):
         """Security Group should be created, fetched and deleted"""
         try:
diff --git a/tempest/tests/compute/test_server_actions.py b/tempest/tests/compute/test_server_actions.py
index cbef53d..047c791 100644
--- a/tempest/tests/compute/test_server_actions.py
+++ b/tempest/tests/compute/test_server_actions.py
@@ -116,7 +116,7 @@
         resp, server = self.client.get_server(self.server_id)
         self.assertEqual(self.flavor_ref_alt, server['flavor']['id'])
 
-    @attr(type='smoke')
+    @attr(type='positive')
     @unittest.skipIf(not resize_available, 'Resize not available.')
     def test_resize_server_revert(self):
         """
diff --git a/tempest/tests/compute/test_servers.py b/tempest/tests/compute/test_servers.py
index 9c0f1b7..6f2f24c 100644
--- a/tempest/tests/compute/test_servers.py
+++ b/tempest/tests/compute/test_servers.py
@@ -28,7 +28,7 @@
         super(ServersTest, cls).setUpClass()
         cls.client = cls.servers_client
 
-    @attr(type='smoke')
+    @attr(type='positive')
     def test_create_server_with_admin_password(self):
         """
         If an admin password is provided on server creation, the server's root
@@ -74,7 +74,7 @@
                 if server_id:
                     self.client.delete_server(server_id)
 
-    @attr(type='smoke')
+    @attr(type='positive')
     def test_create_specify_keypair(self):
         """Specify a keypair while creating a server"""
 
@@ -95,7 +95,7 @@
             if server:
                 self.client.delete_server(server['id'])
 
-    @attr(type='smoke')
+    @attr(type='positive')
     def test_update_server_name(self):
         """The server name should be changed to the the provided value"""
         try:
@@ -118,7 +118,7 @@
         finally:
             self.client.delete_server(server['id'])
 
-    @attr(type='smoke')
+    @attr(type='positive')
     def test_update_access_server_address(self):
         """
         The server's access addresses should reflect the provided values