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