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. |
Miguel Lavalle | cc93961 | 2013-02-22 17:27:20 -0600 | [diff] [blame] | 15 | import netaddr |
Matthew Treinish | 7142668 | 2015-04-23 11:19:38 -0400 | [diff] [blame] | 16 | import six |
Kevin Benton | 6919da4 | 2016-03-05 18:00:03 -0800 | [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 |
Rohan Kanade | 35589aa | 2014-08-19 14:56:12 +0200 | [diff] [blame] | 20 | from tempest.common import custom_matchers |
Andrea Frittoli | cd36841 | 2017-08-14 21:37:56 +0100 | [diff] [blame] | 21 | from tempest.common import utils |
Matthew Treinish | 03b48df | 2014-01-29 16:59:49 +0000 | [diff] [blame] | 22 | from tempest import config |
Ken'ichi Ohmichi | f50e4df | 2017-03-10 10:52:53 -0800 | [diff] [blame] | 23 | from tempest.lib.common.utils import data_utils |
Jordan Pittier | 9e227c5 | 2016-02-09 14:35:18 +0100 | [diff] [blame] | 24 | from tempest.lib.common.utils import test_utils |
Ken'ichi Ohmichi | 53b9a63 | 2017-01-27 18:04:39 -0800 | [diff] [blame] | 25 | from tempest.lib import decorators |
Andrea Frittoli (andreaf) | db9672e | 2016-02-23 14:07:24 -0500 | [diff] [blame] | 26 | from tempest.lib import exceptions as lib_exc |
Unmesh Gurjar | 4498683 | 2012-05-08 19:57:10 +0530 | [diff] [blame] | 27 | |
Matthew Treinish | 03b48df | 2014-01-29 16:59:49 +0000 | [diff] [blame] | 28 | CONF = config.CONF |
| 29 | |
Unmesh Gurjar | 4498683 | 2012-05-08 19:57:10 +0530 | [diff] [blame] | 30 | |
Jonte Watford | 871547c | 2016-10-10 20:11:04 +0000 | [diff] [blame] | 31 | class BaseNetworkTestResources(base.BaseNetworkTest): |
Miguel Lavalle | cc93961 | 2013-02-22 17:27:20 -0600 | [diff] [blame] | 32 | |
Unmesh Gurjar | 4498683 | 2012-05-08 19:57:10 +0530 | [diff] [blame] | 33 | @classmethod |
Andrea Frittoli | da4a245 | 2014-09-15 13:12:08 +0100 | [diff] [blame] | 34 | def resource_setup(cls): |
Jonte Watford | 871547c | 2016-10-10 20:11:04 +0000 | [diff] [blame] | 35 | super(BaseNetworkTestResources, cls).resource_setup() |
Jay Pipes | f4dad39 | 2012-06-05 16:03:58 -0400 | [diff] [blame] | 36 | cls.network = cls.create_network() |
venakata anil | 1a2a64a | 2014-12-02 07:25:59 +0000 | [diff] [blame] | 37 | cls.subnet = cls._create_subnet_with_last_subnet_block(cls.network, |
| 38 | cls._ip_version) |
Rohan Kanade | 35589aa | 2014-08-19 14:56:12 +0200 | [diff] [blame] | 39 | cls._subnet_data = {6: {'gateway': |
| 40 | str(cls._get_gateway_from_tempest_conf(6)), |
| 41 | 'allocation_pools': |
| 42 | cls._get_allocation_pools_from_gateway(6), |
| 43 | 'dns_nameservers': ['2001:4860:4860::8844', |
| 44 | '2001:4860:4860::8888'], |
| 45 | 'host_routes': [{'destination': '2001::/64', |
| 46 | 'nexthop': '2003::1'}], |
| 47 | 'new_host_routes': [{'destination': |
| 48 | '2001::/64', |
| 49 | 'nexthop': '2005::1'}], |
| 50 | 'new_dns_nameservers': |
| 51 | ['2001:4860:4860::7744', |
| 52 | '2001:4860:4860::7888']}, |
| 53 | 4: {'gateway': |
| 54 | str(cls._get_gateway_from_tempest_conf(4)), |
| 55 | 'allocation_pools': |
| 56 | cls._get_allocation_pools_from_gateway(4), |
| 57 | 'dns_nameservers': ['8.8.4.4', '8.8.8.8'], |
| 58 | 'host_routes': [{'destination': '10.20.0.0/32', |
| 59 | 'nexthop': '10.100.1.1'}], |
| 60 | 'new_host_routes': [{'destination': |
| 61 | '10.20.0.0/32', |
| 62 | 'nexthop': |
| 63 | '10.100.1.2'}], |
| 64 | 'new_dns_nameservers': ['7.8.8.8', '7.8.4.4']}} |
| 65 | |
| 66 | @classmethod |
venakata anil | 1a2a64a | 2014-12-02 07:25:59 +0000 | [diff] [blame] | 67 | def _create_subnet_with_last_subnet_block(cls, network, ip_version): |
Sean Dague | ed6e586 | 2016-04-04 10:49:13 -0400 | [diff] [blame] | 68 | # Derive last subnet CIDR block from project CIDR and |
Ken'ichi Ohmichi | e03bea9 | 2015-11-19 07:45:58 +0000 | [diff] [blame] | 69 | # create the subnet with that derived CIDR |
venakata anil | 1a2a64a | 2014-12-02 07:25:59 +0000 | [diff] [blame] | 70 | if ip_version == 4: |
Sean Dague | ed6e586 | 2016-04-04 10:49:13 -0400 | [diff] [blame] | 71 | cidr = netaddr.IPNetwork(CONF.network.project_network_cidr) |
| 72 | mask_bits = CONF.network.project_network_mask_bits |
venakata anil | 1a2a64a | 2014-12-02 07:25:59 +0000 | [diff] [blame] | 73 | elif ip_version == 6: |
Sean Dague | ed6e586 | 2016-04-04 10:49:13 -0400 | [diff] [blame] | 74 | cidr = netaddr.IPNetwork(CONF.network.project_network_v6_cidr) |
| 75 | mask_bits = CONF.network.project_network_v6_mask_bits |
venakata anil | 1a2a64a | 2014-12-02 07:25:59 +0000 | [diff] [blame] | 76 | |
| 77 | subnet_cidr = list(cidr.subnet(mask_bits))[-1] |
| 78 | gateway_ip = str(netaddr.IPAddress(subnet_cidr) + 1) |
| 79 | return cls.create_subnet(network, gateway=gateway_ip, |
| 80 | cidr=subnet_cidr, mask_bits=mask_bits) |
| 81 | |
| 82 | @classmethod |
Rohan Kanade | 35589aa | 2014-08-19 14:56:12 +0200 | [diff] [blame] | 83 | def _get_gateway_from_tempest_conf(cls, ip_version): |
| 84 | """Return first subnet gateway for configured CIDR """ |
| 85 | if ip_version == 4: |
Sean Dague | ed6e586 | 2016-04-04 10:49:13 -0400 | [diff] [blame] | 86 | cidr = netaddr.IPNetwork(CONF.network.project_network_cidr) |
| 87 | mask_bits = CONF.network.project_network_mask_bits |
Rohan Kanade | 35589aa | 2014-08-19 14:56:12 +0200 | [diff] [blame] | 88 | elif ip_version == 6: |
Sean Dague | ed6e586 | 2016-04-04 10:49:13 -0400 | [diff] [blame] | 89 | cidr = netaddr.IPNetwork(CONF.network.project_network_v6_cidr) |
| 90 | mask_bits = CONF.network.project_network_v6_mask_bits |
Rohan Kanade | 35589aa | 2014-08-19 14:56:12 +0200 | [diff] [blame] | 91 | |
| 92 | if mask_bits >= cidr.prefixlen: |
| 93 | return netaddr.IPAddress(cidr) + 1 |
| 94 | else: |
| 95 | for subnet in cidr.subnet(mask_bits): |
| 96 | return netaddr.IPAddress(subnet) + 1 |
| 97 | |
| 98 | @classmethod |
| 99 | def _get_allocation_pools_from_gateway(cls, ip_version): |
| 100 | """Return allocation range for subnet of given gateway""" |
| 101 | gateway = cls._get_gateway_from_tempest_conf(ip_version) |
Hynek Mlnarik | be634fc | 2016-06-27 09:34:15 +0200 | [diff] [blame] | 102 | return [{'start': str(gateway + 2), 'end': str(gateway + 6)}] |
Rohan Kanade | 35589aa | 2014-08-19 14:56:12 +0200 | [diff] [blame] | 103 | |
| 104 | def subnet_dict(self, include_keys): |
Ken'ichi Ohmichi | e03bea9 | 2015-11-19 07:45:58 +0000 | [diff] [blame] | 105 | # Return a subnet dict which has include_keys and their corresponding |
| 106 | # value from self._subnet_data |
Rohan Kanade | 35589aa | 2014-08-19 14:56:12 +0200 | [diff] [blame] | 107 | return dict((key, self._subnet_data[self._ip_version][key]) |
| 108 | for key in include_keys) |
| 109 | |
| 110 | def _compare_resource_attrs(self, actual, expected): |
| 111 | exclude_keys = set(actual).symmetric_difference(expected) |
| 112 | self.assertThat(actual, custom_matchers.MatchesDictExceptForKeys( |
| 113 | expected, exclude_keys)) |
| 114 | |
venakata anil | 1a2a64a | 2014-12-02 07:25:59 +0000 | [diff] [blame] | 115 | def _delete_network(self, network): |
| 116 | # Deleting network also deletes its subnets if exists |
John Warren | 94d8faf | 2015-09-15 12:22:24 -0400 | [diff] [blame] | 117 | self.networks_client.delete_network(network['id']) |
venakata anil | 1a2a64a | 2014-12-02 07:25:59 +0000 | [diff] [blame] | 118 | if network in self.networks: |
| 119 | self.networks.remove(network) |
| 120 | for subnet in self.subnets: |
| 121 | if subnet['network_id'] == network['id']: |
| 122 | self.subnets.remove(subnet) |
| 123 | |
Rohan Kanade | 35589aa | 2014-08-19 14:56:12 +0200 | [diff] [blame] | 124 | def _create_verify_delete_subnet(self, cidr=None, mask_bits=None, |
| 125 | **kwargs): |
| 126 | network = self.create_network() |
| 127 | net_id = network['id'] |
| 128 | gateway = kwargs.pop('gateway', None) |
| 129 | subnet = self.create_subnet(network, gateway, cidr, mask_bits, |
| 130 | **kwargs) |
| 131 | compare_args_full = dict(gateway_ip=gateway, cidr=cidr, |
| 132 | mask_bits=mask_bits, **kwargs) |
guo yunxian | 7bbbec1 | 2016-08-21 20:03:10 +0800 | [diff] [blame] | 133 | compare_args = dict((k, v) for k, v in compare_args_full.items() |
Rohan Kanade | 35589aa | 2014-08-19 14:56:12 +0200 | [diff] [blame] | 134 | if v is not None) |
| 135 | |
| 136 | if 'dns_nameservers' in set(subnet).intersection(compare_args): |
| 137 | self.assertEqual(sorted(compare_args['dns_nameservers']), |
| 138 | sorted(subnet['dns_nameservers'])) |
| 139 | del subnet['dns_nameservers'], compare_args['dns_nameservers'] |
| 140 | |
| 141 | self._compare_resource_attrs(subnet, compare_args) |
John Warren | 94d8faf | 2015-09-15 12:22:24 -0400 | [diff] [blame] | 142 | self.networks_client.delete_network(net_id) |
Rohan Kanade | 35589aa | 2014-08-19 14:56:12 +0200 | [diff] [blame] | 143 | self.networks.pop() |
| 144 | self.subnets.pop() |
Unmesh Gurjar | 4498683 | 2012-05-08 19:57:10 +0530 | [diff] [blame] | 145 | |
Jonte Watford | 871547c | 2016-10-10 20:11:04 +0000 | [diff] [blame] | 146 | |
| 147 | class NetworksTest(BaseNetworkTestResources): |
| 148 | """Tests the following operations in the Neutron API: |
| 149 | |
| 150 | create a network for a project |
| 151 | list project's networks |
| 152 | show a project network details |
| 153 | create a subnet for a project |
| 154 | list project's subnets |
| 155 | show a project subnet details |
| 156 | network update |
| 157 | subnet update |
| 158 | delete a network also deletes its subnets |
| 159 | list external networks |
| 160 | |
| 161 | All subnet tests are run once with ipv4 and once with ipv6. |
| 162 | |
| 163 | v2.0 of the Neutron API is assumed. It is also assumed that the following |
| 164 | options are defined in the [network] section of etc/tempest.conf: |
| 165 | |
| 166 | project_network_cidr with a block of cidr's from which smaller blocks |
| 167 | can be allocated for project ipv4 subnets |
| 168 | |
| 169 | project_network_v6_cidr is the equivalent for ipv6 subnets |
| 170 | |
| 171 | project_network_mask_bits with the mask bits to be used to partition |
| 172 | the block defined by project_network_cidr |
| 173 | |
| 174 | project_network_v6_mask_bits is the equivalent for ipv6 subnets |
| 175 | """ |
| 176 | |
Jordan Pittier | 3b46d27 | 2017-04-12 16:17:28 +0200 | [diff] [blame] | 177 | @decorators.attr(type='smoke') |
Ken'ichi Ohmichi | 53b9a63 | 2017-01-27 18:04:39 -0800 | [diff] [blame] | 178 | @decorators.idempotent_id('0e269138-0da6-4efc-a46d-578161e7b221') |
raiesmh08 | e1aad98 | 2013-08-05 14:19:36 +0530 | [diff] [blame] | 179 | def test_create_update_delete_network_subnet(self): |
Mark Maglana | 5885eb3 | 2014-02-28 10:57:34 -0800 | [diff] [blame] | 180 | # Create a network |
zhufl | d2c40ca | 2016-10-18 17:03:07 +0800 | [diff] [blame] | 181 | network = self.create_network() |
venakata anil | 1a2a64a | 2014-12-02 07:25:59 +0000 | [diff] [blame] | 182 | self.addCleanup(self._delete_network, network) |
raiesmh08 | e1aad98 | 2013-08-05 14:19:36 +0530 | [diff] [blame] | 183 | net_id = network['id'] |
Santosh Kumar | 42c9480 | 2014-08-08 04:31:42 -0700 | [diff] [blame] | 184 | self.assertEqual('ACTIVE', network['status']) |
Mark Maglana | 5885eb3 | 2014-02-28 10:57:34 -0800 | [diff] [blame] | 185 | # Verify network update |
raiesmh08 | e1aad98 | 2013-08-05 14:19:36 +0530 | [diff] [blame] | 186 | new_name = "New_network" |
John Warren | 94d8faf | 2015-09-15 12:22:24 -0400 | [diff] [blame] | 187 | body = self.networks_client.update_network(net_id, name=new_name) |
raiesmh08 | e1aad98 | 2013-08-05 14:19:36 +0530 | [diff] [blame] | 188 | updated_net = body['network'] |
| 189 | self.assertEqual(updated_net['name'], new_name) |
Miguel Lavalle | cc93961 | 2013-02-22 17:27:20 -0600 | [diff] [blame] | 190 | # 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] | 191 | subnet = self.create_subnet(network) |
raiesmh08 | e1aad98 | 2013-08-05 14:19:36 +0530 | [diff] [blame] | 192 | subnet_id = subnet['id'] |
Mark Maglana | 5885eb3 | 2014-02-28 10:57:34 -0800 | [diff] [blame] | 193 | # Verify subnet update |
| 194 | new_name = "New_subnet" |
John Warren | 3961acd | 2015-10-02 14:38:53 -0400 | [diff] [blame] | 195 | body = self.subnets_client.update_subnet(subnet_id, name=new_name) |
raiesmh08 | e1aad98 | 2013-08-05 14:19:36 +0530 | [diff] [blame] | 196 | updated_subnet = body['subnet'] |
Mark Maglana | 5885eb3 | 2014-02-28 10:57:34 -0800 | [diff] [blame] | 197 | self.assertEqual(updated_subnet['name'], new_name) |
Unmesh Gurjar | 4498683 | 2012-05-08 19:57:10 +0530 | [diff] [blame] | 198 | |
Jordan Pittier | 3b46d27 | 2017-04-12 16:17:28 +0200 | [diff] [blame] | 199 | @decorators.attr(type='smoke') |
Ken'ichi Ohmichi | 53b9a63 | 2017-01-27 18:04:39 -0800 | [diff] [blame] | 200 | @decorators.idempotent_id('2bf13842-c93f-4a69-83ed-717d2ec3b44e') |
Unmesh Gurjar | 4498683 | 2012-05-08 19:57:10 +0530 | [diff] [blame] | 201 | def test_show_network(self): |
Mark Maglana | 5885eb3 | 2014-02-28 10:57:34 -0800 | [diff] [blame] | 202 | # Verify the details of a network |
John Warren | 94d8faf | 2015-09-15 12:22:24 -0400 | [diff] [blame] | 203 | body = self.networks_client.show_network(self.network['id']) |
Unmesh Gurjar | 4498683 | 2012-05-08 19:57:10 +0530 | [diff] [blame] | 204 | network = body['network'] |
Mark Maglana | 5885eb3 | 2014-02-28 10:57:34 -0800 | [diff] [blame] | 205 | for key in ['id', 'name']: |
| 206 | self.assertEqual(network[key], self.network[key]) |
Unmesh Gurjar | 4498683 | 2012-05-08 19:57:10 +0530 | [diff] [blame] | 207 | |
Ken'ichi Ohmichi | 53b9a63 | 2017-01-27 18:04:39 -0800 | [diff] [blame] | 208 | @decorators.idempotent_id('867819bb-c4b6-45f7-acf9-90edcf70aa5e') |
jun xie | d557d9b | 2014-01-09 14:00:36 +0800 | [diff] [blame] | 209 | def test_show_network_fields(self): |
Mark Maglana | 5885eb3 | 2014-02-28 10:57:34 -0800 | [diff] [blame] | 210 | # Verify specific fields of a network |
Zhi Kun Liu | 903596c | 2014-04-11 08:55:53 -0500 | [diff] [blame] | 211 | fields = ['id', 'name'] |
Andrea Frittoli | cd36841 | 2017-08-14 21:37:56 +0100 | [diff] [blame] | 212 | if utils.is_extension_enabled('net-mtu', 'network'): |
Bruce Tan | d3e9b4a | 2016-09-22 09:17:06 +0000 | [diff] [blame] | 213 | fields.append('mtu') |
John Warren | 94d8faf | 2015-09-15 12:22:24 -0400 | [diff] [blame] | 214 | body = self.networks_client.show_network(self.network['id'], |
| 215 | fields=fields) |
jun xie | d557d9b | 2014-01-09 14:00:36 +0800 | [diff] [blame] | 216 | network = body['network'] |
Zhi Kun Liu | 903596c | 2014-04-11 08:55:53 -0500 | [diff] [blame] | 217 | self.assertEqual(sorted(network.keys()), sorted(fields)) |
| 218 | for field_name in fields: |
Mark Maglana | 5885eb3 | 2014-02-28 10:57:34 -0800 | [diff] [blame] | 219 | self.assertEqual(network[field_name], self.network[field_name]) |
Bruce Tan | d3e9b4a | 2016-09-22 09:17:06 +0000 | [diff] [blame] | 220 | self.assertNotIn('tenant_id', network) |
| 221 | self.assertNotIn('project_id', network) |
jun xie | d557d9b | 2014-01-09 14:00:36 +0800 | [diff] [blame] | 222 | |
Jordan Pittier | 3b46d27 | 2017-04-12 16:17:28 +0200 | [diff] [blame] | 223 | @decorators.attr(type='smoke') |
Ken'ichi Ohmichi | 53b9a63 | 2017-01-27 18:04:39 -0800 | [diff] [blame] | 224 | @decorators.idempotent_id('f7ffdeda-e200-4a7a-bcbe-05716e86bf43') |
Unmesh Gurjar | 4498683 | 2012-05-08 19:57:10 +0530 | [diff] [blame] | 225 | def test_list_networks(self): |
Sean Dague | 46c4a2b | 2013-01-03 17:54:17 -0500 | [diff] [blame] | 226 | # Verify the network exists in the list of all networks |
John Warren | 94d8faf | 2015-09-15 12:22:24 -0400 | [diff] [blame] | 227 | body = self.networks_client.list_networks() |
Mark Maglana | 5885eb3 | 2014-02-28 10:57:34 -0800 | [diff] [blame] | 228 | networks = [network['id'] for network in body['networks'] |
| 229 | if network['id'] == self.network['id']] |
| 230 | self.assertNotEmpty(networks, "Created network not found in the list") |
Unmesh Gurjar | 4498683 | 2012-05-08 19:57:10 +0530 | [diff] [blame] | 231 | |
Ken'ichi Ohmichi | 53b9a63 | 2017-01-27 18:04:39 -0800 | [diff] [blame] | 232 | @decorators.idempotent_id('6ae6d24f-9194-4869-9c85-c313cb20e080') |
jun xie | 0b4735d | 2014-01-07 15:42:58 +0800 | [diff] [blame] | 233 | def test_list_networks_fields(self): |
Mark Maglana | 5885eb3 | 2014-02-28 10:57:34 -0800 | [diff] [blame] | 234 | # Verify specific fields of the networks |
Zhi Kun Liu | 903596c | 2014-04-11 08:55:53 -0500 | [diff] [blame] | 235 | fields = ['id', 'name'] |
Andrea Frittoli | cd36841 | 2017-08-14 21:37:56 +0100 | [diff] [blame] | 236 | if utils.is_extension_enabled('net-mtu', 'network'): |
Bruce Tan | d3e9b4a | 2016-09-22 09:17:06 +0000 | [diff] [blame] | 237 | fields.append('mtu') |
John Warren | 94d8faf | 2015-09-15 12:22:24 -0400 | [diff] [blame] | 238 | body = self.networks_client.list_networks(fields=fields) |
jun xie | 0b4735d | 2014-01-07 15:42:58 +0800 | [diff] [blame] | 239 | networks = body['networks'] |
Mark Maglana | 5885eb3 | 2014-02-28 10:57:34 -0800 | [diff] [blame] | 240 | self.assertNotEmpty(networks, "Network list returned is empty") |
| 241 | for network in networks: |
Zhi Kun Liu | 903596c | 2014-04-11 08:55:53 -0500 | [diff] [blame] | 242 | self.assertEqual(sorted(network.keys()), sorted(fields)) |
jun xie | 0b4735d | 2014-01-07 15:42:58 +0800 | [diff] [blame] | 243 | |
Jordan Pittier | 3b46d27 | 2017-04-12 16:17:28 +0200 | [diff] [blame] | 244 | @decorators.attr(type='smoke') |
Ken'ichi Ohmichi | 53b9a63 | 2017-01-27 18:04:39 -0800 | [diff] [blame] | 245 | @decorators.idempotent_id('bd635d81-6030-4dd1-b3b9-31ba0cfdf6cc') |
Miguel Lavalle | cc93961 | 2013-02-22 17:27:20 -0600 | [diff] [blame] | 246 | def test_show_subnet(self): |
Mark Maglana | 5885eb3 | 2014-02-28 10:57:34 -0800 | [diff] [blame] | 247 | # Verify the details of a subnet |
John Warren | 3961acd | 2015-10-02 14:38:53 -0400 | [diff] [blame] | 248 | body = self.subnets_client.show_subnet(self.subnet['id']) |
Miguel Lavalle | cc93961 | 2013-02-22 17:27:20 -0600 | [diff] [blame] | 249 | subnet = body['subnet'] |
Mark Maglana | 5885eb3 | 2014-02-28 10:57:34 -0800 | [diff] [blame] | 250 | self.assertNotEmpty(subnet, "Subnet returned has no fields") |
| 251 | for key in ['id', 'cidr']: |
| 252 | self.assertIn(key, subnet) |
| 253 | self.assertEqual(subnet[key], self.subnet[key]) |
Miguel Lavalle | cc93961 | 2013-02-22 17:27:20 -0600 | [diff] [blame] | 254 | |
Ken'ichi Ohmichi | 53b9a63 | 2017-01-27 18:04:39 -0800 | [diff] [blame] | 255 | @decorators.idempotent_id('270fff0b-8bfc-411f-a184-1e8fd35286f0') |
jun xie | d557d9b | 2014-01-09 14:00:36 +0800 | [diff] [blame] | 256 | def test_show_subnet_fields(self): |
Mark Maglana | 5885eb3 | 2014-02-28 10:57:34 -0800 | [diff] [blame] | 257 | # Verify specific fields of a subnet |
Zhi Kun Liu | 903596c | 2014-04-11 08:55:53 -0500 | [diff] [blame] | 258 | fields = ['id', 'network_id'] |
John Warren | 3961acd | 2015-10-02 14:38:53 -0400 | [diff] [blame] | 259 | body = self.subnets_client.show_subnet(self.subnet['id'], |
| 260 | fields=fields) |
jun xie | d557d9b | 2014-01-09 14:00:36 +0800 | [diff] [blame] | 261 | subnet = body['subnet'] |
Zhi Kun Liu | 903596c | 2014-04-11 08:55:53 -0500 | [diff] [blame] | 262 | self.assertEqual(sorted(subnet.keys()), sorted(fields)) |
| 263 | for field_name in fields: |
Mark Maglana | 5885eb3 | 2014-02-28 10:57:34 -0800 | [diff] [blame] | 264 | self.assertEqual(subnet[field_name], self.subnet[field_name]) |
jun xie | d557d9b | 2014-01-09 14:00:36 +0800 | [diff] [blame] | 265 | |
Jordan Pittier | 3b46d27 | 2017-04-12 16:17:28 +0200 | [diff] [blame] | 266 | @decorators.attr(type='smoke') |
Ken'ichi Ohmichi | 53b9a63 | 2017-01-27 18:04:39 -0800 | [diff] [blame] | 267 | @decorators.idempotent_id('db68ba48-f4ea-49e9-81d1-e367f6d0b20a') |
Miguel Lavalle | cc93961 | 2013-02-22 17:27:20 -0600 | [diff] [blame] | 268 | def test_list_subnets(self): |
| 269 | # Verify the subnet exists in the list of all subnets |
John Warren | 3961acd | 2015-10-02 14:38:53 -0400 | [diff] [blame] | 270 | body = self.subnets_client.list_subnets() |
Mark Maglana | 5885eb3 | 2014-02-28 10:57:34 -0800 | [diff] [blame] | 271 | subnets = [subnet['id'] for subnet in body['subnets'] |
| 272 | if subnet['id'] == self.subnet['id']] |
| 273 | self.assertNotEmpty(subnets, "Created subnet not found in the list") |
raiesmh08 | e1aad98 | 2013-08-05 14:19:36 +0530 | [diff] [blame] | 274 | |
Ken'ichi Ohmichi | 53b9a63 | 2017-01-27 18:04:39 -0800 | [diff] [blame] | 275 | @decorators.idempotent_id('842589e3-9663-46b0-85e4-7f01273b0412') |
jun xie | 0b4735d | 2014-01-07 15:42:58 +0800 | [diff] [blame] | 276 | def test_list_subnets_fields(self): |
Mark Maglana | 5885eb3 | 2014-02-28 10:57:34 -0800 | [diff] [blame] | 277 | # Verify specific fields of subnets |
Zhi Kun Liu | 903596c | 2014-04-11 08:55:53 -0500 | [diff] [blame] | 278 | fields = ['id', 'network_id'] |
John Warren | 3961acd | 2015-10-02 14:38:53 -0400 | [diff] [blame] | 279 | body = self.subnets_client.list_subnets(fields=fields) |
jun xie | 0b4735d | 2014-01-07 15:42:58 +0800 | [diff] [blame] | 280 | subnets = body['subnets'] |
Mark Maglana | 5885eb3 | 2014-02-28 10:57:34 -0800 | [diff] [blame] | 281 | self.assertNotEmpty(subnets, "Subnet list returned is empty") |
| 282 | for subnet in subnets: |
Zhi Kun Liu | 903596c | 2014-04-11 08:55:53 -0500 | [diff] [blame] | 283 | self.assertEqual(sorted(subnet.keys()), sorted(fields)) |
jun xie | 0b4735d | 2014-01-07 15:42:58 +0800 | [diff] [blame] | 284 | |
Ken'ichi Ohmichi | 53b9a63 | 2017-01-27 18:04:39 -0800 | [diff] [blame] | 285 | @decorators.idempotent_id('f04f61a9-b7f3-4194-90b2-9bcf660d1bfe') |
sukhdev | c704a70 | 2014-01-15 11:50:56 -0800 | [diff] [blame] | 286 | def test_delete_network_with_subnet(self): |
| 287 | # Creates a network |
Tianbiao Qi | 309ac41 | 2016-10-31 19:42:37 +0800 | [diff] [blame] | 288 | network = self.create_network() |
sukhdev | c704a70 | 2014-01-15 11:50:56 -0800 | [diff] [blame] | 289 | net_id = network['id'] |
Jordan Pittier | 9e227c5 | 2016-02-09 14:35:18 +0100 | [diff] [blame] | 290 | self.addCleanup(test_utils.call_and_ignore_notfound_exc, |
Tianbiao Qi | 309ac41 | 2016-10-31 19:42:37 +0800 | [diff] [blame] | 291 | self._delete_network, network) |
sukhdev | c704a70 | 2014-01-15 11:50:56 -0800 | [diff] [blame] | 292 | |
| 293 | # Find a cidr that is not in use yet and create a subnet with it |
| 294 | subnet = self.create_subnet(network) |
| 295 | subnet_id = subnet['id'] |
| 296 | |
| 297 | # Delete network while the subnet still exists |
Tianbiao Qi | 309ac41 | 2016-10-31 19:42:37 +0800 | [diff] [blame] | 298 | self.networks_client.delete_network(net_id) |
sukhdev | c704a70 | 2014-01-15 11:50:56 -0800 | [diff] [blame] | 299 | |
| 300 | # Verify that the subnet got automatically deleted. |
John Warren | 3961acd | 2015-10-02 14:38:53 -0400 | [diff] [blame] | 301 | self.assertRaises(lib_exc.NotFound, self.subnets_client.show_subnet, |
sukhdev | c704a70 | 2014-01-15 11:50:56 -0800 | [diff] [blame] | 302 | subnet_id) |
| 303 | |
Ken'ichi Ohmichi | 53b9a63 | 2017-01-27 18:04:39 -0800 | [diff] [blame] | 304 | @decorators.idempotent_id('d2d596e2-8e76-47a9-ac51-d4648009f4d3') |
Sergey Shnaidman | 18cf597 | 2014-09-02 22:05:00 +0400 | [diff] [blame] | 305 | def test_create_delete_subnet_without_gateway(self): |
| 306 | self._create_verify_delete_subnet() |
| 307 | |
Ken'ichi Ohmichi | 53b9a63 | 2017-01-27 18:04:39 -0800 | [diff] [blame] | 308 | @decorators.idempotent_id('9393b468-186d-496d-aa36-732348cd76e7') |
Edgar Magana | 6a9ac34 | 2014-01-16 13:52:49 -0800 | [diff] [blame] | 309 | def test_create_delete_subnet_with_gw(self): |
Rohan Kanade | 35589aa | 2014-08-19 14:56:12 +0200 | [diff] [blame] | 310 | self._create_verify_delete_subnet( |
| 311 | **self.subnet_dict(['gateway'])) |
Edgar Magana | 6a9ac34 | 2014-01-16 13:52:49 -0800 | [diff] [blame] | 312 | |
Ken'ichi Ohmichi | 53b9a63 | 2017-01-27 18:04:39 -0800 | [diff] [blame] | 313 | @decorators.idempotent_id('bec949c4-3147-4ba6-af5f-cd2306118404') |
Rohan Kanade | 35589aa | 2014-08-19 14:56:12 +0200 | [diff] [blame] | 314 | def test_create_delete_subnet_with_allocation_pools(self): |
| 315 | self._create_verify_delete_subnet( |
| 316 | **self.subnet_dict(['allocation_pools'])) |
| 317 | |
Ken'ichi Ohmichi | 53b9a63 | 2017-01-27 18:04:39 -0800 | [diff] [blame] | 318 | @decorators.idempotent_id('8217a149-0c6c-4cfb-93db-0486f707d13f') |
Rohan Kanade | 35589aa | 2014-08-19 14:56:12 +0200 | [diff] [blame] | 319 | def test_create_delete_subnet_with_gw_and_allocation_pools(self): |
| 320 | self._create_verify_delete_subnet(**self.subnet_dict( |
| 321 | ['gateway', 'allocation_pools'])) |
| 322 | |
Ken'ichi Ohmichi | 53b9a63 | 2017-01-27 18:04:39 -0800 | [diff] [blame] | 323 | @decorators.idempotent_id('d830de0a-be47-468f-8f02-1fd996118289') |
Rohan Kanade | 35589aa | 2014-08-19 14:56:12 +0200 | [diff] [blame] | 324 | def test_create_delete_subnet_with_host_routes_and_dns_nameservers(self): |
| 325 | self._create_verify_delete_subnet( |
| 326 | **self.subnet_dict(['host_routes', 'dns_nameservers'])) |
| 327 | |
Ken'ichi Ohmichi | 53b9a63 | 2017-01-27 18:04:39 -0800 | [diff] [blame] | 328 | @decorators.idempotent_id('94ce038d-ff0a-4a4c-a56b-09da3ca0b55d') |
Rohan Kanade | 35589aa | 2014-08-19 14:56:12 +0200 | [diff] [blame] | 329 | def test_create_delete_subnet_with_dhcp_enabled(self): |
| 330 | self._create_verify_delete_subnet(enable_dhcp=True) |
| 331 | |
Ken'ichi Ohmichi | 53b9a63 | 2017-01-27 18:04:39 -0800 | [diff] [blame] | 332 | @decorators.idempotent_id('3d3852eb-3009-49ec-97ac-5ce83b73010a') |
Rohan Kanade | 35589aa | 2014-08-19 14:56:12 +0200 | [diff] [blame] | 333 | def test_update_subnet_gw_dns_host_routes_dhcp(self): |
| 334 | network = self.create_network() |
venakata anil | 1a2a64a | 2014-12-02 07:25:59 +0000 | [diff] [blame] | 335 | self.addCleanup(self._delete_network, network) |
Rohan Kanade | 35589aa | 2014-08-19 14:56:12 +0200 | [diff] [blame] | 336 | |
| 337 | subnet = self.create_subnet( |
| 338 | network, **self.subnet_dict(['gateway', 'host_routes', |
| 339 | 'dns_nameservers', |
| 340 | 'allocation_pools'])) |
| 341 | subnet_id = subnet['id'] |
| 342 | new_gateway = str(netaddr.IPAddress( |
| 343 | self._subnet_data[self._ip_version]['gateway']) + 1) |
| 344 | # Verify subnet update |
| 345 | new_host_routes = self._subnet_data[self._ip_version][ |
| 346 | 'new_host_routes'] |
| 347 | |
| 348 | new_dns_nameservers = self._subnet_data[self._ip_version][ |
| 349 | 'new_dns_nameservers'] |
| 350 | kwargs = {'host_routes': new_host_routes, |
| 351 | 'dns_nameservers': new_dns_nameservers, |
| 352 | 'gateway_ip': new_gateway, 'enable_dhcp': True} |
| 353 | |
| 354 | new_name = "New_subnet" |
John Warren | 3961acd | 2015-10-02 14:38:53 -0400 | [diff] [blame] | 355 | body = self.subnets_client.update_subnet(subnet_id, name=new_name, |
| 356 | **kwargs) |
Rohan Kanade | 35589aa | 2014-08-19 14:56:12 +0200 | [diff] [blame] | 357 | updated_subnet = body['subnet'] |
| 358 | kwargs['name'] = new_name |
| 359 | self.assertEqual(sorted(updated_subnet['dns_nameservers']), |
| 360 | sorted(kwargs['dns_nameservers'])) |
| 361 | del subnet['dns_nameservers'], kwargs['dns_nameservers'] |
| 362 | |
| 363 | self._compare_resource_attrs(updated_subnet, kwargs) |
| 364 | |
Ken'ichi Ohmichi | 53b9a63 | 2017-01-27 18:04:39 -0800 | [diff] [blame] | 365 | @decorators.idempotent_id('a4d9ec4c-0306-4111-a75c-db01a709030b') |
Rohan Kanade | 35589aa | 2014-08-19 14:56:12 +0200 | [diff] [blame] | 366 | def test_create_delete_subnet_all_attributes(self): |
| 367 | self._create_verify_delete_subnet( |
| 368 | enable_dhcp=True, |
| 369 | **self.subnet_dict(['gateway', 'host_routes', 'dns_nameservers'])) |
Edgar Magana | 6a9ac34 | 2014-01-16 13:52:49 -0800 | [diff] [blame] | 370 | |
Jordan Pittier | 3b46d27 | 2017-04-12 16:17:28 +0200 | [diff] [blame] | 371 | @decorators.attr(type='smoke') |
Ken'ichi Ohmichi | 53b9a63 | 2017-01-27 18:04:39 -0800 | [diff] [blame] | 372 | @decorators.idempotent_id('af774677-42a9-4e4b-bb58-16fe6a5bc1ec') |
Andrea Frittoli | cd36841 | 2017-08-14 21:37:56 +0100 | [diff] [blame] | 373 | @utils.requires_ext(extension='external-net', service='network') |
Kevin Benton | 6919da4 | 2016-03-05 18:00:03 -0800 | [diff] [blame] | 374 | @testtools.skipUnless(CONF.network.public_network_id, |
| 375 | 'The public_network_id option must be specified.') |
Yair Fried | bfdfc75 | 2014-09-28 13:56:45 +0300 | [diff] [blame] | 376 | def test_external_network_visibility(self): |
| 377 | """Verifies user can see external networks but not subnets.""" |
John Warren | 94d8faf | 2015-09-15 12:22:24 -0400 | [diff] [blame] | 378 | body = self.networks_client.list_networks(**{'router:external': True}) |
Yair Fried | bfdfc75 | 2014-09-28 13:56:45 +0300 | [diff] [blame] | 379 | networks = [network['id'] for network in body['networks']] |
| 380 | self.assertNotEmpty(networks, "No external networks found") |
| 381 | |
| 382 | nonexternal = [net for net in body['networks'] if |
| 383 | not net['router:external']] |
| 384 | self.assertEmpty(nonexternal, "Found non-external networks" |
| 385 | " in filtered list (%s)." % nonexternal) |
| 386 | self.assertIn(CONF.network.public_network_id, networks) |
Kevin Benton | 6919da4 | 2016-03-05 18:00:03 -0800 | [diff] [blame] | 387 | # only check the public network ID because the other networks may |
| 388 | # belong to other tests and their state may have changed during this |
| 389 | # test |
| 390 | body = self.subnets_client.list_subnets( |
| 391 | network_id=CONF.network.public_network_id) |
| 392 | self.assertEmpty(body['subnets'], "Public subnets visible") |
Yair Fried | bfdfc75 | 2014-09-28 13:56:45 +0300 | [diff] [blame] | 393 | |
Ken'ichi Ohmichi | 53b9a63 | 2017-01-27 18:04:39 -0800 | [diff] [blame] | 394 | @decorators.idempotent_id('c72c1c0c-2193-4aca-ccc4-b1442640bbbb') |
Andrea Frittoli | cd36841 | 2017-08-14 21:37:56 +0100 | [diff] [blame] | 395 | @utils.requires_ext(extension="standard-attr-description", |
| 396 | service="network") |
Bruce Tan | d3e9b4a | 2016-09-22 09:17:06 +0000 | [diff] [blame] | 397 | def test_create_update_network_description(self): |
| 398 | body = self.create_network(description='d1') |
| 399 | self.assertEqual('d1', body['description']) |
| 400 | net_id = body['id'] |
| 401 | body = self.networks_client.list_networks(id=net_id)['networks'][0] |
| 402 | self.assertEqual('d1', body['description']) |
| 403 | body = self.networks_client.update_network(body['id'], |
| 404 | description='d2') |
| 405 | self.assertEqual('d2', body['network']['description']) |
| 406 | body = self.networks_client.list_networks(id=net_id)['networks'][0] |
| 407 | self.assertEqual('d2', body['description']) |
| 408 | |
raiesmh08 | 6b055e2 | 2013-09-16 12:59:57 +0530 | [diff] [blame] | 409 | |
Tong Liu | 7012c86 | 2016-04-11 22:32:05 +0000 | [diff] [blame] | 410 | class BulkNetworkOpsTest(base.BaseNetworkTest): |
Ken'ichi Ohmichi | e03bea9 | 2015-11-19 07:45:58 +0000 | [diff] [blame] | 411 | """Tests the following operations in the Neutron API: |
raiesmh08 | 6b055e2 | 2013-09-16 12:59:57 +0530 | [diff] [blame] | 412 | |
| 413 | bulk network creation |
| 414 | bulk subnet creation |
Eugene Nikanorov | e9d255a | 2013-12-18 16:31:42 +0400 | [diff] [blame] | 415 | bulk port creation |
Sean Dague | ed6e586 | 2016-04-04 10:49:13 -0400 | [diff] [blame] | 416 | list project's networks |
raiesmh08 | 6b055e2 | 2013-09-16 12:59:57 +0530 | [diff] [blame] | 417 | |
| 418 | v2.0 of the Neutron API is assumed. It is also assumed that the following |
| 419 | options are defined in the [network] section of etc/tempest.conf: |
| 420 | |
Sean Dague | ed6e586 | 2016-04-04 10:49:13 -0400 | [diff] [blame] | 421 | project_network_cidr with a block of cidr's from which smaller blocks |
| 422 | can be allocated for project networks |
raiesmh08 | 6b055e2 | 2013-09-16 12:59:57 +0530 | [diff] [blame] | 423 | |
Sean Dague | ed6e586 | 2016-04-04 10:49:13 -0400 | [diff] [blame] | 424 | project_network_mask_bits with the mask bits to be used to partition |
| 425 | the block defined by project-network_cidr |
raiesmh08 | 6b055e2 | 2013-09-16 12:59:57 +0530 | [diff] [blame] | 426 | """ |
| 427 | |
raiesmh08 | 6b055e2 | 2013-09-16 12:59:57 +0530 | [diff] [blame] | 428 | def _delete_networks(self, created_networks): |
| 429 | for n in created_networks: |
John Warren | 94d8faf | 2015-09-15 12:22:24 -0400 | [diff] [blame] | 430 | self.networks_client.delete_network(n['id']) |
raiesmh08 | 6b055e2 | 2013-09-16 12:59:57 +0530 | [diff] [blame] | 431 | # Asserting that the networks are not found in the list after deletion |
John Warren | 94d8faf | 2015-09-15 12:22:24 -0400 | [diff] [blame] | 432 | body = self.networks_client.list_networks() |
Mark Maglana | 5885eb3 | 2014-02-28 10:57:34 -0800 | [diff] [blame] | 433 | networks_list = [network['id'] for network in body['networks']] |
raiesmh08 | 6b055e2 | 2013-09-16 12:59:57 +0530 | [diff] [blame] | 434 | for n in created_networks: |
| 435 | self.assertNotIn(n['id'], networks_list) |
| 436 | |
| 437 | def _delete_subnets(self, created_subnets): |
| 438 | for n in created_subnets: |
John Warren | 3961acd | 2015-10-02 14:38:53 -0400 | [diff] [blame] | 439 | self.subnets_client.delete_subnet(n['id']) |
raiesmh08 | 6b055e2 | 2013-09-16 12:59:57 +0530 | [diff] [blame] | 440 | # Asserting that the subnets are not found in the list after deletion |
John Warren | 3961acd | 2015-10-02 14:38:53 -0400 | [diff] [blame] | 441 | body = self.subnets_client.list_subnets() |
Mark Maglana | 5885eb3 | 2014-02-28 10:57:34 -0800 | [diff] [blame] | 442 | subnets_list = [subnet['id'] for subnet in body['subnets']] |
raiesmh08 | 6b055e2 | 2013-09-16 12:59:57 +0530 | [diff] [blame] | 443 | for n in created_subnets: |
| 444 | self.assertNotIn(n['id'], subnets_list) |
| 445 | |
| 446 | def _delete_ports(self, created_ports): |
| 447 | for n in created_ports: |
John Warren | 49c0fe5 | 2015-10-22 12:35:54 -0400 | [diff] [blame] | 448 | self.ports_client.delete_port(n['id']) |
raiesmh08 | 6b055e2 | 2013-09-16 12:59:57 +0530 | [diff] [blame] | 449 | # Asserting that the ports are not found in the list after deletion |
John Warren | 49c0fe5 | 2015-10-22 12:35:54 -0400 | [diff] [blame] | 450 | body = self.ports_client.list_ports() |
Mark Maglana | 5885eb3 | 2014-02-28 10:57:34 -0800 | [diff] [blame] | 451 | ports_list = [port['id'] for port in body['ports']] |
raiesmh08 | 6b055e2 | 2013-09-16 12:59:57 +0530 | [diff] [blame] | 452 | for n in created_ports: |
| 453 | self.assertNotIn(n['id'], ports_list) |
| 454 | |
Jordan Pittier | 3b46d27 | 2017-04-12 16:17:28 +0200 | [diff] [blame] | 455 | @decorators.attr(type='smoke') |
Ken'ichi Ohmichi | 53b9a63 | 2017-01-27 18:04:39 -0800 | [diff] [blame] | 456 | @decorators.idempotent_id('d4f9024d-1e28-4fc1-a6b1-25dbc6fa11e2') |
Nayna Patel | b03eab4 | 2013-08-08 08:58:48 +0000 | [diff] [blame] | 457 | def test_bulk_create_delete_network(self): |
| 458 | # Creates 2 networks in one request |
piyush110786 | 7584aa7 | 2015-12-15 18:46:38 +0530 | [diff] [blame] | 459 | network_list = [{'name': data_utils.rand_name('network-')}, |
| 460 | {'name': data_utils.rand_name('network-')}] |
Ken'ichi Ohmichi | 1f52fd9 | 2016-03-03 12:24:12 -0800 | [diff] [blame] | 461 | body = self.networks_client.create_bulk_networks(networks=network_list) |
Nayna Patel | b03eab4 | 2013-08-08 08:58:48 +0000 | [diff] [blame] | 462 | created_networks = body['networks'] |
Nayna Patel | b03eab4 | 2013-08-08 08:58:48 +0000 | [diff] [blame] | 463 | self.addCleanup(self._delete_networks, created_networks) |
| 464 | # Asserting that the networks are found in the list after creation |
John Warren | 94d8faf | 2015-09-15 12:22:24 -0400 | [diff] [blame] | 465 | body = self.networks_client.list_networks() |
Mark Maglana | 5885eb3 | 2014-02-28 10:57:34 -0800 | [diff] [blame] | 466 | networks_list = [network['id'] for network in body['networks']] |
Nayna Patel | b03eab4 | 2013-08-08 08:58:48 +0000 | [diff] [blame] | 467 | for n in created_networks: |
| 468 | self.assertIsNotNone(n['id']) |
| 469 | self.assertIn(n['id'], networks_list) |
raiesmh08 | 6769832 | 2013-08-20 13:09:01 +0530 | [diff] [blame] | 470 | |
Jordan Pittier | 3b46d27 | 2017-04-12 16:17:28 +0200 | [diff] [blame] | 471 | @decorators.attr(type='smoke') |
Ken'ichi Ohmichi | 53b9a63 | 2017-01-27 18:04:39 -0800 | [diff] [blame] | 472 | @decorators.idempotent_id('8936533b-c0aa-4f29-8e53-6cc873aec489') |
raiesmh08 | 2d5c651 | 2013-09-06 15:35:05 +0530 | [diff] [blame] | 473 | def test_bulk_create_delete_subnet(self): |
Assaf Muller | e4f7899 | 2014-06-19 17:32:14 +0300 | [diff] [blame] | 474 | networks = [self.create_network(), self.create_network()] |
raiesmh08 | 2d5c651 | 2013-09-06 15:35:05 +0530 | [diff] [blame] | 475 | # Creates 2 subnets in one request |
Rohan Kanade | 0efb023 | 2015-02-19 13:33:31 +0530 | [diff] [blame] | 476 | if self._ip_version == 4: |
Sean Dague | ed6e586 | 2016-04-04 10:49:13 -0400 | [diff] [blame] | 477 | cidr = netaddr.IPNetwork(CONF.network.project_network_cidr) |
| 478 | mask_bits = CONF.network.project_network_mask_bits |
Rohan Kanade | 0efb023 | 2015-02-19 13:33:31 +0530 | [diff] [blame] | 479 | else: |
Sean Dague | ed6e586 | 2016-04-04 10:49:13 -0400 | [diff] [blame] | 480 | cidr = netaddr.IPNetwork(CONF.network.project_network_v6_cidr) |
| 481 | mask_bits = CONF.network.project_network_v6_mask_bits |
Rohan Kanade | 0efb023 | 2015-02-19 13:33:31 +0530 | [diff] [blame] | 482 | |
Mark Maglana | 5885eb3 | 2014-02-28 10:57:34 -0800 | [diff] [blame] | 483 | cidrs = [subnet_cidr for subnet_cidr in cidr.subnet(mask_bits)] |
Rohan Kanade | 0efb023 | 2015-02-19 13:33:31 +0530 | [diff] [blame] | 484 | |
Mark Maglana | 5885eb3 | 2014-02-28 10:57:34 -0800 | [diff] [blame] | 485 | names = [data_utils.rand_name('subnet-') for i in range(len(networks))] |
| 486 | subnets_list = [] |
raiesmh08 | 2d5c651 | 2013-09-06 15:35:05 +0530 | [diff] [blame] | 487 | for i in range(len(names)): |
| 488 | p1 = { |
Assaf Muller | e4f7899 | 2014-06-19 17:32:14 +0300 | [diff] [blame] | 489 | 'network_id': networks[i]['id'], |
raiesmh08 | 2d5c651 | 2013-09-06 15:35:05 +0530 | [diff] [blame] | 490 | 'cidr': str(cidrs[(i)]), |
| 491 | 'name': names[i], |
Rohan Kanade | 0efb023 | 2015-02-19 13:33:31 +0530 | [diff] [blame] | 492 | 'ip_version': self._ip_version |
raiesmh08 | 2d5c651 | 2013-09-06 15:35:05 +0530 | [diff] [blame] | 493 | } |
Mark Maglana | 5885eb3 | 2014-02-28 10:57:34 -0800 | [diff] [blame] | 494 | subnets_list.append(p1) |
| 495 | del subnets_list[1]['name'] |
Ken'ichi Ohmichi | 1f52fd9 | 2016-03-03 12:24:12 -0800 | [diff] [blame] | 496 | body = self.subnets_client.create_bulk_subnets(subnets=subnets_list) |
raiesmh08 | 2d5c651 | 2013-09-06 15:35:05 +0530 | [diff] [blame] | 497 | created_subnets = body['subnets'] |
| 498 | self.addCleanup(self._delete_subnets, created_subnets) |
raiesmh08 | 2d5c651 | 2013-09-06 15:35:05 +0530 | [diff] [blame] | 499 | # Asserting that the subnets are found in the list after creation |
John Warren | 3961acd | 2015-10-02 14:38:53 -0400 | [diff] [blame] | 500 | body = self.subnets_client.list_subnets() |
Mark Maglana | 5885eb3 | 2014-02-28 10:57:34 -0800 | [diff] [blame] | 501 | subnets_list = [subnet['id'] for subnet in body['subnets']] |
raiesmh08 | 2d5c651 | 2013-09-06 15:35:05 +0530 | [diff] [blame] | 502 | for n in created_subnets: |
| 503 | self.assertIsNotNone(n['id']) |
| 504 | self.assertIn(n['id'], subnets_list) |
| 505 | |
Jordan Pittier | 3b46d27 | 2017-04-12 16:17:28 +0200 | [diff] [blame] | 506 | @decorators.attr(type='smoke') |
Ken'ichi Ohmichi | 53b9a63 | 2017-01-27 18:04:39 -0800 | [diff] [blame] | 507 | @decorators.idempotent_id('48037ff2-e889-4c3b-b86a-8e3f34d2d060') |
raiesmh08 | 2d5c651 | 2013-09-06 15:35:05 +0530 | [diff] [blame] | 508 | def test_bulk_create_delete_port(self): |
Assaf Muller | e4f7899 | 2014-06-19 17:32:14 +0300 | [diff] [blame] | 509 | networks = [self.create_network(), self.create_network()] |
raiesmh08 | 2d5c651 | 2013-09-06 15:35:05 +0530 | [diff] [blame] | 510 | # Creates 2 ports in one request |
Mark Maglana | 5885eb3 | 2014-02-28 10:57:34 -0800 | [diff] [blame] | 511 | names = [data_utils.rand_name('port-') for i in range(len(networks))] |
raiesmh08 | 2d5c651 | 2013-09-06 15:35:05 +0530 | [diff] [blame] | 512 | port_list = [] |
| 513 | state = [True, False] |
| 514 | for i in range(len(names)): |
| 515 | p1 = { |
Assaf Muller | e4f7899 | 2014-06-19 17:32:14 +0300 | [diff] [blame] | 516 | 'network_id': networks[i]['id'], |
raiesmh08 | 2d5c651 | 2013-09-06 15:35:05 +0530 | [diff] [blame] | 517 | 'name': names[i], |
| 518 | 'admin_state_up': state[i], |
| 519 | } |
| 520 | port_list.append(p1) |
| 521 | del port_list[1]['name'] |
Ken'ichi Ohmichi | 1f52fd9 | 2016-03-03 12:24:12 -0800 | [diff] [blame] | 522 | body = self.ports_client.create_bulk_ports(ports=port_list) |
raiesmh08 | 2d5c651 | 2013-09-06 15:35:05 +0530 | [diff] [blame] | 523 | created_ports = body['ports'] |
| 524 | self.addCleanup(self._delete_ports, created_ports) |
raiesmh08 | 2d5c651 | 2013-09-06 15:35:05 +0530 | [diff] [blame] | 525 | # Asserting that the ports are found in the list after creation |
John Warren | 49c0fe5 | 2015-10-22 12:35:54 -0400 | [diff] [blame] | 526 | body = self.ports_client.list_ports() |
Mark Maglana | 5885eb3 | 2014-02-28 10:57:34 -0800 | [diff] [blame] | 527 | ports_list = [port['id'] for port in body['ports']] |
raiesmh08 | 2d5c651 | 2013-09-06 15:35:05 +0530 | [diff] [blame] | 528 | for n in created_ports: |
| 529 | self.assertIsNotNone(n['id']) |
| 530 | self.assertIn(n['id'], ports_list) |
| 531 | |
raiesmh08 | 6769832 | 2013-08-20 13:09:01 +0530 | [diff] [blame] | 532 | |
Tong Liu | 7012c86 | 2016-04-11 22:32:05 +0000 | [diff] [blame] | 533 | class BulkNetworkOpsIpV6Test(BulkNetworkOpsTest): |
Rohan Kanade | 0efb023 | 2015-02-19 13:33:31 +0530 | [diff] [blame] | 534 | _ip_version = 6 |
| 535 | |
| 536 | |
Tong Liu | 7012c86 | 2016-04-11 22:32:05 +0000 | [diff] [blame] | 537 | class NetworksIpV6Test(NetworksTest): |
Henry Gessau | ffda37a | 2014-01-16 11:17:55 -0500 | [diff] [blame] | 538 | _ip_version = 6 |
Henry Gessau | ffda37a | 2014-01-16 11:17:55 -0500 | [diff] [blame] | 539 | |
Ken'ichi Ohmichi | 53b9a63 | 2017-01-27 18:04:39 -0800 | [diff] [blame] | 540 | @decorators.idempotent_id('e41a4888-65a6-418c-a095-f7c2ef4ad59a') |
Edgar Magana | 6a9ac34 | 2014-01-16 13:52:49 -0800 | [diff] [blame] | 541 | def test_create_delete_subnet_with_gw(self): |
Sean Dague | ed6e586 | 2016-04-04 10:49:13 -0400 | [diff] [blame] | 542 | net = netaddr.IPNetwork(CONF.network.project_network_v6_cidr) |
sridhargaddam | ea73d53 | 2014-05-13 14:48:30 +0530 | [diff] [blame] | 543 | gateway = str(netaddr.IPAddress(net.first + 2)) |
zhufl | d2c40ca | 2016-10-18 17:03:07 +0800 | [diff] [blame] | 544 | network = self.create_network() |
Edgar Magana | 6a9ac34 | 2014-01-16 13:52:49 -0800 | [diff] [blame] | 545 | subnet = self.create_subnet(network, gateway) |
| 546 | # Verifies Subnet GW in IPv6 |
| 547 | self.assertEqual(subnet['gateway_ip'], gateway) |
Edgar Magana | 6a9ac34 | 2014-01-16 13:52:49 -0800 | [diff] [blame] | 548 | |
Ken'ichi Ohmichi | 53b9a63 | 2017-01-27 18:04:39 -0800 | [diff] [blame] | 549 | @decorators.idempotent_id('ebb4fd95-524f-46af-83c1-0305b239338f') |
Sergey Shnaidman | 18cf597 | 2014-09-02 22:05:00 +0400 | [diff] [blame] | 550 | def test_create_delete_subnet_with_default_gw(self): |
Sean Dague | ed6e586 | 2016-04-04 10:49:13 -0400 | [diff] [blame] | 551 | net = netaddr.IPNetwork(CONF.network.project_network_v6_cidr) |
sridhargaddam | ea73d53 | 2014-05-13 14:48:30 +0530 | [diff] [blame] | 552 | gateway_ip = str(netaddr.IPAddress(net.first + 1)) |
zhufl | d2c40ca | 2016-10-18 17:03:07 +0800 | [diff] [blame] | 553 | network = self.create_network() |
Edgar Magana | 6a9ac34 | 2014-01-16 13:52:49 -0800 | [diff] [blame] | 554 | subnet = self.create_subnet(network) |
| 555 | # Verifies Subnet GW in IPv6 |
sridhargaddam | ea73d53 | 2014-05-13 14:48:30 +0530 | [diff] [blame] | 556 | self.assertEqual(subnet['gateway_ip'], gateway_ip) |
Edgar Magana | 6a9ac34 | 2014-01-16 13:52:49 -0800 | [diff] [blame] | 557 | |
Ken'ichi Ohmichi | 53b9a63 | 2017-01-27 18:04:39 -0800 | [diff] [blame] | 558 | @decorators.idempotent_id('a9653883-b2a4-469b-8c3c-4518430a7e55') |
Sergey Shnaidman | 18cf597 | 2014-09-02 22:05:00 +0400 | [diff] [blame] | 559 | def test_create_list_subnet_with_no_gw64_one_network(self): |
zhufl | d2c40ca | 2016-10-18 17:03:07 +0800 | [diff] [blame] | 560 | network = self.create_network() |
Sergey Shnaidman | 18cf597 | 2014-09-02 22:05:00 +0400 | [diff] [blame] | 561 | ipv6_gateway = self.subnet_dict(['gateway'])['gateway'] |
| 562 | subnet1 = self.create_subnet(network, |
| 563 | ip_version=6, |
| 564 | gateway=ipv6_gateway) |
| 565 | self.assertEqual(netaddr.IPNetwork(subnet1['cidr']).version, 6, |
| 566 | 'The created subnet is not IPv6') |
| 567 | subnet2 = self.create_subnet(network, |
| 568 | gateway=None, |
| 569 | ip_version=4) |
| 570 | self.assertEqual(netaddr.IPNetwork(subnet2['cidr']).version, 4, |
| 571 | 'The created subnet is not IPv4') |
| 572 | # Verifies Subnet GW is set in IPv6 |
| 573 | self.assertEqual(subnet1['gateway_ip'], ipv6_gateway) |
| 574 | # Verifies Subnet GW is None in IPv4 |
guo yunxian | 0306a4a | 2016-07-29 16:32:28 +0800 | [diff] [blame] | 575 | self.assertIsNone(subnet2['gateway_ip']) |
Sergey Shnaidman | 18cf597 | 2014-09-02 22:05:00 +0400 | [diff] [blame] | 576 | # Verifies all 2 subnets in the same network |
John Warren | 3961acd | 2015-10-02 14:38:53 -0400 | [diff] [blame] | 577 | body = self.subnets_client.list_subnets() |
Sergey Shnaidman | 18cf597 | 2014-09-02 22:05:00 +0400 | [diff] [blame] | 578 | subnets = [sub['id'] for sub in body['subnets'] |
| 579 | if sub['network_id'] == network['id']] |
| 580 | test_subnet_ids = [sub['id'] for sub in (subnet1, subnet2)] |
ghanshyam | 2dee5e3 | 2016-06-24 14:42:56 +0900 | [diff] [blame] | 581 | six.assertCountEqual(self, subnets, |
| 582 | test_subnet_ids, |
| 583 | 'Subnet are not in the same network') |
Sergey Shnaidman | 18cf597 | 2014-09-02 22:05:00 +0400 | [diff] [blame] | 584 | |
Sergey Sh | e757c33 | 2014-11-25 01:16:32 +0300 | [diff] [blame] | 585 | |
Jonte Watford | 871547c | 2016-10-10 20:11:04 +0000 | [diff] [blame] | 586 | class NetworksIpV6TestAttrs(BaseNetworkTestResources): |
| 587 | |
| 588 | _ip_version = 6 |
Sergey Sh | e757c33 | 2014-11-25 01:16:32 +0300 | [diff] [blame] | 589 | |
| 590 | @classmethod |
Rohan Kanade | a565e45 | 2015-01-27 14:00:13 +0530 | [diff] [blame] | 591 | def skip_checks(cls): |
| 592 | super(NetworksIpV6TestAttrs, cls).skip_checks() |
Sergey Sh | e757c33 | 2014-11-25 01:16:32 +0300 | [diff] [blame] | 593 | if not CONF.network_feature_enabled.ipv6_subnet_attributes: |
| 594 | raise cls.skipException("IPv6 extended attributes for " |
| 595 | "subnets not available") |
Sergey Sh | e757c33 | 2014-11-25 01:16:32 +0300 | [diff] [blame] | 596 | |
Ken'ichi Ohmichi | 53b9a63 | 2017-01-27 18:04:39 -0800 | [diff] [blame] | 597 | @decorators.idempotent_id('da40cd1b-a833-4354-9a85-cd9b8a3b74ca') |
Sergey Shnaidman | 18cf597 | 2014-09-02 22:05:00 +0400 | [diff] [blame] | 598 | def test_create_delete_subnet_with_v6_attributes_stateful(self): |
Rohan Kanade | 35589aa | 2014-08-19 14:56:12 +0200 | [diff] [blame] | 599 | self._create_verify_delete_subnet( |
| 600 | gateway=self._subnet_data[self._ip_version]['gateway'], |
Sergey Shnaidman | 18cf597 | 2014-09-02 22:05:00 +0400 | [diff] [blame] | 601 | ipv6_ra_mode='dhcpv6-stateful', |
| 602 | ipv6_address_mode='dhcpv6-stateful') |
| 603 | |
Ken'ichi Ohmichi | 53b9a63 | 2017-01-27 18:04:39 -0800 | [diff] [blame] | 604 | @decorators.idempotent_id('176b030f-a923-4040-a755-9dc94329e60c') |
Sergey Shnaidman | 18cf597 | 2014-09-02 22:05:00 +0400 | [diff] [blame] | 605 | def test_create_delete_subnet_with_v6_attributes_slaac(self): |
| 606 | self._create_verify_delete_subnet( |
Rohan Kanade | 35589aa | 2014-08-19 14:56:12 +0200 | [diff] [blame] | 607 | ipv6_ra_mode='slaac', |
| 608 | ipv6_address_mode='slaac') |
Sean M. Collins | dd27a4d | 2014-05-13 10:33:15 -0400 | [diff] [blame] | 609 | |
Ken'ichi Ohmichi | 53b9a63 | 2017-01-27 18:04:39 -0800 | [diff] [blame] | 610 | @decorators.idempotent_id('7d410310-8c86-4902-adf9-865d08e31adb') |
Sergey Shnaidman | 18cf597 | 2014-09-02 22:05:00 +0400 | [diff] [blame] | 611 | def test_create_delete_subnet_with_v6_attributes_stateless(self): |
| 612 | self._create_verify_delete_subnet( |
| 613 | ipv6_ra_mode='dhcpv6-stateless', |
| 614 | ipv6_address_mode='dhcpv6-stateless') |
Sergey Sh | e757c33 | 2014-11-25 01:16:32 +0300 | [diff] [blame] | 615 | |
| 616 | def _test_delete_subnet_with_ports(self, mode): |
| 617 | """Create subnet and delete it with existing ports""" |
| 618 | slaac_network = self.create_network() |
| 619 | subnet_slaac = self.create_subnet(slaac_network, |
| 620 | **{'ipv6_ra_mode': mode, |
| 621 | 'ipv6_address_mode': mode}) |
| 622 | port = self.create_port(slaac_network) |
| 623 | self.assertIsNotNone(port['fixed_ips'][0]['ip_address']) |
John Warren | 3961acd | 2015-10-02 14:38:53 -0400 | [diff] [blame] | 624 | self.subnets_client.delete_subnet(subnet_slaac['id']) |
Sergey Sh | e757c33 | 2014-11-25 01:16:32 +0300 | [diff] [blame] | 625 | self.subnets.pop() |
John Warren | 3961acd | 2015-10-02 14:38:53 -0400 | [diff] [blame] | 626 | subnets = self.subnets_client.list_subnets() |
Sergey Sh | e757c33 | 2014-11-25 01:16:32 +0300 | [diff] [blame] | 627 | subnet_ids = [subnet['id'] for subnet in subnets['subnets']] |
| 628 | self.assertNotIn(subnet_slaac['id'], subnet_ids, |
| 629 | "Subnet wasn't deleted") |
reedip | 6fb7e1a | 2016-03-10 13:32:01 +0900 | [diff] [blame] | 630 | self.assertRaisesRegex( |
Masayuki Igawa | d938876 | 2015-01-20 14:56:42 +0900 | [diff] [blame] | 631 | lib_exc.Conflict, |
Sergey Sh | e757c33 | 2014-11-25 01:16:32 +0300 | [diff] [blame] | 632 | "There are one or more ports still in use on the network", |
John Warren | 94d8faf | 2015-09-15 12:22:24 -0400 | [diff] [blame] | 633 | self.networks_client.delete_network, |
Sergey Sh | e757c33 | 2014-11-25 01:16:32 +0300 | [diff] [blame] | 634 | slaac_network['id']) |
| 635 | |
Ken'ichi Ohmichi | 53b9a63 | 2017-01-27 18:04:39 -0800 | [diff] [blame] | 636 | @decorators.idempotent_id('88554555-ebf8-41ef-9300-4926d45e06e9') |
Sergey Sh | e757c33 | 2014-11-25 01:16:32 +0300 | [diff] [blame] | 637 | def test_create_delete_slaac_subnet_with_ports(self): |
| 638 | """Test deleting subnet with SLAAC ports |
| 639 | |
| 640 | Create subnet with SLAAC, create ports in network |
| 641 | and then you shall be able to delete subnet without port |
| 642 | deletion. But you still can not delete the network. |
| 643 | """ |
| 644 | self._test_delete_subnet_with_ports("slaac") |
| 645 | |
Ken'ichi Ohmichi | 53b9a63 | 2017-01-27 18:04:39 -0800 | [diff] [blame] | 646 | @decorators.idempotent_id('2de6ab5a-fcf0-4144-9813-f91a940291f1') |
Sergey Sh | e757c33 | 2014-11-25 01:16:32 +0300 | [diff] [blame] | 647 | def test_create_delete_stateless_subnet_with_ports(self): |
| 648 | """Test deleting subnet with DHCPv6 stateless ports |
| 649 | |
| 650 | Create subnet with DHCPv6 stateless, create ports in network |
| 651 | and then you shall be able to delete subnet without port |
| 652 | deletion. But you still can not delete the network. |
| 653 | """ |
| 654 | self._test_delete_subnet_with_ports("dhcpv6-stateless") |