Add XML support for test_list_floating_ips.py.
Change-Id: Ie2d4b64df36de489c61038d60456dd6c9b226f0b
diff --git a/tempest/manager.py b/tempest/manager.py
index b13226d..cde0fc0 100644
--- a/tempest/manager.py
+++ b/tempest/manager.py
@@ -46,7 +46,7 @@
LimitsClient = limits_client.LimitsClientJSON
ExtensionsClient = extensions_client.ExtensionsClientJSON
SecurityGroupsClient = security_groups_client.SecurityGroupsClient
-FloatingIPsClient = floating_ips_client.FloatingIPsClient
+FloatingIPsClient = floating_ips_client.FloatingIPsClientJSON
KeyPairsClient = keypairs_client.KeyPairsClientJSON
VolumesExtensionsClient = volumes_extensions_client.VolumesExtensionsClientJSON
VolumesClient = volumes_client.VolumesClient
diff --git a/tempest/openstack.py b/tempest/openstack.py
index 204265e..290b278 100644
--- a/tempest/openstack.py
+++ b/tempest/openstack.py
@@ -23,12 +23,13 @@
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.nova.json.floating_ips_client import \
+FloatingIPsClientJSON
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.security_groups_client \
import SecurityGroupsClient
-from tempest.services.nova.json.floating_ips_client import FloatingIPsClient
from tempest.services.nova.json.keypairs_client import KeyPairsClientJSON
from tempest.services.nova.json.volumes_extensions_client \
import VolumesExtensionsClientJSON
@@ -36,6 +37,8 @@
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.floating_ips_client import \
+FloatingIPsClientXML
from tempest.services.nova.xml.keypairs_client import KeyPairsClientXML
from tempest.services.nova.xml.limits_client import LimitsClientXML
from tempest.services.nova.xml.servers_client import ServersClientXML
@@ -75,6 +78,11 @@
"xml": VolumesExtensionsClientXML,
}
+FLOAT_CLIENTS = {
+ "json": FloatingIPsClientJSON,
+ "xml": FloatingIPsClientXML,
+}
+
class Manager(object):
@@ -125,12 +133,12 @@
EXTENSIONS_CLIENTS[interface](*client_args)
self.volumes_extensions_client = \
VOLUMES_EXTENSIONS_CLIENTS[interface](*client_args)
+ self.floating_ips_client = FLOAT_CLIENTS[interface](*client_args)
except KeyError:
msg = "Unsupported interface type `%s'" % interface
raise exceptions.InvalidConfiguration(msg)
self.images_client = ImagesClient(*client_args)
self.security_groups_client = SecurityGroupsClient(*client_args)
- self.floating_ips_client = FloatingIPsClient(*client_args)
self.console_outputs_client = ConsoleOutputsClient(*client_args)
self.network_client = NetworkClient(*client_args)
self.volumes_client = VolumesClient(*client_args)
diff --git a/tempest/services/nova/json/floating_ips_client.py b/tempest/services/nova/json/floating_ips_client.py
index 9f382ff..231b61a 100644
--- a/tempest/services/nova/json/floating_ips_client.py
+++ b/tempest/services/nova/json/floating_ips_client.py
@@ -3,9 +3,9 @@
import json
-class FloatingIPsClient(RestClient):
+class FloatingIPsClientJSON(RestClient):
def __init__(self, config, username, password, auth_url, tenant_name=None):
- super(FloatingIPsClient, self).__init__(config, username, password,
+ super(FloatingIPsClientJSON, self).__init__(config, username, password,
auth_url, tenant_name)
self.service = self.config.compute.catalog_type
@@ -15,8 +15,8 @@
if params != None:
param_list = []
for param, value in params.iteritems():
- param_list.append("%s=%s&" % (param, value))
- url += '?' + ' '.join(param_list)
+ param_list.append("%s=%s" % (param, value))
+ url += '?' + ' &'.join(param_list)
resp, body = self.get(url)
body = json.loads(body)
return resp, body['floating_ips']
diff --git a/tempest/services/nova/xml/floating_ips_client.py b/tempest/services/nova/xml/floating_ips_client.py
new file mode 100644
index 0000000..4b91abb
--- /dev/null
+++ b/tempest/services/nova/xml/floating_ips_client.py
@@ -0,0 +1,103 @@
+# vim: tabstop=4 shiftwidth=4 softtabstop=4
+#
+# Copyright 2012 IBM
+# All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+from lxml import etree
+
+from tempest.common.rest_client import RestClientXML
+from tempest import exceptions
+from tempest.services.nova.xml.common import xml_to_json
+from tempest.services.nova.xml.common import Document
+from tempest.services.nova.xml.common import Element
+
+
+class FloatingIPsClientXML(RestClientXML):
+ def __init__(self, config, username, password, auth_url, tenant_name=None):
+ super(FloatingIPsClientXML, 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.getchildren():
+ array.append(xml_to_json(child))
+ return array
+
+ def _parse_floating_ip(self, body):
+ json = xml_to_json(body)
+ return json
+
+ def list_floating_ips(self, params=None):
+ """Returns a list of all floating IPs filtered by any parameters"""
+ url = 'os-floating-ips'
+ if params != None:
+ param_list = []
+ for param, value in params.iteritems():
+ param_list.append("%s=%s" % (param, value))
+ url += "?" + "&".join(param_list)
+
+ resp, body = self.get(url, self.headers)
+ body = self._parse_array(etree.fromstring(body))
+ return resp, body
+
+ def get_floating_ip_details(self, floating_ip_id):
+ """Get the details of a floating IP"""
+ url = "os-floating-ips/%s" % str(floating_ip_id)
+ resp, body = self.get(url, self.headers)
+ body = self._parse_floating_ip(etree.fromstring(body))
+ if resp.status == 404:
+ raise exceptions.NotFound(body)
+ return resp, body
+
+ def create_floating_ip(self):
+ """Allocate a floating IP to the project"""
+ url = 'os-floating-ips'
+ resp, body = self.post(url, None, self.headers)
+ body = self._parse_floating_ip(etree.fromstring(body))
+ return resp, body
+
+ def delete_floating_ip(self, floating_ip_id):
+ """Deletes the provided floating IP from the project"""
+ url = "os-floating-ips/%s" % str(floating_ip_id)
+ resp, body = self.delete(url, self.headers)
+ return resp, body
+
+ def associate_floating_ip_to_server(self, floating_ip, server_id):
+ """Associate the provided floating IP to a specific server"""
+ url = "servers/%s/action" % str(server_id)
+ doc = Document()
+ server = Element("addFloatingIp")
+ doc.append(server)
+ server.add_attr("address", floating_ip)
+ resp, body = self.post(url, str(doc), self.headers)
+ return resp, body
+
+ def disassociate_floating_ip_from_server(self, floating_ip, server_id):
+ """Disassociate the provided floating IP from a specific server"""
+ url = "servers/%s/action" % str(server_id)
+ doc = Document()
+ server = Element("removeFloatingIp")
+ doc.append(server)
+ server.add_attr("address", floating_ip)
+ resp, body = self.post(url, str(doc), self.headers)
+ return resp, body
+
+ def is_resource_deleted(self, id):
+ try:
+ self.get_floating_ip_details(id)
+ except exceptions.NotFound:
+ return True
+ return False
diff --git a/tempest/tests/compute/test_floating_ips_actions.py b/tempest/tests/compute/test_floating_ips_actions.py
index afd0a3f..fd0252b 100644
--- a/tempest/tests/compute/test_floating_ips_actions.py
+++ b/tempest/tests/compute/test_floating_ips_actions.py
@@ -21,16 +21,15 @@
from tempest import openstack
from tempest import exceptions
from tempest.common.utils.data_utils import rand_name
-from tempest.tests.compute.base import BaseComputeTest
+from tempest.tests.compute import base
-class FloatingIPsTest(BaseComputeTest):
+class FloatingIPsTestBase(object):
server_id = None
floating_ip = None
- @classmethod
+ @staticmethod
def setUpClass(cls):
- super(FloatingIPsTest, cls).setUpClass()
cls.client = cls.floating_ips_client
cls.servers_client = cls.servers_client
@@ -55,13 +54,12 @@
if cls.non_exist_id not in cls.floating_ip_ids:
break
- @classmethod
+ @staticmethod
def tearDownClass(cls):
#Deleting the server which is created in this method
resp, body = cls.servers_client.delete_server(cls.server_id)
#Deleting the floating IP which is created in this method
resp, body = cls.client.delete_floating_ip(cls.floating_ip_id)
- super(FloatingIPsTest, cls).tearDownClass()
@attr(type='positive')
def test_allocate_floating_ip(self):
@@ -225,3 +223,29 @@
else:
self.fail('Association of floating IP to specific server'
' with out passing floating IP should raise BadRequest')
+
+
+class FloatingIPsTestJSON(base.BaseComputeTestJSON,
+ FloatingIPsTestBase):
+ @classmethod
+ def setUpClass(cls):
+ super(FloatingIPsTestJSON, cls).setUpClass()
+ FloatingIPsTestBase.setUpClass(cls)
+
+ @classmethod
+ def tearDownClass(cls):
+ FloatingIPsTestBase.tearDownClass(cls)
+ super(FloatingIPsTestJSON, cls).tearDownClass()
+
+
+class FloatingIPsTestXML(base.BaseComputeTestXML,
+ FloatingIPsTestBase):
+ @classmethod
+ def setUpClass(cls):
+ super(FloatingIPsTestXML, cls).setUpClass()
+ FloatingIPsTestBase.setUpClass(cls)
+
+ @classmethod
+ def tearDownClass(cls):
+ FloatingIPsTestBase.tearDownClass(cls)
+ super(FloatingIPsTestXML, cls).tearDownClass()
diff --git a/tempest/tests/compute/test_list_floating_ips.py b/tempest/tests/compute/test_list_floating_ips.py
index d2d9ba2..ac70b8f 100644
--- a/tempest/tests/compute/test_list_floating_ips.py
+++ b/tempest/tests/compute/test_list_floating_ips.py
@@ -20,14 +20,13 @@
from tempest import exceptions
from tempest.common.utils.data_utils import rand_name
-from tempest.tests.compute.base import BaseComputeTest
+from tempest.tests.compute import base
-class FloatingIPDetailsTest(BaseComputeTest):
+class FloatingIPDetailsTestBase(object):
- @classmethod
+ @staticmethod
def setUpClass(cls):
- super(FloatingIPDetailsTest, cls).setUpClass()
cls.client = cls.floating_ips_client
cls.floating_ip = []
cls.floating_ip_id = []
@@ -37,11 +36,10 @@
cls.floating_ip.append(body)
cls.floating_ip_id.append(body['id'])
- @classmethod
+ @staticmethod
def tearDownClass(cls):
for i in range(3):
cls.client.delete_floating_ip(cls.floating_ip_id[i])
- super(FloatingIPDetailsTest, cls).tearDownClass()
@attr(type='positive')
def test_list_floating_ips(self):
@@ -101,3 +99,29 @@
else:
self.fail('Should not be able to GET the details from a'
'nonexistant floating IP')
+
+
+class FloatingIPDetailsTestJSON(base.BaseComputeTestJSON,
+ FloatingIPDetailsTestBase):
+ @classmethod
+ def setUpClass(cls):
+ super(FloatingIPDetailsTestJSON, cls).setUpClass()
+ FloatingIPDetailsTestBase.setUpClass(cls)
+
+ @classmethod
+ def tearDownClass(cls):
+ FloatingIPDetailsTestBase.tearDownClass(cls)
+ super(FloatingIPDetailsTestJSON, cls).tearDownClass()
+
+
+class FloatingIPDetailsTestXML(base.BaseComputeTestXML,
+ FloatingIPDetailsTestBase):
+ @classmethod
+ def setUpClass(cls):
+ super(FloatingIPDetailsTestXML, cls).setUpClass()
+ FloatingIPDetailsTestBase.setUpClass(cls)
+
+ @classmethod
+ def tearDownClass(cls):
+ FloatingIPDetailsTestBase.tearDownClass(cls)
+ super(FloatingIPDetailsTestXML, cls).tearDownClass()