Add an xml/servers_client.py implementation

This needs to inherit some common bits from the json implementation,
but works for now.

This changes openstack.py::Manager to take an interface argument and
select the appropriate client(s) accordingly. This is ugly, and probably
not the best approach, but for the moment, it avoids the class inflation
that would result from creating subclasses at the Manager _and_ Base*Test
layers.

Change-Id: I7814054eab59bc34258fbbd1df43a4140448f448
diff --git a/tempest/openstack.py b/tempest/openstack.py
index e892082..b9912f1 100644
--- a/tempest/openstack.py
+++ b/tempest/openstack.py
@@ -23,7 +23,7 @@
 from tempest.services.network.json.network_client import NetworkClient
 from tempest.services.nova.json.images_client import ImagesClient
 from tempest.services.nova.json.flavors_client import FlavorsClient
-from tempest.services.nova.json.servers_client import ServersClient
+from tempest.services.nova.json.servers_client import ServersClientJSON
 from tempest.services.nova.json.limits_client import LimitsClient
 from tempest.services.nova.json.extensions_client import ExtensionsClient
 from tempest.services.nova.json.security_groups_client \
@@ -33,9 +33,15 @@
 from tempest.services.nova.json.volumes_client import VolumesClient
 from tempest.services.nova.json.console_output_client \
 import ConsoleOutputsClient
+from tempest.services.nova.xml.servers_client import ServersClientXML
 
 LOG = logging.getLogger(__name__)
 
+SERVERS_CLIENTS = {
+    "json": ServersClientJSON,
+    "xml": ServersClientXML,
+}
+
 
 class Manager(object):
 
@@ -43,7 +49,8 @@
     Top level manager for OpenStack Compute clients
     """
 
-    def __init__(self, username=None, password=None, tenant_name=None):
+    def __init__(self, username=None, password=None, tenant_name=None,
+                 interface='json'):
         """
         We allow overriding of the credentials used within the various
         client classes managed by the Manager object. Left as None, the
@@ -75,7 +82,11 @@
         else:
             client_args = (self.config, username, password, auth_url)
 
-        self.servers_client = ServersClient(*client_args)
+        try:
+            self.servers_client = SERVERS_CLIENTS[interface](*client_args)
+        except KeyError:
+            msg = "Unsupported interface type `%s'" % interface
+            raise exceptions.InvalidConfiguration(msg)
         self.flavors_client = FlavorsClient(*client_args)
         self.images_client = ImagesClient(*client_args)
         self.limits_client = LimitsClient(*client_args)