blob: 7191940761026c91920fc1f2caefcf1aadb04925 [file] [log] [blame]
Nayna Patelf1a29152013-08-09 07:18:13 +00001# Copyright 2013 OpenStack Foundation
2# All Rights Reserved.
3#
4# Licensed under the Apache License, Version 2.0 (the "License"); you may
5# not use this file except in compliance with the License. You may obtain
6# a copy of the License at
7#
8# http://www.apache.org/licenses/LICENSE-2.0
9#
10# Unless required by applicable law or agreed to in writing, software
11# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13# License for the specific language governing permissions and limitations
14# under the License.
15
16from tempest.api.network import base
Masayuki Igawa259c1132013-10-31 17:48:44 +090017from tempest.common.utils import data_utils
Matthew Treinish03b48df2014-01-29 16:59:49 +000018from tempest import config
Yoshihiro Kaneko05670262014-01-18 19:22:44 +090019from tempest import test
Nayna Patelf1a29152013-08-09 07:18:13 +000020
Matthew Treinish03b48df2014-01-29 16:59:49 +000021CONF = config.CONF
22
Nayna Patelf1a29152013-08-09 07:18:13 +000023
Attila Fazekasc74aede2013-09-11 13:04:02 +020024class FloatingIPTestJSON(base.BaseNetworkTest):
Nayna Patelf1a29152013-08-09 07:18:13 +000025 _interface = 'json'
26
27 """
28 Tests the following operations in the Quantum API using the REST client for
rossellabc9b4bd2013-11-13 10:21:59 +010029 Neutron:
Nayna Patelf1a29152013-08-09 07:18:13 +000030
31 Create a Floating IP
32 Update a Floating IP
33 Delete a Floating IP
34 List all Floating IPs
35 Show Floating IP details
rossellab24ec382013-11-13 10:21:59 +010036 Associate a Floating IP with a port and then delete that port
37 Associate a Floating IP with a port and then with a port on another
38 router
Nayna Patelf1a29152013-08-09 07:18:13 +000039
rossellabc9b4bd2013-11-13 10:21:59 +010040 v2.0 of the Neutron API is assumed. It is also assumed that the following
Nayna Patelf1a29152013-08-09 07:18:13 +000041 options are defined in the [network] section of etc/tempest.conf:
42
43 public_network_id which is the id for the external network present
44 """
45
46 @classmethod
Masayuki Igawa6d495d62014-03-19 16:38:57 +090047 @test.safe_setup
Nayna Patelf1a29152013-08-09 07:18:13 +000048 def setUpClass(cls):
Attila Fazekasc74aede2013-09-11 13:04:02 +020049 super(FloatingIPTestJSON, cls).setUpClass()
Yoshihiro Kaneko05670262014-01-18 19:22:44 +090050 if not test.is_extension_enabled('router', 'network'):
51 msg = "router extension not enabled."
52 raise cls.skipException(msg)
Matthew Treinish03b48df2014-01-29 16:59:49 +000053 cls.ext_net_id = CONF.network.public_network_id
Nayna Patelf1a29152013-08-09 07:18:13 +000054
55 # Create network, subnet, router and add interface
56 cls.network = cls.create_network()
57 cls.subnet = cls.create_subnet(cls.network)
rossellabc9b4bd2013-11-13 10:21:59 +010058 cls.router = cls.create_router(data_utils.rand_name('router-'),
59 external_network_id=cls.ext_net_id)
60 cls.create_router_interface(cls.router['id'], cls.subnet['id'])
Nayna Patelf1a29152013-08-09 07:18:13 +000061 cls.port = list()
62 # Create two ports one each for Creation and Updating of floatingIP
63 for i in range(2):
rossellabc9b4bd2013-11-13 10:21:59 +010064 cls.create_port(cls.network)
Nayna Patelf1a29152013-08-09 07:18:13 +000065
Yoshihiro Kaneko05670262014-01-18 19:22:44 +090066 @test.attr(type='smoke')
Nayna Patelf1a29152013-08-09 07:18:13 +000067 def test_create_list_show_update_delete_floating_ip(self):
68 # Creates a floating IP
Ann Kamyshnikova47a4ff82014-03-17 12:48:57 +040069 resp, body = self.client.create_floatingip(
70 floating_network_id=self.ext_net_id, port_id=self.ports[0]['id'])
71 self.assertEqual('201', resp['status'])
72 created_floating_ip = body['floatingip']
73 self.addCleanup(self.client.delete_floatingip,
74 created_floating_ip['id'])
rossellabc9b4bd2013-11-13 10:21:59 +010075 self.assertIsNotNone(created_floating_ip['id'])
76 self.assertIsNotNone(created_floating_ip['tenant_id'])
77 self.assertIsNotNone(created_floating_ip['floating_ip_address'])
78 self.assertEqual(created_floating_ip['port_id'], self.ports[0]['id'])
79 self.assertEqual(created_floating_ip['floating_network_id'],
Nayna Patelf1a29152013-08-09 07:18:13 +000080 self.ext_net_id)
Nayna Patelf1a29152013-08-09 07:18:13 +000081 # Verifies the details of a floating_ip
Ann Kamyshnikova47a4ff82014-03-17 12:48:57 +040082 resp, floating_ip = self.client.show_floatingip(
rossellabc9b4bd2013-11-13 10:21:59 +010083 created_floating_ip['id'])
Nayna Patelf1a29152013-08-09 07:18:13 +000084 self.assertEqual('200', resp['status'])
rossellabc9b4bd2013-11-13 10:21:59 +010085 shown_floating_ip = floating_ip['floatingip']
86 self.assertEqual(shown_floating_ip['id'], created_floating_ip['id'])
87 self.assertEqual(shown_floating_ip['floating_network_id'],
Nayna Patelf1a29152013-08-09 07:18:13 +000088 self.ext_net_id)
rossellabc9b4bd2013-11-13 10:21:59 +010089 self.assertEqual(shown_floating_ip['tenant_id'],
90 created_floating_ip['tenant_id'])
91 self.assertEqual(shown_floating_ip['floating_ip_address'],
92 created_floating_ip['floating_ip_address'])
93 self.assertEqual(shown_floating_ip['port_id'], self.ports[0]['id'])
Nayna Patelf1a29152013-08-09 07:18:13 +000094
95 # Verify the floating ip exists in the list of all floating_ips
Eugene Nikanorov909ded12013-12-15 17:45:37 +040096 resp, floating_ips = self.client.list_floatingips()
Nayna Patelf1a29152013-08-09 07:18:13 +000097 self.assertEqual('200', resp['status'])
98 floatingip_id_list = list()
99 for f in floating_ips['floatingips']:
100 floatingip_id_list.append(f['id'])
rossellabc9b4bd2013-11-13 10:21:59 +0100101 self.assertIn(created_floating_ip['id'], floatingip_id_list)
Nayna Patelf1a29152013-08-09 07:18:13 +0000102 # Associate floating IP to the other port
Ann Kamyshnikova47a4ff82014-03-17 12:48:57 +0400103 resp, floating_ip = self.client.update_floatingip(
rossellabc9b4bd2013-11-13 10:21:59 +0100104 created_floating_ip['id'], port_id=self.ports[1]['id'])
Nayna Patelf1a29152013-08-09 07:18:13 +0000105 self.assertEqual('200', resp['status'])
rossellabc9b4bd2013-11-13 10:21:59 +0100106 updated_floating_ip = floating_ip['floatingip']
107 self.assertEqual(updated_floating_ip['port_id'], self.ports[1]['id'])
108 self.assertEqual(updated_floating_ip['fixed_ip_address'],
109 self.ports[1]['fixed_ips'][0]['ip_address'])
110 self.assertEqual(updated_floating_ip['router_id'], self.router['id'])
Nayna Patelf1a29152013-08-09 07:18:13 +0000111
112 # Disassociate floating IP from the port
Ann Kamyshnikova47a4ff82014-03-17 12:48:57 +0400113 resp, floating_ip = self.client.update_floatingip(
rossellabc9b4bd2013-11-13 10:21:59 +0100114 created_floating_ip['id'], port_id=None)
Nayna Patelf1a29152013-08-09 07:18:13 +0000115 self.assertEqual('200', resp['status'])
rossellabc9b4bd2013-11-13 10:21:59 +0100116 updated_floating_ip = floating_ip['floatingip']
117 self.assertIsNone(updated_floating_ip['port_id'])
118 self.assertIsNone(updated_floating_ip['fixed_ip_address'])
119 self.assertIsNone(updated_floating_ip['router_id'])
Attila Fazekasc74aede2013-09-11 13:04:02 +0200120
Yoshihiro Kaneko05670262014-01-18 19:22:44 +0900121 @test.attr(type='smoke')
rossellab24ec382013-11-13 10:21:59 +0100122 def test_floating_ip_delete_port(self):
123 # Create a floating IP
Ann Kamyshnikova47a4ff82014-03-17 12:48:57 +0400124 resp, body = self.client.create_floatingip(
125 floating_network_id=self.ext_net_id)
126 self.assertEqual('201', resp['status'])
127 created_floating_ip = body['floatingip']
128 self.addCleanup(self.client.delete_floatingip,
129 created_floating_ip['id'])
rossellab24ec382013-11-13 10:21:59 +0100130 # Create a port
Eugene Nikanorove9d255a2013-12-18 16:31:42 +0400131 resp, port = self.client.create_port(network_id=self.network['id'])
rossellab24ec382013-11-13 10:21:59 +0100132 created_port = port['port']
Ann Kamyshnikova47a4ff82014-03-17 12:48:57 +0400133 resp, floating_ip = self.client.update_floatingip(
rossellab24ec382013-11-13 10:21:59 +0100134 created_floating_ip['id'], port_id=created_port['id'])
135 self.assertEqual('200', resp['status'])
136 # Delete port
137 self.client.delete_port(created_port['id'])
138 # Verifies the details of the floating_ip
Ann Kamyshnikova47a4ff82014-03-17 12:48:57 +0400139 resp, floating_ip = self.client.show_floatingip(
rossellab24ec382013-11-13 10:21:59 +0100140 created_floating_ip['id'])
141 self.assertEqual('200', resp['status'])
142 shown_floating_ip = floating_ip['floatingip']
143 # Confirm the fields are back to None
144 self.assertEqual(shown_floating_ip['id'], created_floating_ip['id'])
145 self.assertIsNone(shown_floating_ip['port_id'])
146 self.assertIsNone(shown_floating_ip['fixed_ip_address'])
147 self.assertIsNone(shown_floating_ip['router_id'])
148
Yoshihiro Kaneko05670262014-01-18 19:22:44 +0900149 @test.attr(type='smoke')
rossellab24ec382013-11-13 10:21:59 +0100150 def test_floating_ip_update_different_router(self):
151 # Associate a floating IP to a port on a router
Ann Kamyshnikova47a4ff82014-03-17 12:48:57 +0400152 resp, body = self.client.create_floatingip(
153 floating_network_id=self.ext_net_id, port_id=self.ports[1]['id'])
154 self.assertEqual('201', resp['status'])
155 created_floating_ip = body['floatingip']
156 self.addCleanup(self.client.delete_floatingip,
157 created_floating_ip['id'])
rossellab24ec382013-11-13 10:21:59 +0100158 self.assertEqual(created_floating_ip['router_id'], self.router['id'])
159 network2 = self.create_network()
160 subnet2 = self.create_subnet(network2)
161 router2 = self.create_router(data_utils.rand_name('router-'),
162 external_network_id=self.ext_net_id)
163 self.create_router_interface(router2['id'], subnet2['id'])
164 port_other_router = self.create_port(network2)
165 # Associate floating IP to the other port on another router
Ann Kamyshnikova47a4ff82014-03-17 12:48:57 +0400166 resp, floating_ip = self.client.update_floatingip(
rossellab24ec382013-11-13 10:21:59 +0100167 created_floating_ip['id'], port_id=port_other_router['id'])
168 self.assertEqual('200', resp['status'])
169 updated_floating_ip = floating_ip['floatingip']
170 self.assertEqual(updated_floating_ip['router_id'], router2['id'])
171 self.assertEqual(updated_floating_ip['port_id'],
172 port_other_router['id'])
173 self.assertIsNotNone(updated_floating_ip['fixed_ip_address'])
174
Attila Fazekasc74aede2013-09-11 13:04:02 +0200175
176class FloatingIPTestXML(FloatingIPTestJSON):
177 _interface = 'xml'