blob: bda5b2b0897456e6829af2922746ba922e528465 [file] [log] [blame]
Elena Ezhova1ec6e182013-12-24 17:45:59 +04001# Copyright 2014 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
16import socket
17
18from tempest.api.network import base
19from tempest.common.utils import data_utils
20from tempest import config
21from tempest import test
22
23CONF = config.CONF
24
25
26class PortsTestJSON(base.BaseNetworkTest):
27 _interface = 'json'
28
29 @classmethod
Masayuki Igawa6d495d62014-03-19 16:38:57 +090030 @test.safe_setup
Elena Ezhova1ec6e182013-12-24 17:45:59 +040031 def setUpClass(cls):
32 super(PortsTestJSON, cls).setUpClass()
33 cls.network = cls.create_network()
34 cls.port = cls.create_port(cls.network)
35
36 def _delete_port(self, port_id):
37 resp, body = self.client.delete_port(port_id)
38 self.assertEqual('204', resp['status'])
39 resp, body = self.client.list_ports()
40 self.assertEqual('200', resp['status'])
41 ports_list = body['ports']
42 self.assertFalse(port_id in [n['id'] for n in ports_list])
43
44 @test.attr(type='smoke')
45 def test_create_update_delete_port(self):
46 # Verify port creation
47 resp, body = self.client.create_port(network_id=self.network['id'])
48 self.assertEqual('201', resp['status'])
49 port = body['port']
50 self.assertTrue(port['admin_state_up'])
51 # Verify port update
52 new_name = "New_Port"
53 resp, body = self.client.update_port(
54 port['id'],
55 name=new_name,
56 admin_state_up=False)
57 self.assertEqual('200', resp['status'])
58 updated_port = body['port']
59 self.assertEqual(updated_port['name'], new_name)
60 self.assertFalse(updated_port['admin_state_up'])
61 # Verify port deletion
62 resp, body = self.client.delete_port(port['id'])
63 self.assertEqual('204', resp['status'])
64
65 @test.attr(type='smoke')
66 def test_show_port(self):
67 # Verify the details of port
68 resp, body = self.client.show_port(self.port['id'])
69 self.assertEqual('200', resp['status'])
70 port = body['port']
71 self.assertIn('id', port)
72 self.assertEqual(port['id'], self.port['id'])
73 self.assertEqual(self.port['admin_state_up'], port['admin_state_up'])
74 self.assertEqual(self.port['device_id'], port['device_id'])
75 self.assertEqual(self.port['device_owner'], port['device_owner'])
76 self.assertEqual(self.port['mac_address'], port['mac_address'])
77 self.assertEqual(self.port['name'], port['name'])
78 self.assertEqual(self.port['security_groups'],
79 port['security_groups'])
80 self.assertEqual(self.port['network_id'], port['network_id'])
81 self.assertEqual(self.port['security_groups'],
82 port['security_groups'])
83
84 @test.attr(type='smoke')
85 def test_show_port_fields(self):
86 # Verify specific fields of a port
87 field_list = [('fields', 'id'), ]
88 resp, body = self.client.show_port(self.port['id'],
89 field_list=field_list)
90 self.assertEqual('200', resp['status'])
91 port = body['port']
92 self.assertEqual(len(port), len(field_list))
93 for label, field_name in field_list:
94 self.assertEqual(port[field_name], self.port[field_name])
95
96 @test.attr(type='smoke')
97 def test_list_ports(self):
98 # Verify the port exists in the list of all ports
99 resp, body = self.client.list_ports()
100 self.assertEqual('200', resp['status'])
101 ports = [port['id'] for port in body['ports']
102 if port['id'] == self.port['id']]
103 self.assertNotEmpty(ports, "Created port not found in the list")
104
105 @test.attr(type='smoke')
106 def test_port_list_filter_by_router_id(self):
107 # Create a router
108 network = self.create_network()
109 self.create_subnet(network)
110 router = self.create_router(data_utils.rand_name('router-'))
111 resp, port = self.client.create_port(network_id=network['id'])
112 # Add router interface to port created above
113 resp, interface = self.client.add_router_interface_with_port_id(
114 router['id'], port['port']['id'])
115 self.addCleanup(self.client.remove_router_interface_with_port_id,
116 router['id'], port['port']['id'])
117 # List ports filtered by router_id
118 resp, port_list = self.client.list_ports(
119 device_id=router['id'])
120 self.assertEqual('200', resp['status'])
121 ports = port_list['ports']
122 self.assertEqual(len(ports), 1)
123 self.assertEqual(ports[0]['id'], port['port']['id'])
124 self.assertEqual(ports[0]['device_id'], router['id'])
125
126 @test.attr(type='smoke')
127 def test_list_ports_fields(self):
128 # Verify specific fields of ports
129 resp, body = self.client.list_ports(fields='id')
130 self.assertEqual('200', resp['status'])
131 ports = body['ports']
132 self.assertNotEmpty(ports, "Port list returned is empty")
133 # Asserting the fields returned are correct
134 for port in ports:
135 self.assertEqual(len(port), 1)
136 self.assertIn('id', port)
137
138
139class PortsTestXML(PortsTestJSON):
140 _interface = 'xml'
141
142
143class PortsAdminExtendedAttrsTestJSON(base.BaseAdminNetworkTest):
144 _interface = 'json'
145
146 @classmethod
Masayuki Igawa6d495d62014-03-19 16:38:57 +0900147 @test.safe_setup
Elena Ezhova1ec6e182013-12-24 17:45:59 +0400148 def setUpClass(cls):
149 super(PortsAdminExtendedAttrsTestJSON, cls).setUpClass()
150 cls.identity_client = cls._get_identity_admin_client()
151 cls.tenant = cls.identity_client.get_tenant_by_name(
152 CONF.identity.tenant_name)
153 cls.network = cls.create_network()
154 cls.host_id = socket.gethostname()
155
156 @test.attr(type='smoke')
157 def test_create_port_binding_ext_attr(self):
158 post_body = {"network_id": self.network['id'],
159 "binding:host_id": self.host_id}
160 resp, body = self.admin_client.create_port(**post_body)
161 self.assertEqual('201', resp['status'])
162 port = body['port']
163 self.addCleanup(self.admin_client.delete_port, port['id'])
164 host_id = port['binding:host_id']
165 self.assertIsNotNone(host_id)
166 self.assertEqual(self.host_id, host_id)
167
168 @test.attr(type='smoke')
169 def test_update_port_binding_ext_attr(self):
170 post_body = {"network_id": self.network['id']}
171 resp, body = self.admin_client.create_port(**post_body)
172 self.assertEqual('201', resp['status'])
173 port = body['port']
174 self.addCleanup(self.admin_client.delete_port, port['id'])
175 update_body = {"binding:host_id": self.host_id}
176 resp, body = self.admin_client.update_port(port['id'], **update_body)
177 self.assertEqual('200', resp['status'])
178 updated_port = body['port']
179 host_id = updated_port['binding:host_id']
180 self.assertIsNotNone(host_id)
181 self.assertEqual(self.host_id, host_id)
182
183 @test.attr(type='smoke')
184 def test_list_ports_binding_ext_attr(self):
Adam Gandelman7e80e4e2014-04-03 00:38:26 -0700185 # Create a new port
186 post_body = {"network_id": self.network['id']}
187 resp, body = self.admin_client.create_port(**post_body)
188 self.assertEqual('201', resp['status'])
189 port = body['port']
190 self.addCleanup(self.admin_client.delete_port, port['id'])
191
192 # Update the port's binding attributes so that is now 'bound'
193 # to a host
194 update_body = {"binding:host_id": self.host_id}
195 resp, _ = self.admin_client.update_port(port['id'], **update_body)
196 self.assertEqual('200', resp['status'])
197
198 # List all ports, ensure new port is part of list and its binding
199 # attributes are set and accurate
200 resp, body = self.admin_client.list_ports()
Elena Ezhova1ec6e182013-12-24 17:45:59 +0400201 self.assertEqual('200', resp['status'])
202 ports_list = body['ports']
Adam Gandelman7e80e4e2014-04-03 00:38:26 -0700203 pids_list = [p['id'] for p in ports_list]
204 self.assertIn(port['id'], pids_list)
205 listed_port = [p for p in ports_list if p['id'] == port['id']]
206 self.assertEqual(1, len(listed_port),
207 'Multiple ports listed with id %s in ports listing: '
208 '%s' % (port['id'], ports_list))
209 self.assertEqual(self.host_id, listed_port[0]['binding:host_id'])
Elena Ezhova1ec6e182013-12-24 17:45:59 +0400210
211 @test.attr(type='smoke')
212 def test_show_port_binding_ext_attr(self):
213 resp, body = self.admin_client.create_port(
214 network_id=self.network['id'])
215 self.assertEqual('201', resp['status'])
216 port = body['port']
217 self.addCleanup(self.admin_client.delete_port, port['id'])
218 resp, body = self.admin_client.show_port(port['id'])
219 self.assertEqual('200', resp['status'])
220 show_port = body['port']
221 self.assertEqual(port['binding:host_id'],
222 show_port['binding:host_id'])
223 self.assertEqual(port['binding:vif_type'],
224 show_port['binding:vif_type'])
225 self.assertEqual(port['binding:vif_details'],
226 show_port['binding:vif_details'])
227
228
229class PortsAdminExtendedAttrsTestXML(PortsAdminExtendedAttrsTestJSON):
230 _interface = 'xml'
231
232
233class PortsIpV6TestJSON(PortsTestJSON):
234 _ip_version = 6
235 _tenant_network_cidr = CONF.network.tenant_network_v6_cidr
236 _tenant_network_mask_bits = CONF.network.tenant_network_v6_mask_bits
237
238 @classmethod
239 def setUpClass(cls):
240 super(PortsIpV6TestJSON, cls).setUpClass()
241 if not CONF.network_feature_enabled.ipv6:
242 cls.tearDownClass()
243 skip_msg = "IPv6 Tests are disabled."
244 raise cls.skipException(skip_msg)
245
246
247class PortsIpV6TestXML(PortsIpV6TestJSON):
248 _interface = 'xml'
249
250
251class PortsAdminExtendedAttrsIpV6TestJSON(PortsAdminExtendedAttrsTestJSON):
252 _ip_version = 6
253 _tenant_network_cidr = CONF.network.tenant_network_v6_cidr
254 _tenant_network_mask_bits = CONF.network.tenant_network_v6_mask_bits
255
256 @classmethod
257 def setUpClass(cls):
258 super(PortsAdminExtendedAttrsIpV6TestJSON, cls).setUpClass()
259 if not CONF.network_feature_enabled.ipv6:
260 cls.tearDownClass()
261 skip_msg = "IPv6 Tests are disabled."
262 raise cls.skipException(skip_msg)
263
264
265class PortsAdminExtendedAttrsIpV6TestXML(
266 PortsAdminExtendedAttrsIpV6TestJSON):
267 _interface = 'xml'