Merge "    Adds an identity admin client and API tests for keystone roles."
diff --git a/tempest/common/utils/data_utils.py b/tempest/common/utils/data_utils.py
index 2d540f4..752bc10 100644
--- a/tempest/common/utils/data_utils.py
+++ b/tempest/common/utils/data_utils.py
@@ -37,3 +37,10 @@
         url += urllib.urlencode(params)
 
     return url
+
+
+def parse_image_id(image_ref):
+    """Return the image id from a given image ref"""
+    temp = image_ref.rsplit('/')
+    #Return the last item, which is the image id
+    return temp[len(temp) - 1]
diff --git a/tempest/services/nova/json/servers_client.py b/tempest/services/nova/json/servers_client.py
index 08ac6df..53b2d6f 100644
--- a/tempest/services/nova/json/servers_client.py
+++ b/tempest/services/nova/json/servers_client.py
@@ -21,6 +21,7 @@
         flavor_ref (Required): The flavor used to build the server.
         Following optional keyword arguments are accepted:
         adminPass: Sets the initial root password.
+        key_name: Key name of keypair that was created earlier.
         meta: A dictionary of values to be used as metadata.
         personality: A list of dictionaries for files to be injected into
         the server.
@@ -40,7 +41,7 @@
             'flavorRef': flavor_ref
         }
 
-        for option in ['personality', 'adminPass',
+        for option in ['personality', 'adminPass', 'key_name',
                         'security_groups', 'networks', 'user_data',
                         'availability_zone', 'accessIPv4', 'accessIPv6',
                         'min_count', 'max_count', ('metadata', 'meta'),
diff --git a/tempest/tests/test_authorization.py b/tempest/tests/test_authorization.py
index 9f3c34d..e66446d 100644
--- a/tempest/tests/test_authorization.py
+++ b/tempest/tests/test_authorization.py
@@ -4,9 +4,7 @@
 from nose.tools import raises
 
 from tempest import openstack
-from tempest.services.nova.json.images_client import ImagesClient
-from tempest.services.nova.json.servers_client import ServersClient
-from tempest.common.utils.data_utils import rand_name
+from tempest.common.utils.data_utils import rand_name, parse_image_id
 from tempest import exceptions
 from tempest.tests import utils
 
@@ -53,7 +51,7 @@
 
                 name = rand_name('image')
                 resp, body = cls.client.create_image(server['id'], name)
-                image_id = cls._parse_image_id(resp['location'])
+                image_id = parse_image_id(resp['location'])
                 cls.images_client.wait_for_image_resp_code(image_id, 200)
                 cls.images_client.wait_for_image_status(image_id, 'ACTIVE')
                 resp, cls.image = cls.images_client.get_image(image_id)
@@ -162,9 +160,3 @@
         finally:
             # Reset the base_url...
             self.other_client.base_url = saved_base_url
-
-    @classmethod
-    def _parse_image_id(self, image_ref):
-        temp = image_ref.rsplit('/')
-        #Return the last item, which is the image id
-        return temp[len(temp) - 1]
diff --git a/tempest/tests/test_floating_ips_actions.py b/tempest/tests/test_floating_ips_actions.py
index cc69048..563d0e3 100644
--- a/tempest/tests/test_floating_ips_actions.py
+++ b/tempest/tests/test_floating_ips_actions.py
@@ -11,7 +11,6 @@
 
     @classmethod
     def setUpClass(cls):
-        cls.os = openstack.Manager()
         cls.client = cls.floating_ips_client
         cls.servers_client = cls.servers_client
 
@@ -49,16 +48,18 @@
         Positive test:Allocation of a new floating IP to a project
         should be succesfull
         """
-        resp, body = self.client.create_floating_ip()
-        self.assertEqual(200, resp.status)
-        floating_ip_id_allocated = body['id']
-        resp, floating_ip_details = \
+        try:
+            resp, body = self.client.create_floating_ip()
+            self.assertEqual(200, resp.status)
+            floating_ip_id_allocated = body['id']
+            resp, floating_ip_details = \
                 self.client.get_floating_ip_details(floating_ip_id_allocated)
-        #Checking if the details of allocated IP is in list of floating IP
-        resp, body = self.client.list_floating_ips()
-        self.assertTrue(floating_ip_details in body)
-        #Deleting the floating IP which is created in this method
-        self.client.delete_floating_ip(floating_ip_id_allocated)
+            #Checking if the details of allocated IP is in list of floating IP
+            resp, body = self.client.list_floating_ips()
+            self.assertTrue(floating_ip_details in body)
+        finally:
+            #Deleting the floating IP which is created in this method
+            self.client.delete_floating_ip(floating_ip_id_allocated)
 
     @attr(type='positive')
     def test_delete_floating_ip(self):
diff --git a/tempest/tests/test_images.py b/tempest/tests/test_images.py
index 716da65..33020d6 100644
--- a/tempest/tests/test_images.py
+++ b/tempest/tests/test_images.py
@@ -5,11 +5,7 @@
 from base_compute_test import BaseComputeTest
 import tempest.config
 from tempest import openstack
-
-
-def _parse_image_id(image_ref):
-    temp = image_ref.rsplit('images/')
-    return temp[1]
+from tempest.common.utils import data_utils
 
 
 class ImagesTest(BaseComputeTest):
@@ -38,7 +34,7 @@
         name = rand_name('image')
         meta = {'image_type': 'test'}
         resp, body = self.client.create_image(server['id'], name, meta)
-        image_id = _parse_image_id(resp['location'])
+        image_id = data_utils.parse_image_id(resp['location'])
         self.client.wait_for_image_resp_code(image_id, 200)
         self.client.wait_for_image_status(image_id, 'ACTIVE')
 
@@ -78,7 +74,7 @@
             pass
 
         else:
-            image_id = _parse_image_id(resp['location'])
+            image_id = data_utils.parse_image_id(resp['location'])
             self.client.wait_for_image_resp_code(image_id, 200)
             self.client.wait_for_image_status(image_id, 'ACTIVE')
             self.client.delete_image(image_id)
diff --git a/tempest/tests/test_keypairs.py b/tempest/tests/test_keypairs.py
index 14e1317..fde9de1 100644
--- a/tempest/tests/test_keypairs.py
+++ b/tempest/tests/test_keypairs.py
@@ -10,7 +10,6 @@
 
     @classmethod
     def setUpClass(cls):
-        cls.os = openstack.Manager()
         cls.client = cls.keypairs_client
 
     @attr(type='smoke')
diff --git a/tempest/tests/test_list_floating_ips.py b/tempest/tests/test_list_floating_ips.py
index d100c01..03ed089 100644
--- a/tempest/tests/test_list_floating_ips.py
+++ b/tempest/tests/test_list_floating_ips.py
@@ -39,23 +39,25 @@
     def test_get_floating_ip_details(self):
         """Positive test:Should be able to GET the details of floatingIP"""
         #Creating a floating IP for which details are to be checked
-        resp, body = self.client.create_floating_ip()
-        floating_ip_instance_id = body['instance_id']
-        floating_ip_ip = body['ip']
-        floating_ip_fixed_ip = body['fixed_ip']
-        floating_ip_id = body['id']
-        resp, body = \
-            self.client.get_floating_ip_details(floating_ip_id)
-        self.assertEqual(200, resp.status)
-        #Comparing the details of floating IP
-        self.assertEqual(floating_ip_instance_id,
+        try:
+            resp, body = self.client.create_floating_ip()
+            floating_ip_instance_id = body['instance_id']
+            floating_ip_ip = body['ip']
+            floating_ip_fixed_ip = body['fixed_ip']
+            floating_ip_id = body['id']
+            resp, body = \
+                self.client.get_floating_ip_details(floating_ip_id)
+            self.assertEqual(200, resp.status)
+            #Comparing the details of floating IP
+            self.assertEqual(floating_ip_instance_id,
                             body['instance_id'])
-        self.assertEqual(floating_ip_ip, body['ip'])
-        self.assertEqual(floating_ip_fixed_ip,
+            self.assertEqual(floating_ip_ip, body['ip'])
+            self.assertEqual(floating_ip_fixed_ip,
                             body['fixed_ip'])
-        self.assertEqual(floating_ip_id, body['id'])
+            self.assertEqual(floating_ip_id, body['id'])
         #Deleting the floating IP created in this method
-        self.client.delete_floating_ip(floating_ip_id)
+        finally:
+            self.client.delete_floating_ip(floating_ip_id)
 
     @attr(type='negative')
     @unittest.skip('Skipping until Nova Bug 940500 is fixed')
diff --git a/tempest/tests/test_list_images.py b/tempest/tests/test_list_images.py
index 9d2bb1b..810e933 100644
--- a/tempest/tests/test_list_images.py
+++ b/tempest/tests/test_list_images.py
@@ -1,14 +1,8 @@
 from nose.plugins.attrib import attr
 
 from tempest import exceptions
-from tempest import openstack
 from base_compute_test import BaseComputeTest
-from tempest.common.utils.data_utils import rand_name
-
-
-def _parse_image_id(image_ref):
-    temp = image_ref.rsplit('/')
-    return temp[len(temp) - 1]
+from tempest.common.utils.data_utils import rand_name, parse_image_id
 
 
 class ListImagesTest(BaseComputeTest):
@@ -31,7 +25,7 @@
         # 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.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)
@@ -41,14 +35,14 @@
         # 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.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.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)
diff --git a/tempest/tests/test_servers.py b/tempest/tests/test_servers.py
index 414d58a..b152b4c 100644
--- a/tempest/tests/test_servers.py
+++ b/tempest/tests/test_servers.py
@@ -54,58 +54,65 @@
         password should be set to that password.
         """
 
-        name = rand_name('server')
-        resp, server = self.client.create_server(name, self.image_ref,
+        try:
+            name = rand_name('server')
+            resp, server = self.client.create_server(name, self.image_ref,
                                                  self.flavor_ref,
                                                  adminPass='testpassword')
 
-        #Verify the password is set correctly in the response
-        self.assertEqual('testpassword', server['adminPass'])
+            #Verify the password is set correctly in the response
+            self.assertEqual('testpassword', server['adminPass'])
 
         #Teardown
-        self.client.delete_server(server['id'])
+        finally:
+            self.client.delete_server(server['id'])
 
     @attr(type='smoke')
     def test_update_server_name(self):
         """The server name should be changed to the the provided value"""
-        name = rand_name('server')
-        resp, server = self.client.create_server(name, self.image_ref,
+        try:
+            name = rand_name('server')
+            resp, server = self.client.create_server(name, self.image_ref,
                                                  self.flavor_ref)
-        self.client.wait_for_server_status(server['id'], 'ACTIVE')
+            self.client.wait_for_server_status(server['id'], 'ACTIVE')
 
-        #Update the server with a new name
-        resp, server = self.client.update_server(server['id'], name='newname')
-        self.assertEquals(200, resp.status)
-        self.client.wait_for_server_status(server['id'], 'ACTIVE')
+            #Update the server with a new name
+            resp, server = self.client.update_server(server['id'],
+                                                 name='newname')
+            self.assertEquals(200, resp.status)
+            self.client.wait_for_server_status(server['id'], 'ACTIVE')
 
-        #Verify the name of the server has changed
-        resp, server = self.client.get_server(server['id'])
-        self.assertEqual('newname', server['name'])
+            #Verify the name of the server has changed
+            resp, server = self.client.get_server(server['id'])
+            self.assertEqual('newname', server['name'])
 
         #Teardown
-        self.client.delete_server(server['id'])
+        finally:
+            self.client.delete_server(server['id'])
 
     @attr(type='smoke')
     def test_update_access_server_address(self):
         """
         The server's access addresses should reflect the provided values
         """
-        name = rand_name('server')
-        resp, server = self.client.create_server(name, self.image_ref,
+        try:
+            name = rand_name('server')
+            resp, server = self.client.create_server(name, self.image_ref,
                                                  self.flavor_ref)
-        self.client.wait_for_server_status(server['id'], 'ACTIVE')
+            self.client.wait_for_server_status(server['id'], 'ACTIVE')
 
-        #Update the IPv4 and IPv6 access addresses
-        resp, body = self.client.update_server(server['id'],
+            #Update the IPv4 and IPv6 access addresses
+            resp, body = self.client.update_server(server['id'],
                                                accessIPv4='1.1.1.1',
                                                accessIPv6='::babe:2.2.2.2')
-        self.assertEqual(200, resp.status)
-        self.client.wait_for_server_status(server['id'], 'ACTIVE')
+            self.assertEqual(200, resp.status)
+            self.client.wait_for_server_status(server['id'], 'ACTIVE')
 
-        #Verify the access addresses have been updated
-        resp, server = self.client.get_server(server['id'])
-        self.assertEqual('1.1.1.1', server['accessIPv4'])
-        self.assertEqual('::babe:2.2.2.2', server['accessIPv6'])
+            #Verify the access addresses have been updated
+            resp, server = self.client.get_server(server['id'])
+            self.assertEqual('1.1.1.1', server['accessIPv4'])
+            self.assertEqual('::babe:2.2.2.2', server['accessIPv6'])
 
         #Teardown
-        self.client.delete_server(server['id'])
+        finally:
+            self.client.delete_server(server['id'])