Jay Pipes | f4dad39 | 2012-06-05 16:03:58 -0400 | [diff] [blame] | 1 | # vim: tabstop=4 shiftwidth=4 softtabstop=4 |
| 2 | |
| 3 | # Copyright 2012 OpenStack, LLC |
| 4 | # All Rights Reserved. |
| 5 | # |
| 6 | # Licensed under the Apache License, Version 2.0 (the "License"); you may |
| 7 | # not use this file except in compliance with the License. You may obtain |
| 8 | # a copy of the License at |
| 9 | # |
| 10 | # http://www.apache.org/licenses/LICENSE-2.0 |
| 11 | # |
| 12 | # Unless required by applicable law or agreed to in writing, software |
| 13 | # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT |
| 14 | # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the |
| 15 | # License for the specific language governing permissions and limitations |
| 16 | # under the License. |
| 17 | |
Miguel Lavalle | cc93961 | 2013-02-22 17:27:20 -0600 | [diff] [blame] | 18 | import netaddr |
Jay Pipes | f4dad39 | 2012-06-05 16:03:58 -0400 | [diff] [blame] | 19 | |
Sean Dague | 1937d09 | 2013-05-17 16:36:38 -0400 | [diff] [blame] | 20 | from tempest.api.network import base |
Unmesh Gurjar | 4498683 | 2012-05-08 19:57:10 +0530 | [diff] [blame] | 21 | from tempest.common.utils.data_utils import rand_name |
Miguel Lavalle | cc93961 | 2013-02-22 17:27:20 -0600 | [diff] [blame] | 22 | from tempest import exceptions |
| 23 | from tempest.test import attr |
Unmesh Gurjar | 4498683 | 2012-05-08 19:57:10 +0530 | [diff] [blame] | 24 | |
| 25 | |
raiesmh08 | 6769832 | 2013-08-20 13:09:01 +0530 | [diff] [blame] | 26 | class NetworksTestJSON(base.BaseNetworkTest): |
| 27 | _interface = 'json' |
Unmesh Gurjar | 4498683 | 2012-05-08 19:57:10 +0530 | [diff] [blame] | 28 | |
Miguel Lavalle | cc93961 | 2013-02-22 17:27:20 -0600 | [diff] [blame] | 29 | """ |
Mark McClain | f2982e8 | 2013-07-06 17:48:03 -0400 | [diff] [blame] | 30 | Tests the following operations in the Neutron API using the REST client for |
| 31 | Neutron: |
Miguel Lavalle | cc93961 | 2013-02-22 17:27:20 -0600 | [diff] [blame] | 32 | |
| 33 | create a network for a tenant |
| 34 | list tenant's networks |
| 35 | show a tenant network details |
| 36 | create a subnet for a tenant |
| 37 | list tenant's subnets |
| 38 | show a tenant subnet details |
raiesmh08 | e1aad98 | 2013-08-05 14:19:36 +0530 | [diff] [blame] | 39 | port create |
| 40 | port delete |
| 41 | port list |
| 42 | port show |
| 43 | port update |
| 44 | network update |
| 45 | subnet update |
Miguel Lavalle | cc93961 | 2013-02-22 17:27:20 -0600 | [diff] [blame] | 46 | |
Mark McClain | f2982e8 | 2013-07-06 17:48:03 -0400 | [diff] [blame] | 47 | v2.0 of the Neutron API is assumed. It is also assumed that the following |
Miguel Lavalle | cc93961 | 2013-02-22 17:27:20 -0600 | [diff] [blame] | 48 | options are defined in the [network] section of etc/tempest.conf: |
| 49 | |
| 50 | tenant_network_cidr with a block of cidr's from which smaller blocks |
| 51 | can be allocated for tenant networks |
| 52 | |
| 53 | tenant_network_mask_bits with the mask bits to be used to partition the |
| 54 | block defined by tenant-network_cidr |
| 55 | """ |
| 56 | |
Unmesh Gurjar | 4498683 | 2012-05-08 19:57:10 +0530 | [diff] [blame] | 57 | @classmethod |
| 58 | def setUpClass(cls): |
raiesmh08 | 6769832 | 2013-08-20 13:09:01 +0530 | [diff] [blame] | 59 | super(NetworksTestJSON, cls).setUpClass() |
Jay Pipes | f4dad39 | 2012-06-05 16:03:58 -0400 | [diff] [blame] | 60 | cls.network = cls.create_network() |
| 61 | cls.name = cls.network['name'] |
Miguel Lavalle | cc93961 | 2013-02-22 17:27:20 -0600 | [diff] [blame] | 62 | cls.subnet = cls.create_subnet(cls.network) |
| 63 | cls.cidr = cls.subnet['cidr'] |
raiesmh08 | e1aad98 | 2013-08-05 14:19:36 +0530 | [diff] [blame] | 64 | cls.port = cls.create_port(cls.network) |
Unmesh Gurjar | 4498683 | 2012-05-08 19:57:10 +0530 | [diff] [blame] | 65 | |
Nayna Patel | b03eab4 | 2013-08-08 08:58:48 +0000 | [diff] [blame] | 66 | def _delete_networks(self, created_networks): |
| 67 | for n in created_networks: |
| 68 | resp, body = self.client.delete_network(n['id']) |
| 69 | self.assertEqual(204, resp.status) |
| 70 | # Asserting that the networks are not found in the list after deletion |
| 71 | resp, body = self.client.list_networks() |
| 72 | networks_list = list() |
| 73 | for network in body['networks']: |
| 74 | networks_list.append(network['id']) |
| 75 | for n in created_networks: |
| 76 | self.assertNotIn(n['id'], networks_list) |
| 77 | |
Attila Fazekas | 71834a2 | 2013-08-18 06:56:21 +0200 | [diff] [blame] | 78 | @attr(type='smoke') |
raiesmh08 | e1aad98 | 2013-08-05 14:19:36 +0530 | [diff] [blame] | 79 | def test_create_update_delete_network_subnet(self): |
Miguel Lavalle | cc93961 | 2013-02-22 17:27:20 -0600 | [diff] [blame] | 80 | # Creates a network |
| 81 | name = rand_name('network-') |
Unmesh Gurjar | 4498683 | 2012-05-08 19:57:10 +0530 | [diff] [blame] | 82 | resp, body = self.client.create_network(name) |
Miguel Lavalle | cc93961 | 2013-02-22 17:27:20 -0600 | [diff] [blame] | 83 | self.assertEqual('201', resp['status']) |
Unmesh Gurjar | 4498683 | 2012-05-08 19:57:10 +0530 | [diff] [blame] | 84 | network = body['network'] |
raiesmh08 | e1aad98 | 2013-08-05 14:19:36 +0530 | [diff] [blame] | 85 | net_id = network['id'] |
| 86 | # Verification of network update |
| 87 | new_name = "New_network" |
| 88 | resp, body = self.client.update_network(net_id, new_name) |
| 89 | self.assertEqual('200', resp['status']) |
| 90 | updated_net = body['network'] |
| 91 | self.assertEqual(updated_net['name'], new_name) |
Miguel Lavalle | cc93961 | 2013-02-22 17:27:20 -0600 | [diff] [blame] | 92 | # Find a cidr that is not in use yet and create a subnet with it |
| 93 | cidr = netaddr.IPNetwork(self.network_cfg.tenant_network_cidr) |
| 94 | mask_bits = self.network_cfg.tenant_network_mask_bits |
| 95 | for subnet_cidr in cidr.subnet(mask_bits): |
| 96 | try: |
raiesmh08 | e1aad98 | 2013-08-05 14:19:36 +0530 | [diff] [blame] | 97 | resp, body = self.client.create_subnet(net_id, |
Miguel Lavalle | cc93961 | 2013-02-22 17:27:20 -0600 | [diff] [blame] | 98 | str(subnet_cidr)) |
| 99 | break |
| 100 | except exceptions.BadRequest as e: |
| 101 | is_overlapping_cidr = 'overlaps with another subnet' in str(e) |
| 102 | if not is_overlapping_cidr: |
| 103 | raise |
| 104 | self.assertEqual('201', resp['status']) |
| 105 | subnet = body['subnet'] |
raiesmh08 | e1aad98 | 2013-08-05 14:19:36 +0530 | [diff] [blame] | 106 | subnet_id = subnet['id'] |
| 107 | # Verification of subnet update |
| 108 | new_subnet = "New_subnet" |
| 109 | resp, body = self.client.update_subnet(subnet_id, new_subnet) |
| 110 | self.assertEqual('200', resp['status']) |
| 111 | updated_subnet = body['subnet'] |
| 112 | self.assertEqual(updated_subnet['name'], new_subnet) |
raiesmh08 | 6769832 | 2013-08-20 13:09:01 +0530 | [diff] [blame] | 113 | # Delete subnet and network |
raiesmh08 | e1aad98 | 2013-08-05 14:19:36 +0530 | [diff] [blame] | 114 | resp, body = self.client.delete_subnet(subnet_id) |
Miguel Lavalle | cc93961 | 2013-02-22 17:27:20 -0600 | [diff] [blame] | 115 | self.assertEqual('204', resp['status']) |
raiesmh08 | e1aad98 | 2013-08-05 14:19:36 +0530 | [diff] [blame] | 116 | resp, body = self.client.delete_network(net_id) |
Unmesh Gurjar | 4498683 | 2012-05-08 19:57:10 +0530 | [diff] [blame] | 117 | self.assertEqual('204', resp['status']) |
| 118 | |
Attila Fazekas | 71834a2 | 2013-08-18 06:56:21 +0200 | [diff] [blame] | 119 | @attr(type='smoke') |
Unmesh Gurjar | 4498683 | 2012-05-08 19:57:10 +0530 | [diff] [blame] | 120 | def test_show_network(self): |
Sean Dague | 46c4a2b | 2013-01-03 17:54:17 -0500 | [diff] [blame] | 121 | # Verifies the details of a network |
Miguel Lavalle | cc93961 | 2013-02-22 17:27:20 -0600 | [diff] [blame] | 122 | resp, body = self.client.show_network(self.network['id']) |
Unmesh Gurjar | 4498683 | 2012-05-08 19:57:10 +0530 | [diff] [blame] | 123 | self.assertEqual('200', resp['status']) |
| 124 | network = body['network'] |
| 125 | self.assertEqual(self.network['id'], network['id']) |
| 126 | self.assertEqual(self.name, network['name']) |
| 127 | |
Attila Fazekas | 71834a2 | 2013-08-18 06:56:21 +0200 | [diff] [blame] | 128 | @attr(type='smoke') |
Unmesh Gurjar | 4498683 | 2012-05-08 19:57:10 +0530 | [diff] [blame] | 129 | def test_list_networks(self): |
Sean Dague | 46c4a2b | 2013-01-03 17:54:17 -0500 | [diff] [blame] | 130 | # Verify the network exists in the list of all networks |
Unmesh Gurjar | 4498683 | 2012-05-08 19:57:10 +0530 | [diff] [blame] | 131 | resp, body = self.client.list_networks() |
raiesmh08 | 6769832 | 2013-08-20 13:09:01 +0530 | [diff] [blame] | 132 | self.assertEqual('200', resp['status']) |
Unmesh Gurjar | 4498683 | 2012-05-08 19:57:10 +0530 | [diff] [blame] | 133 | networks = body['networks'] |
raiesmh08 | e1aad98 | 2013-08-05 14:19:36 +0530 | [diff] [blame] | 134 | found = None |
| 135 | for n in networks: |
| 136 | if (n['id'] == self.network['id']): |
| 137 | found = n['id'] |
| 138 | msg = "Network list doesn't contain created network" |
| 139 | self.assertIsNotNone(found, msg) |
Unmesh Gurjar | 4498683 | 2012-05-08 19:57:10 +0530 | [diff] [blame] | 140 | |
Attila Fazekas | 71834a2 | 2013-08-18 06:56:21 +0200 | [diff] [blame] | 141 | @attr(type='smoke') |
Miguel Lavalle | cc93961 | 2013-02-22 17:27:20 -0600 | [diff] [blame] | 142 | def test_show_subnet(self): |
| 143 | # Verifies the details of a subnet |
| 144 | resp, body = self.client.show_subnet(self.subnet['id']) |
| 145 | self.assertEqual('200', resp['status']) |
| 146 | subnet = body['subnet'] |
| 147 | self.assertEqual(self.subnet['id'], subnet['id']) |
| 148 | self.assertEqual(self.cidr, subnet['cidr']) |
| 149 | |
Attila Fazekas | 71834a2 | 2013-08-18 06:56:21 +0200 | [diff] [blame] | 150 | @attr(type='smoke') |
Miguel Lavalle | cc93961 | 2013-02-22 17:27:20 -0600 | [diff] [blame] | 151 | def test_list_subnets(self): |
| 152 | # Verify the subnet exists in the list of all subnets |
| 153 | resp, body = self.client.list_subnets() |
raiesmh08 | 6769832 | 2013-08-20 13:09:01 +0530 | [diff] [blame] | 154 | self.assertEqual('200', resp['status']) |
Miguel Lavalle | cc93961 | 2013-02-22 17:27:20 -0600 | [diff] [blame] | 155 | subnets = body['subnets'] |
raiesmh08 | e1aad98 | 2013-08-05 14:19:36 +0530 | [diff] [blame] | 156 | found = None |
| 157 | for n in subnets: |
| 158 | if (n['id'] == self.subnet['id']): |
| 159 | found = n['id'] |
| 160 | msg = "Subnet list doesn't contain created subnet" |
| 161 | self.assertIsNotNone(found, msg) |
| 162 | |
Attila Fazekas | 71834a2 | 2013-08-18 06:56:21 +0200 | [diff] [blame] | 163 | @attr(type='smoke') |
raiesmh08 | e1aad98 | 2013-08-05 14:19:36 +0530 | [diff] [blame] | 164 | def test_create_update_delete_port(self): |
raiesmh08 | 6769832 | 2013-08-20 13:09:01 +0530 | [diff] [blame] | 165 | # Verify that successful port creation, update & deletion |
raiesmh08 | e1aad98 | 2013-08-05 14:19:36 +0530 | [diff] [blame] | 166 | resp, body = self.client.create_port(self.network['id']) |
| 167 | self.assertEqual('201', resp['status']) |
| 168 | port = body['port'] |
| 169 | # Verification of port update |
| 170 | new_port = "New_Port" |
| 171 | resp, body = self.client.update_port(port['id'], new_port) |
| 172 | self.assertEqual('200', resp['status']) |
| 173 | updated_port = body['port'] |
| 174 | self.assertEqual(updated_port['name'], new_port) |
| 175 | # Verification of port delete |
| 176 | resp, body = self.client.delete_port(port['id']) |
| 177 | self.assertEqual('204', resp['status']) |
| 178 | |
Attila Fazekas | 71834a2 | 2013-08-18 06:56:21 +0200 | [diff] [blame] | 179 | @attr(type='smoke') |
raiesmh08 | 6769832 | 2013-08-20 13:09:01 +0530 | [diff] [blame] | 180 | def test_show_port(self): |
raiesmh08 | e1aad98 | 2013-08-05 14:19:36 +0530 | [diff] [blame] | 181 | # Verify the details of port |
| 182 | resp, body = self.client.show_port(self.port['id']) |
| 183 | self.assertEqual('200', resp['status']) |
| 184 | port = body['port'] |
| 185 | self.assertEqual(self.port['id'], port['id']) |
| 186 | |
Attila Fazekas | 71834a2 | 2013-08-18 06:56:21 +0200 | [diff] [blame] | 187 | @attr(type='smoke') |
raiesmh08 | e1aad98 | 2013-08-05 14:19:36 +0530 | [diff] [blame] | 188 | def test_list_ports(self): |
| 189 | # Verify the port exists in the list of all ports |
| 190 | resp, body = self.client.list_ports() |
| 191 | self.assertEqual('200', resp['status']) |
| 192 | ports_list = body['ports'] |
| 193 | found = None |
| 194 | for n in ports_list: |
| 195 | if (n['id'] == self.port['id']): |
| 196 | found = n['id'] |
| 197 | self.assertIsNotNone(found, "Port list doesn't contain created port") |
Anju Tiwari | 6656f58 | 2013-08-03 05:43:42 +0530 | [diff] [blame] | 198 | |
Attila Fazekas | 71834a2 | 2013-08-18 06:56:21 +0200 | [diff] [blame] | 199 | @attr(type=['negative', 'smoke']) |
Anju Tiwari | 6656f58 | 2013-08-03 05:43:42 +0530 | [diff] [blame] | 200 | def test_show_non_existent_network(self): |
| 201 | non_exist_id = rand_name('network') |
| 202 | self.assertRaises(exceptions.NotFound, self.client.show_network, |
| 203 | non_exist_id) |
| 204 | |
Attila Fazekas | 71834a2 | 2013-08-18 06:56:21 +0200 | [diff] [blame] | 205 | @attr(type=['negative', 'smoke']) |
Anju Tiwari | 6656f58 | 2013-08-03 05:43:42 +0530 | [diff] [blame] | 206 | def test_show_non_existent_subnet(self): |
| 207 | non_exist_id = rand_name('subnet') |
| 208 | self.assertRaises(exceptions.NotFound, self.client.show_subnet, |
| 209 | non_exist_id) |
Nayna Patel | b03eab4 | 2013-08-08 08:58:48 +0000 | [diff] [blame] | 210 | |
Attila Fazekas | 71834a2 | 2013-08-18 06:56:21 +0200 | [diff] [blame] | 211 | @attr(type='smoke') |
Nayna Patel | b03eab4 | 2013-08-08 08:58:48 +0000 | [diff] [blame] | 212 | def test_bulk_create_delete_network(self): |
| 213 | # Creates 2 networks in one request |
| 214 | network_names = [rand_name('network-'), rand_name('network-')] |
| 215 | resp, body = self.client.create_bulk_network(2, network_names) |
| 216 | created_networks = body['networks'] |
| 217 | self.assertEqual('201', resp['status']) |
| 218 | self.addCleanup(self._delete_networks, created_networks) |
| 219 | # Asserting that the networks are found in the list after creation |
| 220 | resp, body = self.client.list_networks() |
| 221 | networks_list = list() |
| 222 | for network in body['networks']: |
| 223 | networks_list.append(network['id']) |
| 224 | for n in created_networks: |
| 225 | self.assertIsNotNone(n['id']) |
| 226 | self.assertIn(n['id'], networks_list) |
raiesmh08 | 6769832 | 2013-08-20 13:09:01 +0530 | [diff] [blame] | 227 | |
| 228 | |
| 229 | class NetworksTestXML(NetworksTestJSON): |
| 230 | _interface = 'xml' |