ZhiQiang Fan | 39f9722 | 2013-09-20 04:49:44 +0800 | [diff] [blame] | 1 | # Copyright 2012 OpenStack Foundation |
Jay Pipes | f4dad39 | 2012-06-05 16:03:58 -0400 | [diff] [blame] | 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 | |
Miguel Lavalle | cc93961 | 2013-02-22 17:27:20 -0600 | [diff] [blame] | 16 | import netaddr |
Sean M. Collins | dd27a4d | 2014-05-13 10:33:15 -0400 | [diff] [blame] | 17 | import testtools |
Jay Pipes | f4dad39 | 2012-06-05 16:03:58 -0400 | [diff] [blame] | 18 | |
Sean Dague | 1937d09 | 2013-05-17 16:36:38 -0400 | [diff] [blame] | 19 | from tempest.api.network import base |
Masayuki Igawa | 259c113 | 2013-10-31 17:48:44 +0900 | [diff] [blame] | 20 | from tempest.common.utils import data_utils |
Matthew Treinish | 03b48df | 2014-01-29 16:59:49 +0000 | [diff] [blame] | 21 | from tempest import config |
sukhdev | c704a70 | 2014-01-15 11:50:56 -0800 | [diff] [blame] | 22 | from tempest import exceptions |
Masayuki Igawa | 6d495d6 | 2014-03-19 16:38:57 +0900 | [diff] [blame] | 23 | from tempest import test |
Unmesh Gurjar | 4498683 | 2012-05-08 19:57:10 +0530 | [diff] [blame] | 24 | |
Matthew Treinish | 03b48df | 2014-01-29 16:59:49 +0000 | [diff] [blame] | 25 | CONF = config.CONF |
| 26 | |
Unmesh Gurjar | 4498683 | 2012-05-08 19:57:10 +0530 | [diff] [blame] | 27 | |
raiesmh08 | 6769832 | 2013-08-20 13:09:01 +0530 | [diff] [blame] | 28 | class NetworksTestJSON(base.BaseNetworkTest): |
| 29 | _interface = 'json' |
Unmesh Gurjar | 4498683 | 2012-05-08 19:57:10 +0530 | [diff] [blame] | 30 | |
Miguel Lavalle | cc93961 | 2013-02-22 17:27:20 -0600 | [diff] [blame] | 31 | """ |
Mark McClain | f2982e8 | 2013-07-06 17:48:03 -0400 | [diff] [blame] | 32 | Tests the following operations in the Neutron API using the REST client for |
| 33 | Neutron: |
Miguel Lavalle | cc93961 | 2013-02-22 17:27:20 -0600 | [diff] [blame] | 34 | |
| 35 | create a network for a tenant |
| 36 | list tenant's networks |
| 37 | show a tenant network details |
| 38 | create a subnet for a tenant |
| 39 | list tenant's subnets |
| 40 | show a tenant subnet details |
raiesmh08 | e1aad98 | 2013-08-05 14:19:36 +0530 | [diff] [blame] | 41 | network update |
| 42 | subnet update |
sukhdev | c704a70 | 2014-01-15 11:50:56 -0800 | [diff] [blame] | 43 | delete a network also deletes its subnets |
Miguel Lavalle | cc93961 | 2013-02-22 17:27:20 -0600 | [diff] [blame] | 44 | |
Henry Gessau | ffda37a | 2014-01-16 11:17:55 -0500 | [diff] [blame] | 45 | All subnet tests are run once with ipv4 and once with ipv6. |
| 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 |
Henry Gessau | ffda37a | 2014-01-16 11:17:55 -0500 | [diff] [blame] | 51 | can be allocated for tenant ipv4 subnets |
| 52 | |
| 53 | tenant_network_v6_cidr is the equivalent for ipv6 subnets |
Miguel Lavalle | cc93961 | 2013-02-22 17:27:20 -0600 | [diff] [blame] | 54 | |
| 55 | tenant_network_mask_bits with the mask bits to be used to partition the |
Henry Gessau | ffda37a | 2014-01-16 11:17:55 -0500 | [diff] [blame] | 56 | block defined by tenant_network_cidr |
| 57 | |
| 58 | tenant_network_v6_mask_bits is the equivalent for ipv6 subnets |
Miguel Lavalle | cc93961 | 2013-02-22 17:27:20 -0600 | [diff] [blame] | 59 | """ |
| 60 | |
Unmesh Gurjar | 4498683 | 2012-05-08 19:57:10 +0530 | [diff] [blame] | 61 | @classmethod |
Andrea Frittoli | da4a245 | 2014-09-15 13:12:08 +0100 | [diff] [blame^] | 62 | def resource_setup(cls): |
| 63 | super(NetworksTestJSON, cls).resource_setup() |
Jay Pipes | f4dad39 | 2012-06-05 16:03:58 -0400 | [diff] [blame] | 64 | cls.network = cls.create_network() |
| 65 | cls.name = cls.network['name'] |
Miguel Lavalle | cc93961 | 2013-02-22 17:27:20 -0600 | [diff] [blame] | 66 | cls.subnet = cls.create_subnet(cls.network) |
| 67 | cls.cidr = cls.subnet['cidr'] |
Unmesh Gurjar | 4498683 | 2012-05-08 19:57:10 +0530 | [diff] [blame] | 68 | |
Masayuki Igawa | 6d495d6 | 2014-03-19 16:38:57 +0900 | [diff] [blame] | 69 | @test.attr(type='smoke') |
raiesmh08 | e1aad98 | 2013-08-05 14:19:36 +0530 | [diff] [blame] | 70 | def test_create_update_delete_network_subnet(self): |
Mark Maglana | 5885eb3 | 2014-02-28 10:57:34 -0800 | [diff] [blame] | 71 | # Create a network |
Masayuki Igawa | 259c113 | 2013-10-31 17:48:44 +0900 | [diff] [blame] | 72 | name = data_utils.rand_name('network-') |
Rohan Kanade | eeb2164 | 2014-08-14 12:00:26 +0200 | [diff] [blame] | 73 | _, body = self.client.create_network(name=name) |
Unmesh Gurjar | 4498683 | 2012-05-08 19:57:10 +0530 | [diff] [blame] | 74 | network = body['network'] |
raiesmh08 | e1aad98 | 2013-08-05 14:19:36 +0530 | [diff] [blame] | 75 | net_id = network['id'] |
Santosh Kumar | 42c9480 | 2014-08-08 04:31:42 -0700 | [diff] [blame] | 76 | self.assertEqual('ACTIVE', network['status']) |
Mark Maglana | 5885eb3 | 2014-02-28 10:57:34 -0800 | [diff] [blame] | 77 | # Verify network update |
raiesmh08 | e1aad98 | 2013-08-05 14:19:36 +0530 | [diff] [blame] | 78 | new_name = "New_network" |
Rohan Kanade | eeb2164 | 2014-08-14 12:00:26 +0200 | [diff] [blame] | 79 | _, body = self.client.update_network(net_id, name=new_name) |
raiesmh08 | e1aad98 | 2013-08-05 14:19:36 +0530 | [diff] [blame] | 80 | updated_net = body['network'] |
| 81 | self.assertEqual(updated_net['name'], new_name) |
Miguel Lavalle | cc93961 | 2013-02-22 17:27:20 -0600 | [diff] [blame] | 82 | # Find a cidr that is not in use yet and create a subnet with it |
Matthew Treinish | 6b8cd2a | 2014-03-03 20:45:56 +0000 | [diff] [blame] | 83 | subnet = self.create_subnet(network) |
raiesmh08 | e1aad98 | 2013-08-05 14:19:36 +0530 | [diff] [blame] | 84 | subnet_id = subnet['id'] |
Mark Maglana | 5885eb3 | 2014-02-28 10:57:34 -0800 | [diff] [blame] | 85 | # Verify subnet update |
| 86 | new_name = "New_subnet" |
Rohan Kanade | eeb2164 | 2014-08-14 12:00:26 +0200 | [diff] [blame] | 87 | _, body = self.client.update_subnet(subnet_id, name=new_name) |
raiesmh08 | e1aad98 | 2013-08-05 14:19:36 +0530 | [diff] [blame] | 88 | updated_subnet = body['subnet'] |
Mark Maglana | 5885eb3 | 2014-02-28 10:57:34 -0800 | [diff] [blame] | 89 | self.assertEqual(updated_subnet['name'], new_name) |
raiesmh08 | 6769832 | 2013-08-20 13:09:01 +0530 | [diff] [blame] | 90 | # Delete subnet and network |
Rohan Kanade | eeb2164 | 2014-08-14 12:00:26 +0200 | [diff] [blame] | 91 | _, body = self.client.delete_subnet(subnet_id) |
Matthew Treinish | 6b8cd2a | 2014-03-03 20:45:56 +0000 | [diff] [blame] | 92 | # Remove subnet from cleanup list |
| 93 | self.subnets.pop() |
Rohan Kanade | eeb2164 | 2014-08-14 12:00:26 +0200 | [diff] [blame] | 94 | _, body = self.client.delete_network(net_id) |
Unmesh Gurjar | 4498683 | 2012-05-08 19:57:10 +0530 | [diff] [blame] | 95 | |
Masayuki Igawa | 6d495d6 | 2014-03-19 16:38:57 +0900 | [diff] [blame] | 96 | @test.attr(type='smoke') |
Unmesh Gurjar | 4498683 | 2012-05-08 19:57:10 +0530 | [diff] [blame] | 97 | def test_show_network(self): |
Mark Maglana | 5885eb3 | 2014-02-28 10:57:34 -0800 | [diff] [blame] | 98 | # Verify the details of a network |
Rohan Kanade | eeb2164 | 2014-08-14 12:00:26 +0200 | [diff] [blame] | 99 | _, body = self.client.show_network(self.network['id']) |
Unmesh Gurjar | 4498683 | 2012-05-08 19:57:10 +0530 | [diff] [blame] | 100 | network = body['network'] |
Mark Maglana | 5885eb3 | 2014-02-28 10:57:34 -0800 | [diff] [blame] | 101 | for key in ['id', 'name']: |
| 102 | self.assertEqual(network[key], self.network[key]) |
Unmesh Gurjar | 4498683 | 2012-05-08 19:57:10 +0530 | [diff] [blame] | 103 | |
Masayuki Igawa | 6d495d6 | 2014-03-19 16:38:57 +0900 | [diff] [blame] | 104 | @test.attr(type='smoke') |
jun xie | d557d9b | 2014-01-09 14:00:36 +0800 | [diff] [blame] | 105 | def test_show_network_fields(self): |
Mark Maglana | 5885eb3 | 2014-02-28 10:57:34 -0800 | [diff] [blame] | 106 | # Verify specific fields of a network |
Zhi Kun Liu | 903596c | 2014-04-11 08:55:53 -0500 | [diff] [blame] | 107 | fields = ['id', 'name'] |
Rohan Kanade | eeb2164 | 2014-08-14 12:00:26 +0200 | [diff] [blame] | 108 | _, body = self.client.show_network(self.network['id'], |
| 109 | fields=fields) |
jun xie | d557d9b | 2014-01-09 14:00:36 +0800 | [diff] [blame] | 110 | network = body['network'] |
Zhi Kun Liu | 903596c | 2014-04-11 08:55:53 -0500 | [diff] [blame] | 111 | self.assertEqual(sorted(network.keys()), sorted(fields)) |
| 112 | for field_name in fields: |
Mark Maglana | 5885eb3 | 2014-02-28 10:57:34 -0800 | [diff] [blame] | 113 | self.assertEqual(network[field_name], self.network[field_name]) |
jun xie | d557d9b | 2014-01-09 14:00:36 +0800 | [diff] [blame] | 114 | |
Masayuki Igawa | 6d495d6 | 2014-03-19 16:38:57 +0900 | [diff] [blame] | 115 | @test.attr(type='smoke') |
Unmesh Gurjar | 4498683 | 2012-05-08 19:57:10 +0530 | [diff] [blame] | 116 | def test_list_networks(self): |
Sean Dague | 46c4a2b | 2013-01-03 17:54:17 -0500 | [diff] [blame] | 117 | # Verify the network exists in the list of all networks |
Rohan Kanade | eeb2164 | 2014-08-14 12:00:26 +0200 | [diff] [blame] | 118 | _, body = self.client.list_networks() |
Mark Maglana | 5885eb3 | 2014-02-28 10:57:34 -0800 | [diff] [blame] | 119 | networks = [network['id'] for network in body['networks'] |
| 120 | if network['id'] == self.network['id']] |
| 121 | self.assertNotEmpty(networks, "Created network not found in the list") |
Unmesh Gurjar | 4498683 | 2012-05-08 19:57:10 +0530 | [diff] [blame] | 122 | |
Masayuki Igawa | 6d495d6 | 2014-03-19 16:38:57 +0900 | [diff] [blame] | 123 | @test.attr(type='smoke') |
jun xie | 0b4735d | 2014-01-07 15:42:58 +0800 | [diff] [blame] | 124 | def test_list_networks_fields(self): |
Mark Maglana | 5885eb3 | 2014-02-28 10:57:34 -0800 | [diff] [blame] | 125 | # Verify specific fields of the networks |
Zhi Kun Liu | 903596c | 2014-04-11 08:55:53 -0500 | [diff] [blame] | 126 | fields = ['id', 'name'] |
Rohan Kanade | eeb2164 | 2014-08-14 12:00:26 +0200 | [diff] [blame] | 127 | _, body = self.client.list_networks(fields=fields) |
jun xie | 0b4735d | 2014-01-07 15:42:58 +0800 | [diff] [blame] | 128 | networks = body['networks'] |
Mark Maglana | 5885eb3 | 2014-02-28 10:57:34 -0800 | [diff] [blame] | 129 | self.assertNotEmpty(networks, "Network list returned is empty") |
| 130 | for network in networks: |
Zhi Kun Liu | 903596c | 2014-04-11 08:55:53 -0500 | [diff] [blame] | 131 | self.assertEqual(sorted(network.keys()), sorted(fields)) |
jun xie | 0b4735d | 2014-01-07 15:42:58 +0800 | [diff] [blame] | 132 | |
Masayuki Igawa | 6d495d6 | 2014-03-19 16:38:57 +0900 | [diff] [blame] | 133 | @test.attr(type='smoke') |
Miguel Lavalle | cc93961 | 2013-02-22 17:27:20 -0600 | [diff] [blame] | 134 | def test_show_subnet(self): |
Mark Maglana | 5885eb3 | 2014-02-28 10:57:34 -0800 | [diff] [blame] | 135 | # Verify the details of a subnet |
Rohan Kanade | eeb2164 | 2014-08-14 12:00:26 +0200 | [diff] [blame] | 136 | _, body = self.client.show_subnet(self.subnet['id']) |
Miguel Lavalle | cc93961 | 2013-02-22 17:27:20 -0600 | [diff] [blame] | 137 | subnet = body['subnet'] |
Mark Maglana | 5885eb3 | 2014-02-28 10:57:34 -0800 | [diff] [blame] | 138 | self.assertNotEmpty(subnet, "Subnet returned has no fields") |
| 139 | for key in ['id', 'cidr']: |
| 140 | self.assertIn(key, subnet) |
| 141 | self.assertEqual(subnet[key], self.subnet[key]) |
Miguel Lavalle | cc93961 | 2013-02-22 17:27:20 -0600 | [diff] [blame] | 142 | |
Masayuki Igawa | 6d495d6 | 2014-03-19 16:38:57 +0900 | [diff] [blame] | 143 | @test.attr(type='smoke') |
jun xie | d557d9b | 2014-01-09 14:00:36 +0800 | [diff] [blame] | 144 | def test_show_subnet_fields(self): |
Mark Maglana | 5885eb3 | 2014-02-28 10:57:34 -0800 | [diff] [blame] | 145 | # Verify specific fields of a subnet |
Zhi Kun Liu | 903596c | 2014-04-11 08:55:53 -0500 | [diff] [blame] | 146 | fields = ['id', 'network_id'] |
Rohan Kanade | eeb2164 | 2014-08-14 12:00:26 +0200 | [diff] [blame] | 147 | _, body = self.client.show_subnet(self.subnet['id'], |
| 148 | fields=fields) |
jun xie | d557d9b | 2014-01-09 14:00:36 +0800 | [diff] [blame] | 149 | subnet = body['subnet'] |
Zhi Kun Liu | 903596c | 2014-04-11 08:55:53 -0500 | [diff] [blame] | 150 | self.assertEqual(sorted(subnet.keys()), sorted(fields)) |
| 151 | for field_name in fields: |
Mark Maglana | 5885eb3 | 2014-02-28 10:57:34 -0800 | [diff] [blame] | 152 | self.assertEqual(subnet[field_name], self.subnet[field_name]) |
jun xie | d557d9b | 2014-01-09 14:00:36 +0800 | [diff] [blame] | 153 | |
Masayuki Igawa | 6d495d6 | 2014-03-19 16:38:57 +0900 | [diff] [blame] | 154 | @test.attr(type='smoke') |
Miguel Lavalle | cc93961 | 2013-02-22 17:27:20 -0600 | [diff] [blame] | 155 | def test_list_subnets(self): |
| 156 | # Verify the subnet exists in the list of all subnets |
Rohan Kanade | eeb2164 | 2014-08-14 12:00:26 +0200 | [diff] [blame] | 157 | _, body = self.client.list_subnets() |
Mark Maglana | 5885eb3 | 2014-02-28 10:57:34 -0800 | [diff] [blame] | 158 | subnets = [subnet['id'] for subnet in body['subnets'] |
| 159 | if subnet['id'] == self.subnet['id']] |
| 160 | self.assertNotEmpty(subnets, "Created subnet not found in the list") |
raiesmh08 | e1aad98 | 2013-08-05 14:19:36 +0530 | [diff] [blame] | 161 | |
Masayuki Igawa | 6d495d6 | 2014-03-19 16:38:57 +0900 | [diff] [blame] | 162 | @test.attr(type='smoke') |
jun xie | 0b4735d | 2014-01-07 15:42:58 +0800 | [diff] [blame] | 163 | def test_list_subnets_fields(self): |
Mark Maglana | 5885eb3 | 2014-02-28 10:57:34 -0800 | [diff] [blame] | 164 | # Verify specific fields of subnets |
Zhi Kun Liu | 903596c | 2014-04-11 08:55:53 -0500 | [diff] [blame] | 165 | fields = ['id', 'network_id'] |
Rohan Kanade | eeb2164 | 2014-08-14 12:00:26 +0200 | [diff] [blame] | 166 | _, body = self.client.list_subnets(fields=fields) |
jun xie | 0b4735d | 2014-01-07 15:42:58 +0800 | [diff] [blame] | 167 | subnets = body['subnets'] |
Mark Maglana | 5885eb3 | 2014-02-28 10:57:34 -0800 | [diff] [blame] | 168 | self.assertNotEmpty(subnets, "Subnet list returned is empty") |
| 169 | for subnet in subnets: |
Zhi Kun Liu | 903596c | 2014-04-11 08:55:53 -0500 | [diff] [blame] | 170 | self.assertEqual(sorted(subnet.keys()), sorted(fields)) |
jun xie | 0b4735d | 2014-01-07 15:42:58 +0800 | [diff] [blame] | 171 | |
sukhdev | c704a70 | 2014-01-15 11:50:56 -0800 | [diff] [blame] | 172 | def _try_delete_network(self, net_id): |
| 173 | # delete network, if it exists |
| 174 | try: |
| 175 | self.client.delete_network(net_id) |
| 176 | # if network is not found, this means it was deleted in the test |
| 177 | except exceptions.NotFound: |
| 178 | pass |
| 179 | |
Masayuki Igawa | 6d495d6 | 2014-03-19 16:38:57 +0900 | [diff] [blame] | 180 | @test.attr(type='smoke') |
sukhdev | c704a70 | 2014-01-15 11:50:56 -0800 | [diff] [blame] | 181 | def test_delete_network_with_subnet(self): |
| 182 | # Creates a network |
| 183 | name = data_utils.rand_name('network-') |
Rohan Kanade | eeb2164 | 2014-08-14 12:00:26 +0200 | [diff] [blame] | 184 | _, body = self.client.create_network(name=name) |
sukhdev | c704a70 | 2014-01-15 11:50:56 -0800 | [diff] [blame] | 185 | network = body['network'] |
| 186 | net_id = network['id'] |
| 187 | self.addCleanup(self._try_delete_network, net_id) |
| 188 | |
| 189 | # Find a cidr that is not in use yet and create a subnet with it |
| 190 | subnet = self.create_subnet(network) |
| 191 | subnet_id = subnet['id'] |
| 192 | |
| 193 | # Delete network while the subnet still exists |
Rohan Kanade | eeb2164 | 2014-08-14 12:00:26 +0200 | [diff] [blame] | 194 | _, body = self.client.delete_network(net_id) |
sukhdev | c704a70 | 2014-01-15 11:50:56 -0800 | [diff] [blame] | 195 | |
| 196 | # Verify that the subnet got automatically deleted. |
| 197 | self.assertRaises(exceptions.NotFound, self.client.show_subnet, |
| 198 | subnet_id) |
| 199 | |
| 200 | # Since create_subnet adds the subnet to the delete list, and it is |
| 201 | # is actually deleted here - this will create and issue, hence remove |
| 202 | # it from the list. |
| 203 | self.subnets.pop() |
| 204 | |
Edgar Magana | 6a9ac34 | 2014-01-16 13:52:49 -0800 | [diff] [blame] | 205 | @test.attr(type='smoke') |
| 206 | def test_create_delete_subnet_with_gw(self): |
| 207 | gateway = '10.100.0.13' |
| 208 | name = data_utils.rand_name('network-') |
Rohan Kanade | eeb2164 | 2014-08-14 12:00:26 +0200 | [diff] [blame] | 209 | _, body = self.client.create_network(name=name) |
Edgar Magana | 6a9ac34 | 2014-01-16 13:52:49 -0800 | [diff] [blame] | 210 | network = body['network'] |
| 211 | net_id = network['id'] |
| 212 | subnet = self.create_subnet(network, gateway) |
| 213 | # Verifies Subnet GW in IPv4 |
| 214 | self.assertEqual(subnet['gateway_ip'], gateway) |
| 215 | # Delete network and subnet |
Rohan Kanade | eeb2164 | 2014-08-14 12:00:26 +0200 | [diff] [blame] | 216 | self.client.delete_network(net_id) |
Edgar Magana | 6a9ac34 | 2014-01-16 13:52:49 -0800 | [diff] [blame] | 217 | self.subnets.pop() |
| 218 | |
| 219 | @test.attr(type='smoke') |
| 220 | def test_create_delete_subnet_without_gw(self): |
sridhargaddam | b1e5889 | 2014-05-13 14:18:14 +0530 | [diff] [blame] | 221 | net = netaddr.IPNetwork(CONF.network.tenant_network_cidr) |
| 222 | gateway_ip = str(netaddr.IPAddress(net.first + 1)) |
Edgar Magana | 6a9ac34 | 2014-01-16 13:52:49 -0800 | [diff] [blame] | 223 | name = data_utils.rand_name('network-') |
Rohan Kanade | eeb2164 | 2014-08-14 12:00:26 +0200 | [diff] [blame] | 224 | _, body = self.client.create_network(name=name) |
Edgar Magana | 6a9ac34 | 2014-01-16 13:52:49 -0800 | [diff] [blame] | 225 | network = body['network'] |
| 226 | net_id = network['id'] |
| 227 | subnet = self.create_subnet(network) |
| 228 | # Verifies Subnet GW in IPv4 |
sridhargaddam | b1e5889 | 2014-05-13 14:18:14 +0530 | [diff] [blame] | 229 | self.assertEqual(subnet['gateway_ip'], gateway_ip) |
Edgar Magana | 6a9ac34 | 2014-01-16 13:52:49 -0800 | [diff] [blame] | 230 | # Delete network and subnet |
Rohan Kanade | eeb2164 | 2014-08-14 12:00:26 +0200 | [diff] [blame] | 231 | self.client.delete_network(net_id) |
Edgar Magana | 6a9ac34 | 2014-01-16 13:52:49 -0800 | [diff] [blame] | 232 | self.subnets.pop() |
| 233 | |
raiesmh08 | 6b055e2 | 2013-09-16 12:59:57 +0530 | [diff] [blame] | 234 | |
| 235 | class NetworksTestXML(NetworksTestJSON): |
| 236 | _interface = 'xml' |
| 237 | |
| 238 | |
Ken'ichi Ohmichi | 91c675d | 2014-02-06 02:15:21 +0900 | [diff] [blame] | 239 | class BulkNetworkOpsTestJSON(base.BaseNetworkTest): |
raiesmh08 | 6b055e2 | 2013-09-16 12:59:57 +0530 | [diff] [blame] | 240 | _interface = 'json' |
| 241 | |
| 242 | """ |
| 243 | Tests the following operations in the Neutron API using the REST client for |
| 244 | Neutron: |
| 245 | |
| 246 | bulk network creation |
| 247 | bulk subnet creation |
Eugene Nikanorov | e9d255a | 2013-12-18 16:31:42 +0400 | [diff] [blame] | 248 | bulk port creation |
raiesmh08 | 6b055e2 | 2013-09-16 12:59:57 +0530 | [diff] [blame] | 249 | list tenant's networks |
| 250 | |
| 251 | v2.0 of the Neutron API is assumed. It is also assumed that the following |
| 252 | options are defined in the [network] section of etc/tempest.conf: |
| 253 | |
| 254 | tenant_network_cidr with a block of cidr's from which smaller blocks |
| 255 | can be allocated for tenant networks |
| 256 | |
| 257 | tenant_network_mask_bits with the mask bits to be used to partition the |
| 258 | block defined by tenant-network_cidr |
| 259 | """ |
| 260 | |
raiesmh08 | 6b055e2 | 2013-09-16 12:59:57 +0530 | [diff] [blame] | 261 | def _delete_networks(self, created_networks): |
| 262 | for n in created_networks: |
Rohan Kanade | eeb2164 | 2014-08-14 12:00:26 +0200 | [diff] [blame] | 263 | self.client.delete_network(n['id']) |
raiesmh08 | 6b055e2 | 2013-09-16 12:59:57 +0530 | [diff] [blame] | 264 | # Asserting that the networks are not found in the list after deletion |
| 265 | resp, body = self.client.list_networks() |
Mark Maglana | 5885eb3 | 2014-02-28 10:57:34 -0800 | [diff] [blame] | 266 | networks_list = [network['id'] for network in body['networks']] |
raiesmh08 | 6b055e2 | 2013-09-16 12:59:57 +0530 | [diff] [blame] | 267 | for n in created_networks: |
| 268 | self.assertNotIn(n['id'], networks_list) |
| 269 | |
| 270 | def _delete_subnets(self, created_subnets): |
| 271 | for n in created_subnets: |
Rohan Kanade | eeb2164 | 2014-08-14 12:00:26 +0200 | [diff] [blame] | 272 | self.client.delete_subnet(n['id']) |
raiesmh08 | 6b055e2 | 2013-09-16 12:59:57 +0530 | [diff] [blame] | 273 | # Asserting that the subnets are not found in the list after deletion |
| 274 | resp, body = self.client.list_subnets() |
Mark Maglana | 5885eb3 | 2014-02-28 10:57:34 -0800 | [diff] [blame] | 275 | subnets_list = [subnet['id'] for subnet in body['subnets']] |
raiesmh08 | 6b055e2 | 2013-09-16 12:59:57 +0530 | [diff] [blame] | 276 | for n in created_subnets: |
| 277 | self.assertNotIn(n['id'], subnets_list) |
| 278 | |
| 279 | def _delete_ports(self, created_ports): |
| 280 | for n in created_ports: |
Rohan Kanade | eeb2164 | 2014-08-14 12:00:26 +0200 | [diff] [blame] | 281 | self.client.delete_port(n['id']) |
raiesmh08 | 6b055e2 | 2013-09-16 12:59:57 +0530 | [diff] [blame] | 282 | # Asserting that the ports are not found in the list after deletion |
| 283 | resp, body = self.client.list_ports() |
Mark Maglana | 5885eb3 | 2014-02-28 10:57:34 -0800 | [diff] [blame] | 284 | ports_list = [port['id'] for port in body['ports']] |
raiesmh08 | 6b055e2 | 2013-09-16 12:59:57 +0530 | [diff] [blame] | 285 | for n in created_ports: |
| 286 | self.assertNotIn(n['id'], ports_list) |
| 287 | |
Masayuki Igawa | 6d495d6 | 2014-03-19 16:38:57 +0900 | [diff] [blame] | 288 | @test.attr(type='smoke') |
Nayna Patel | b03eab4 | 2013-08-08 08:58:48 +0000 | [diff] [blame] | 289 | def test_bulk_create_delete_network(self): |
| 290 | # Creates 2 networks in one request |
Masayuki Igawa | 259c113 | 2013-10-31 17:48:44 +0900 | [diff] [blame] | 291 | network_names = [data_utils.rand_name('network-'), |
| 292 | data_utils.rand_name('network-')] |
Rohan Kanade | eeb2164 | 2014-08-14 12:00:26 +0200 | [diff] [blame] | 293 | _, body = self.client.create_bulk_network(network_names) |
Nayna Patel | b03eab4 | 2013-08-08 08:58:48 +0000 | [diff] [blame] | 294 | created_networks = body['networks'] |
Nayna Patel | b03eab4 | 2013-08-08 08:58:48 +0000 | [diff] [blame] | 295 | self.addCleanup(self._delete_networks, created_networks) |
| 296 | # Asserting that the networks are found in the list after creation |
| 297 | resp, body = self.client.list_networks() |
Mark Maglana | 5885eb3 | 2014-02-28 10:57:34 -0800 | [diff] [blame] | 298 | networks_list = [network['id'] for network in body['networks']] |
Nayna Patel | b03eab4 | 2013-08-08 08:58:48 +0000 | [diff] [blame] | 299 | for n in created_networks: |
| 300 | self.assertIsNotNone(n['id']) |
| 301 | self.assertIn(n['id'], networks_list) |
raiesmh08 | 6769832 | 2013-08-20 13:09:01 +0530 | [diff] [blame] | 302 | |
Masayuki Igawa | 6d495d6 | 2014-03-19 16:38:57 +0900 | [diff] [blame] | 303 | @test.attr(type='smoke') |
raiesmh08 | 2d5c651 | 2013-09-06 15:35:05 +0530 | [diff] [blame] | 304 | def test_bulk_create_delete_subnet(self): |
Assaf Muller | e4f7899 | 2014-06-19 17:32:14 +0300 | [diff] [blame] | 305 | networks = [self.create_network(), self.create_network()] |
raiesmh08 | 2d5c651 | 2013-09-06 15:35:05 +0530 | [diff] [blame] | 306 | # Creates 2 subnets in one request |
Matthew Treinish | 03b48df | 2014-01-29 16:59:49 +0000 | [diff] [blame] | 307 | cidr = netaddr.IPNetwork(CONF.network.tenant_network_cidr) |
| 308 | mask_bits = CONF.network.tenant_network_mask_bits |
Mark Maglana | 5885eb3 | 2014-02-28 10:57:34 -0800 | [diff] [blame] | 309 | cidrs = [subnet_cidr for subnet_cidr in cidr.subnet(mask_bits)] |
Mark Maglana | 5885eb3 | 2014-02-28 10:57:34 -0800 | [diff] [blame] | 310 | names = [data_utils.rand_name('subnet-') for i in range(len(networks))] |
| 311 | subnets_list = [] |
raiesmh08 | 2d5c651 | 2013-09-06 15:35:05 +0530 | [diff] [blame] | 312 | # TODO(raies): "for IPv6, version list [4, 6] will be used. |
| 313 | # and cidr for IPv6 will be of IPv6" |
| 314 | ip_version = [4, 4] |
| 315 | for i in range(len(names)): |
| 316 | p1 = { |
Assaf Muller | e4f7899 | 2014-06-19 17:32:14 +0300 | [diff] [blame] | 317 | 'network_id': networks[i]['id'], |
raiesmh08 | 2d5c651 | 2013-09-06 15:35:05 +0530 | [diff] [blame] | 318 | 'cidr': str(cidrs[(i)]), |
| 319 | 'name': names[i], |
| 320 | 'ip_version': ip_version[i] |
| 321 | } |
Mark Maglana | 5885eb3 | 2014-02-28 10:57:34 -0800 | [diff] [blame] | 322 | subnets_list.append(p1) |
| 323 | del subnets_list[1]['name'] |
Rohan Kanade | eeb2164 | 2014-08-14 12:00:26 +0200 | [diff] [blame] | 324 | _, body = self.client.create_bulk_subnet(subnets_list) |
raiesmh08 | 2d5c651 | 2013-09-06 15:35:05 +0530 | [diff] [blame] | 325 | created_subnets = body['subnets'] |
| 326 | self.addCleanup(self._delete_subnets, created_subnets) |
raiesmh08 | 2d5c651 | 2013-09-06 15:35:05 +0530 | [diff] [blame] | 327 | # Asserting that the subnets are found in the list after creation |
| 328 | resp, body = self.client.list_subnets() |
Mark Maglana | 5885eb3 | 2014-02-28 10:57:34 -0800 | [diff] [blame] | 329 | subnets_list = [subnet['id'] for subnet in body['subnets']] |
raiesmh08 | 2d5c651 | 2013-09-06 15:35:05 +0530 | [diff] [blame] | 330 | for n in created_subnets: |
| 331 | self.assertIsNotNone(n['id']) |
| 332 | self.assertIn(n['id'], subnets_list) |
| 333 | |
Masayuki Igawa | 6d495d6 | 2014-03-19 16:38:57 +0900 | [diff] [blame] | 334 | @test.attr(type='smoke') |
raiesmh08 | 2d5c651 | 2013-09-06 15:35:05 +0530 | [diff] [blame] | 335 | def test_bulk_create_delete_port(self): |
Assaf Muller | e4f7899 | 2014-06-19 17:32:14 +0300 | [diff] [blame] | 336 | networks = [self.create_network(), self.create_network()] |
raiesmh08 | 2d5c651 | 2013-09-06 15:35:05 +0530 | [diff] [blame] | 337 | # Creates 2 ports in one request |
Mark Maglana | 5885eb3 | 2014-02-28 10:57:34 -0800 | [diff] [blame] | 338 | names = [data_utils.rand_name('port-') for i in range(len(networks))] |
raiesmh08 | 2d5c651 | 2013-09-06 15:35:05 +0530 | [diff] [blame] | 339 | port_list = [] |
| 340 | state = [True, False] |
| 341 | for i in range(len(names)): |
| 342 | p1 = { |
Assaf Muller | e4f7899 | 2014-06-19 17:32:14 +0300 | [diff] [blame] | 343 | 'network_id': networks[i]['id'], |
raiesmh08 | 2d5c651 | 2013-09-06 15:35:05 +0530 | [diff] [blame] | 344 | 'name': names[i], |
| 345 | 'admin_state_up': state[i], |
| 346 | } |
| 347 | port_list.append(p1) |
| 348 | del port_list[1]['name'] |
Rohan Kanade | eeb2164 | 2014-08-14 12:00:26 +0200 | [diff] [blame] | 349 | _, body = self.client.create_bulk_port(port_list) |
raiesmh08 | 2d5c651 | 2013-09-06 15:35:05 +0530 | [diff] [blame] | 350 | created_ports = body['ports'] |
| 351 | self.addCleanup(self._delete_ports, created_ports) |
raiesmh08 | 2d5c651 | 2013-09-06 15:35:05 +0530 | [diff] [blame] | 352 | # Asserting that the ports are found in the list after creation |
| 353 | resp, body = self.client.list_ports() |
Mark Maglana | 5885eb3 | 2014-02-28 10:57:34 -0800 | [diff] [blame] | 354 | ports_list = [port['id'] for port in body['ports']] |
raiesmh08 | 2d5c651 | 2013-09-06 15:35:05 +0530 | [diff] [blame] | 355 | for n in created_ports: |
| 356 | self.assertIsNotNone(n['id']) |
| 357 | self.assertIn(n['id'], ports_list) |
| 358 | |
raiesmh08 | 6769832 | 2013-08-20 13:09:01 +0530 | [diff] [blame] | 359 | |
Ken'ichi Ohmichi | 91c675d | 2014-02-06 02:15:21 +0900 | [diff] [blame] | 360 | class BulkNetworkOpsTestXML(BulkNetworkOpsTestJSON): |
raiesmh08 | 6769832 | 2013-08-20 13:09:01 +0530 | [diff] [blame] | 361 | _interface = 'xml' |
Henry Gessau | ffda37a | 2014-01-16 11:17:55 -0500 | [diff] [blame] | 362 | |
| 363 | |
| 364 | class NetworksIpV6TestJSON(NetworksTestJSON): |
| 365 | _ip_version = 6 |
Henry Gessau | ffda37a | 2014-01-16 11:17:55 -0500 | [diff] [blame] | 366 | |
armando-migliaccio | 5bb7aef | 2014-02-19 21:55:14 -0800 | [diff] [blame] | 367 | @classmethod |
Andrea Frittoli | da4a245 | 2014-09-15 13:12:08 +0100 | [diff] [blame^] | 368 | def resource_setup(cls): |
Matthew Treinish | e2e33cf | 2014-03-03 19:28:41 +0000 | [diff] [blame] | 369 | if not CONF.network_feature_enabled.ipv6: |
armando-migliaccio | 5bb7aef | 2014-02-19 21:55:14 -0800 | [diff] [blame] | 370 | skip_msg = "IPv6 Tests are disabled." |
| 371 | raise cls.skipException(skip_msg) |
Andrea Frittoli | da4a245 | 2014-09-15 13:12:08 +0100 | [diff] [blame^] | 372 | super(NetworksIpV6TestJSON, cls).resource_setup() |
armando-migliaccio | 5bb7aef | 2014-02-19 21:55:14 -0800 | [diff] [blame] | 373 | |
Edgar Magana | 6a9ac34 | 2014-01-16 13:52:49 -0800 | [diff] [blame] | 374 | @test.attr(type='smoke') |
| 375 | def test_create_delete_subnet_with_gw(self): |
sridhargaddam | ea73d53 | 2014-05-13 14:48:30 +0530 | [diff] [blame] | 376 | net = netaddr.IPNetwork(CONF.network.tenant_network_v6_cidr) |
| 377 | gateway = str(netaddr.IPAddress(net.first + 2)) |
Edgar Magana | 6a9ac34 | 2014-01-16 13:52:49 -0800 | [diff] [blame] | 378 | name = data_utils.rand_name('network-') |
Rohan Kanade | eeb2164 | 2014-08-14 12:00:26 +0200 | [diff] [blame] | 379 | _, body = self.client.create_network(name=name) |
Edgar Magana | 6a9ac34 | 2014-01-16 13:52:49 -0800 | [diff] [blame] | 380 | network = body['network'] |
| 381 | net_id = network['id'] |
| 382 | subnet = self.create_subnet(network, gateway) |
| 383 | # Verifies Subnet GW in IPv6 |
| 384 | self.assertEqual(subnet['gateway_ip'], gateway) |
| 385 | # Delete network and subnet |
Rohan Kanade | eeb2164 | 2014-08-14 12:00:26 +0200 | [diff] [blame] | 386 | self.client.delete_network(net_id) |
Edgar Magana | 6a9ac34 | 2014-01-16 13:52:49 -0800 | [diff] [blame] | 387 | self.subnets.pop() |
| 388 | |
| 389 | @test.attr(type='smoke') |
| 390 | def test_create_delete_subnet_without_gw(self): |
sridhargaddam | ea73d53 | 2014-05-13 14:48:30 +0530 | [diff] [blame] | 391 | net = netaddr.IPNetwork(CONF.network.tenant_network_v6_cidr) |
| 392 | gateway_ip = str(netaddr.IPAddress(net.first + 1)) |
Edgar Magana | 6a9ac34 | 2014-01-16 13:52:49 -0800 | [diff] [blame] | 393 | name = data_utils.rand_name('network-') |
Rohan Kanade | eeb2164 | 2014-08-14 12:00:26 +0200 | [diff] [blame] | 394 | _, body = self.client.create_network(name=name) |
Edgar Magana | 6a9ac34 | 2014-01-16 13:52:49 -0800 | [diff] [blame] | 395 | network = body['network'] |
| 396 | net_id = network['id'] |
| 397 | subnet = self.create_subnet(network) |
| 398 | # Verifies Subnet GW in IPv6 |
sridhargaddam | ea73d53 | 2014-05-13 14:48:30 +0530 | [diff] [blame] | 399 | self.assertEqual(subnet['gateway_ip'], gateway_ip) |
Edgar Magana | 6a9ac34 | 2014-01-16 13:52:49 -0800 | [diff] [blame] | 400 | # Delete network and subnet |
Rohan Kanade | eeb2164 | 2014-08-14 12:00:26 +0200 | [diff] [blame] | 401 | _, body = self.client.delete_network(net_id) |
Edgar Magana | 6a9ac34 | 2014-01-16 13:52:49 -0800 | [diff] [blame] | 402 | self.subnets.pop() |
| 403 | |
Sean M. Collins | dd27a4d | 2014-05-13 10:33:15 -0400 | [diff] [blame] | 404 | @testtools.skipUnless(CONF.network_feature_enabled.ipv6_subnet_attributes, |
| 405 | "IPv6 extended attributes for subnets not " |
| 406 | "available") |
| 407 | @test.attr(type='smoke') |
| 408 | def test_create_delete_subnet_with_v6_attributes(self): |
| 409 | name = data_utils.rand_name('network-') |
Rohan Kanade | eeb2164 | 2014-08-14 12:00:26 +0200 | [diff] [blame] | 410 | _, body = self.client.create_network(name=name) |
Sean M. Collins | dd27a4d | 2014-05-13 10:33:15 -0400 | [diff] [blame] | 411 | network = body['network'] |
| 412 | net_id = network['id'] |
| 413 | subnet = self.create_subnet(network, |
| 414 | gateway='fe80::1', |
| 415 | ipv6_ra_mode='slaac', |
| 416 | ipv6_address_mode='slaac') |
| 417 | # Verifies Subnet GW in IPv6 |
| 418 | self.assertEqual(subnet['gateway_ip'], 'fe80::1') |
| 419 | self.assertEqual(subnet['ipv6_ra_mode'], 'slaac') |
| 420 | self.assertEqual(subnet['ipv6_address_mode'], 'slaac') |
| 421 | # Delete network and subnet |
Rohan Kanade | eeb2164 | 2014-08-14 12:00:26 +0200 | [diff] [blame] | 422 | self.client.delete_network(net_id) |
Sean M. Collins | dd27a4d | 2014-05-13 10:33:15 -0400 | [diff] [blame] | 423 | self.subnets.pop() |
| 424 | |
Henry Gessau | ffda37a | 2014-01-16 11:17:55 -0500 | [diff] [blame] | 425 | |
| 426 | class NetworksIpV6TestXML(NetworksIpV6TestJSON): |
| 427 | _interface = 'xml' |