Merge "Add XML support for extensions_client"
diff --git a/tempest/manager.py b/tempest/manager.py
index 746cf4f..228c3b9 100644
--- a/tempest/manager.py
+++ b/tempest/manager.py
@@ -44,7 +44,7 @@
 FlavorsClient = flavors_client.FlavorsClientJSON
 ServersClient = servers_client.ServersClientJSON
 LimitsClient = limits_client.LimitsClientJSON
-ExtensionsClient = extensions_client.ExtensionsClient
+ExtensionsClient = extensions_client.ExtensionsClientJSON
 SecurityGroupsClient = security_groups_client.SecurityGroupsClient
 FloatingIPsClient = floating_ips_client.FloatingIPsClient
 KeyPairsClient = keypairs_client.KeyPairsClientJSON
diff --git a/tempest/openstack.py b/tempest/openstack.py
index 945ce3a..27ae6c0 100644
--- a/tempest/openstack.py
+++ b/tempest/openstack.py
@@ -21,12 +21,12 @@
 from tempest import exceptions
 from tempest.services.image import service as image_service
 from tempest.services.network.json.network_client import NetworkClient
+from tempest.services.nova.json.extensions_client import ExtensionsClientJSON
 from tempest.services.nova.json.flavors_client import FlavorsClientJSON
 from tempest.services.volume.json.volumes_client import VolumesClient
 from tempest.services.nova.json.images_client import ImagesClient
 from tempest.services.nova.json.limits_client import LimitsClientJSON
 from tempest.services.nova.json.servers_client import ServersClientJSON
-from tempest.services.nova.json.extensions_client import ExtensionsClient
 from tempest.services.nova.json.security_groups_client \
 import SecurityGroupsClient
 from tempest.services.nova.json.floating_ips_client import FloatingIPsClient
@@ -35,6 +35,7 @@
 import VolumesExtensionsClient
 from tempest.services.nova.json.console_output_client \
 import ConsoleOutputsClient
+from tempest.services.nova.xml.extensions_client import ExtensionsClientXML
 from tempest.services.nova.xml.flavors_client import FlavorsClientXML
 from tempest.services.nova.xml.keypairs_client import KeyPairsClientXML
 from tempest.services.nova.xml.limits_client import LimitsClientXML
@@ -62,6 +63,11 @@
     "xml": FlavorsClientXML
 }
 
+EXTENSIONS_CLIENTS = {
+    "json": ExtensionsClientJSON,
+    "xml": ExtensionsClientXML
+}
+
 
 class Manager(object):
 
@@ -108,11 +114,12 @@
             self.limits_client = LIMITS_CLIENTS[interface](*client_args)
             self.keypairs_client = KEYPAIRS_CLIENTS[interface](*client_args)
             self.flavors_client = FLAVORS_CLIENTS[interface](*client_args)
+            self.extensions_client = \
+                    EXTENSIONS_CLIENTS[interface](*client_args)
         except KeyError:
             msg = "Unsupported interface type `%s'" % interface
             raise exceptions.InvalidConfiguration(msg)
         self.images_client = ImagesClient(*client_args)
-        self.extensions_client = ExtensionsClient(*client_args)
         self.security_groups_client = SecurityGroupsClient(*client_args)
         self.floating_ips_client = FloatingIPsClient(*client_args)
         self.console_outputs_client = ConsoleOutputsClient(*client_args)
diff --git a/tempest/services/nova/json/extensions_client.py b/tempest/services/nova/json/extensions_client.py
index 5627afc..8eeb382 100644
--- a/tempest/services/nova/json/extensions_client.py
+++ b/tempest/services/nova/json/extensions_client.py
@@ -2,10 +2,10 @@
 import json
 
 
-class ExtensionsClient(RestClient):
+class ExtensionsClientJSON(RestClient):
 
     def __init__(self, config, username, password, auth_url, tenant_name=None):
-        super(ExtensionsClient, self).__init__(config, username, password,
+        super(ExtensionsClientJSON, self).__init__(config, username, password,
                                                auth_url, tenant_name)
         self.service = self.config.compute.catalog_type
 
diff --git a/tempest/services/nova/xml/extensions_client.py b/tempest/services/nova/xml/extensions_client.py
new file mode 100644
index 0000000..7ae4214
--- /dev/null
+++ b/tempest/services/nova/xml/extensions_client.py
@@ -0,0 +1,28 @@
+from lxml import etree
+from tempest.common.rest_client import RestClientXML
+from tempest.services.nova.xml.common import xml_to_json
+
+
+class ExtensionsClientXML(RestClientXML):
+
+    def __init__(self, config, username, password, auth_url, tenant_name=None):
+        super(ExtensionsClientXML, self).__init__(config, username, password,
+                                               auth_url, tenant_name)
+        self.service = self.config.compute.catalog_type
+
+    def _parse_array(self, node):
+        array = []
+        for child in node:
+            array.append(xml_to_json(child))
+        return array
+
+    def list_extensions(self):
+        url = 'extensions'
+        resp, body = self.get(url, self.headers)
+        body = self._parse_array(etree.fromstring(body))
+        return resp, {'extensions': body}
+
+    def is_enabled(self, extension):
+        _, extensions = self.list_extensions()
+        exts = extensions['extensions']
+        return any([e for e in exts if e['name'] == extension])
diff --git a/tempest/tests/compute/test_extensions.py b/tempest/tests/compute/test_extensions.py
index 1448f05..552c58c 100644
--- a/tempest/tests/compute/test_extensions.py
+++ b/tempest/tests/compute/test_extensions.py
@@ -17,15 +17,10 @@
 
 from nose.plugins.attrib import attr
 
-from tempest.tests.compute.base import BaseComputeTest
+from tempest.tests.compute import base
 
 
-class ExtensionsTest(BaseComputeTest):
-
-    @classmethod
-    def setUpClass(cls):
-        super(ExtensionsTest, cls).setUpClass()
-        cls.client = cls.extensions_client
+class ExtensionsTestBase(object):
 
     @attr(type='positive')
     def test_list_extensions(self):
@@ -33,3 +28,19 @@
         resp, extensions = self.client.list_extensions()
         self.assertTrue("extensions" in extensions)
         self.assertEqual(200, resp.status)
+
+
+class ExtensionsTestJSON(base.BaseComputeTest, ExtensionsTestBase):
+
+    @classmethod
+    def setUpClass(cls):
+        super(ExtensionsTestJSON, cls).setUpClass()
+        cls.client = cls.extensions_client
+
+
+class ExtensionsTestXML(base.BaseComputeTestXML, ExtensionsTestBase):
+
+    @classmethod
+    def setUpClass(cls):
+        super(ExtensionsTestXML, cls).setUpClass()
+        cls.client = cls.extensions_client