Merge "Removes assertGreaterEqual for Python 2.6 backward compat"
diff --git a/tempest/services/identity/json/identity_client.py b/tempest/services/identity/json/identity_client.py
index 9cc30d9..403a3ac 100644
--- a/tempest/services/identity/json/identity_client.py
+++ b/tempest/services/identity/json/identity_client.py
@@ -197,6 +197,12 @@
         body = json.loads(body)
         return resp, body['OS-KSADM:service']
 
+    def list_services(self):
+        """List Service - Returns Services."""
+        resp, body = self.get('/OS-KSADM/services/')
+        body = json.loads(body)
+        return resp, body['OS-KSADM:services']
+
     def delete_service(self, service_id):
         """Delete Service."""
         url = '/OS-KSADM/services/%s' % service_id
diff --git a/tempest/services/identity/xml/identity_client.py b/tempest/services/identity/xml/identity_client.py
index 02be91e..f79c3d5 100644
--- a/tempest/services/identity/xml/identity_client.py
+++ b/tempest/services/identity/xml/identity_client.py
@@ -226,6 +226,12 @@
         body = self._parse_body(etree.fromstring(body))
         return resp, body
 
+    def list_services(self):
+        """Returns services."""
+        resp, body = self.get('OS-KSADM/services', self.headers)
+        body = self._parse_array(etree.fromstring(body))
+        return resp, body
+
     def get_service(self, service_id):
         """Get Service."""
         url = '/OS-KSADM/services/%s' % service_id
diff --git a/tempest/tests/identity/admin/test_services.py b/tempest/tests/identity/admin/test_services.py
index 5261b9d..73f4a90 100644
--- a/tempest/tests/identity/admin/test_services.py
+++ b/tempest/tests/identity/admin/test_services.py
@@ -16,6 +16,9 @@
 #    under the License.
 
 
+from nose.plugins.attrib import attr
+import unittest2 as unittest
+
 from tempest.common.utils.data_utils import rand_name
 from tempest import exceptions
 from tempest.tests.identity import base
@@ -30,8 +33,8 @@
             name = rand_name('service-')
             type = rand_name('type--')
             description = rand_name('description-')
-            resp, service_data = \
-            self.client.create_service(name, type, description=description)
+            resp, service_data = self.client.create_service(
+                name, type, description=description)
             self.assertTrue(resp['status'].startswith('2'))
             #Verifying response body of create service
             self.assertTrue('id' in service_data)
@@ -63,6 +66,32 @@
             self.assertRaises(exceptions.NotFound, self.client.get_service,
                               service_data['id'])
 
+    def test_list_services(self):
+        # Create, List, Verify and Delete Services
+        services = []
+        for _ in xrange(3):
+            name = rand_name('service-')
+            type = rand_name('type--')
+            description = rand_name('description-')
+            resp, service = self.client.create_service(
+                name, type, description=description)
+            services.append(service)
+        service_ids = map(lambda x: x['id'], services)
+
+        # List and Verify Services
+        resp, body = self.client.list_services()
+        self.assertTrue(resp['status'].startswith('2'))
+        found = [service for service in body if service['id'] in service_ids]
+        self.assertEqual(len(found), len(services), 'Services not found')
+
+        # Delete Services
+        for service in services:
+            resp, body = self.client.delete_service(service['id'])
+            self.assertTrue(resp['status'].startswith('2'))
+        resp, body = self.client.list_services()
+        found = [service for service in body if service['id'] in service_ids]
+        self.assertFalse(any(found), 'Services failed to delete')
+
 
 class ServicesTestJSON(base.BaseIdentityAdminTestJSON, ServicesTestBase):
     @classmethod