blob: 819ef90dfb7508b3404182a34e4c66b0b023e01c [file] [log] [blame]
ZhiQiang Fan39f97222013-09-20 04:49:44 +08001# Copyright 2012 OpenStack Foundation
Jay Pipesf4dad392012-06-05 16:03:58 -04002# 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 Lavallecc939612013-02-22 17:27:20 -060015import netaddr
Matthew Treinish71426682015-04-23 11:19:38 -040016import six
Kevin Benton6919da42016-03-05 18:00:03 -080017import testtools
Jay Pipesf4dad392012-06-05 16:03:58 -040018
Sean Dague1937d092013-05-17 16:36:38 -040019from tempest.api.network import base
Rohan Kanade35589aa2014-08-19 14:56:12 +020020from tempest.common import custom_matchers
Fei Long Wangd39431f2015-05-14 11:30:48 +120021from tempest.common.utils import data_utils
Matthew Treinish03b48df2014-01-29 16:59:49 +000022from tempest import config
Jordan Pittier9e227c52016-02-09 14:35:18 +010023from tempest.lib.common.utils import test_utils
Andrea Frittoli (andreaf)db9672e2016-02-23 14:07:24 -050024from tempest.lib import exceptions as lib_exc
Masayuki Igawa6d495d62014-03-19 16:38:57 +090025from tempest import test
Unmesh Gurjar44986832012-05-08 19:57:10 +053026
Matthew Treinish03b48df2014-01-29 16:59:49 +000027CONF = config.CONF
28
Unmesh Gurjar44986832012-05-08 19:57:10 +053029
Matthew Treinishe4184ea2015-09-03 21:13:09 -040030class NetworksTest(base.BaseNetworkTest):
Ken'ichi Ohmichie03bea92015-11-19 07:45:58 +000031 """Tests the following operations in the Neutron API:
Miguel Lavallecc939612013-02-22 17:27:20 -060032
Sean Dagueed6e5862016-04-04 10:49:13 -040033 create a network for a project
34 list project's networks
35 show a project network details
36 create a subnet for a project
37 list project's subnets
38 show a project subnet details
raiesmh08e1aad982013-08-05 14:19:36 +053039 network update
40 subnet update
sukhdevc704a702014-01-15 11:50:56 -080041 delete a network also deletes its subnets
Yair Friedbfdfc752014-09-28 13:56:45 +030042 list external networks
Miguel Lavallecc939612013-02-22 17:27:20 -060043
Henry Gessauffda37a2014-01-16 11:17:55 -050044 All subnet tests are run once with ipv4 and once with ipv6.
45
Mark McClainf2982e82013-07-06 17:48:03 -040046 v2.0 of the Neutron API is assumed. It is also assumed that the following
Miguel Lavallecc939612013-02-22 17:27:20 -060047 options are defined in the [network] section of etc/tempest.conf:
48
Sean Dagueed6e5862016-04-04 10:49:13 -040049 project_network_cidr with a block of cidr's from which smaller blocks
50 can be allocated for project ipv4 subnets
Henry Gessauffda37a2014-01-16 11:17:55 -050051
Sean Dagueed6e5862016-04-04 10:49:13 -040052 project_network_v6_cidr is the equivalent for ipv6 subnets
Miguel Lavallecc939612013-02-22 17:27:20 -060053
Sean Dagueed6e5862016-04-04 10:49:13 -040054 project_network_mask_bits with the mask bits to be used to partition
55 the block defined by project_network_cidr
Henry Gessauffda37a2014-01-16 11:17:55 -050056
Sean Dagueed6e5862016-04-04 10:49:13 -040057 project_network_v6_mask_bits is the equivalent for ipv6 subnets
Miguel Lavallecc939612013-02-22 17:27:20 -060058 """
59
Unmesh Gurjar44986832012-05-08 19:57:10 +053060 @classmethod
Andrea Frittolida4a2452014-09-15 13:12:08 +010061 def resource_setup(cls):
Matthew Treinishe4184ea2015-09-03 21:13:09 -040062 super(NetworksTest, cls).resource_setup()
Jay Pipesf4dad392012-06-05 16:03:58 -040063 cls.network = cls.create_network()
64 cls.name = cls.network['name']
venakata anil1a2a64a2014-12-02 07:25:59 +000065 cls.subnet = cls._create_subnet_with_last_subnet_block(cls.network,
66 cls._ip_version)
Rohan Kanade35589aa2014-08-19 14:56:12 +020067 cls._subnet_data = {6: {'gateway':
68 str(cls._get_gateway_from_tempest_conf(6)),
69 'allocation_pools':
70 cls._get_allocation_pools_from_gateway(6),
71 'dns_nameservers': ['2001:4860:4860::8844',
72 '2001:4860:4860::8888'],
73 'host_routes': [{'destination': '2001::/64',
74 'nexthop': '2003::1'}],
75 'new_host_routes': [{'destination':
76 '2001::/64',
77 'nexthop': '2005::1'}],
78 'new_dns_nameservers':
79 ['2001:4860:4860::7744',
80 '2001:4860:4860::7888']},
81 4: {'gateway':
82 str(cls._get_gateway_from_tempest_conf(4)),
83 'allocation_pools':
84 cls._get_allocation_pools_from_gateway(4),
85 'dns_nameservers': ['8.8.4.4', '8.8.8.8'],
86 'host_routes': [{'destination': '10.20.0.0/32',
87 'nexthop': '10.100.1.1'}],
88 'new_host_routes': [{'destination':
89 '10.20.0.0/32',
90 'nexthop':
91 '10.100.1.2'}],
92 'new_dns_nameservers': ['7.8.8.8', '7.8.4.4']}}
93
94 @classmethod
venakata anil1a2a64a2014-12-02 07:25:59 +000095 def _create_subnet_with_last_subnet_block(cls, network, ip_version):
Sean Dagueed6e5862016-04-04 10:49:13 -040096 # Derive last subnet CIDR block from project CIDR and
Ken'ichi Ohmichie03bea92015-11-19 07:45:58 +000097 # create the subnet with that derived CIDR
venakata anil1a2a64a2014-12-02 07:25:59 +000098 if ip_version == 4:
Sean Dagueed6e5862016-04-04 10:49:13 -040099 cidr = netaddr.IPNetwork(CONF.network.project_network_cidr)
100 mask_bits = CONF.network.project_network_mask_bits
venakata anil1a2a64a2014-12-02 07:25:59 +0000101 elif ip_version == 6:
Sean Dagueed6e5862016-04-04 10:49:13 -0400102 cidr = netaddr.IPNetwork(CONF.network.project_network_v6_cidr)
103 mask_bits = CONF.network.project_network_v6_mask_bits
venakata anil1a2a64a2014-12-02 07:25:59 +0000104
105 subnet_cidr = list(cidr.subnet(mask_bits))[-1]
106 gateway_ip = str(netaddr.IPAddress(subnet_cidr) + 1)
107 return cls.create_subnet(network, gateway=gateway_ip,
108 cidr=subnet_cidr, mask_bits=mask_bits)
109
110 @classmethod
Rohan Kanade35589aa2014-08-19 14:56:12 +0200111 def _get_gateway_from_tempest_conf(cls, ip_version):
112 """Return first subnet gateway for configured CIDR """
113 if ip_version == 4:
Sean Dagueed6e5862016-04-04 10:49:13 -0400114 cidr = netaddr.IPNetwork(CONF.network.project_network_cidr)
115 mask_bits = CONF.network.project_network_mask_bits
Rohan Kanade35589aa2014-08-19 14:56:12 +0200116 elif ip_version == 6:
Sean Dagueed6e5862016-04-04 10:49:13 -0400117 cidr = netaddr.IPNetwork(CONF.network.project_network_v6_cidr)
118 mask_bits = CONF.network.project_network_v6_mask_bits
Rohan Kanade35589aa2014-08-19 14:56:12 +0200119
120 if mask_bits >= cidr.prefixlen:
121 return netaddr.IPAddress(cidr) + 1
122 else:
123 for subnet in cidr.subnet(mask_bits):
124 return netaddr.IPAddress(subnet) + 1
125
126 @classmethod
127 def _get_allocation_pools_from_gateway(cls, ip_version):
128 """Return allocation range for subnet of given gateway"""
129 gateway = cls._get_gateway_from_tempest_conf(ip_version)
Hynek Mlnarikbe634fc2016-06-27 09:34:15 +0200130 return [{'start': str(gateway + 2), 'end': str(gateway + 6)}]
Rohan Kanade35589aa2014-08-19 14:56:12 +0200131
132 def subnet_dict(self, include_keys):
Ken'ichi Ohmichie03bea92015-11-19 07:45:58 +0000133 # Return a subnet dict which has include_keys and their corresponding
134 # value from self._subnet_data
Rohan Kanade35589aa2014-08-19 14:56:12 +0200135 return dict((key, self._subnet_data[self._ip_version][key])
136 for key in include_keys)
137
138 def _compare_resource_attrs(self, actual, expected):
139 exclude_keys = set(actual).symmetric_difference(expected)
140 self.assertThat(actual, custom_matchers.MatchesDictExceptForKeys(
141 expected, exclude_keys))
142
venakata anil1a2a64a2014-12-02 07:25:59 +0000143 def _delete_network(self, network):
144 # Deleting network also deletes its subnets if exists
John Warren94d8faf2015-09-15 12:22:24 -0400145 self.networks_client.delete_network(network['id'])
venakata anil1a2a64a2014-12-02 07:25:59 +0000146 if network in self.networks:
147 self.networks.remove(network)
148 for subnet in self.subnets:
149 if subnet['network_id'] == network['id']:
150 self.subnets.remove(subnet)
151
Rohan Kanade35589aa2014-08-19 14:56:12 +0200152 def _create_verify_delete_subnet(self, cidr=None, mask_bits=None,
153 **kwargs):
154 network = self.create_network()
155 net_id = network['id']
156 gateway = kwargs.pop('gateway', None)
157 subnet = self.create_subnet(network, gateway, cidr, mask_bits,
158 **kwargs)
159 compare_args_full = dict(gateway_ip=gateway, cidr=cidr,
160 mask_bits=mask_bits, **kwargs)
Matthew Treinish71426682015-04-23 11:19:38 -0400161 compare_args = dict((k, v) for k, v in six.iteritems(compare_args_full)
Rohan Kanade35589aa2014-08-19 14:56:12 +0200162 if v is not None)
163
164 if 'dns_nameservers' in set(subnet).intersection(compare_args):
165 self.assertEqual(sorted(compare_args['dns_nameservers']),
166 sorted(subnet['dns_nameservers']))
167 del subnet['dns_nameservers'], compare_args['dns_nameservers']
168
169 self._compare_resource_attrs(subnet, compare_args)
John Warren94d8faf2015-09-15 12:22:24 -0400170 self.networks_client.delete_network(net_id)
Rohan Kanade35589aa2014-08-19 14:56:12 +0200171 self.networks.pop()
172 self.subnets.pop()
Unmesh Gurjar44986832012-05-08 19:57:10 +0530173
Masayuki Igawa6d495d62014-03-19 16:38:57 +0900174 @test.attr(type='smoke')
Chris Hoge7579c1a2015-02-26 14:12:15 -0800175 @test.idempotent_id('0e269138-0da6-4efc-a46d-578161e7b221')
raiesmh08e1aad982013-08-05 14:19:36 +0530176 def test_create_update_delete_network_subnet(self):
Mark Maglana5885eb32014-02-28 10:57:34 -0800177 # Create a network
Masayuki Igawa259c1132013-10-31 17:48:44 +0900178 name = data_utils.rand_name('network-')
Rohan Kanade35589aa2014-08-19 14:56:12 +0200179 network = self.create_network(network_name=name)
venakata anil1a2a64a2014-12-02 07:25:59 +0000180 self.addCleanup(self._delete_network, network)
raiesmh08e1aad982013-08-05 14:19:36 +0530181 net_id = network['id']
Santosh Kumar42c94802014-08-08 04:31:42 -0700182 self.assertEqual('ACTIVE', network['status'])
Mark Maglana5885eb32014-02-28 10:57:34 -0800183 # Verify network update
raiesmh08e1aad982013-08-05 14:19:36 +0530184 new_name = "New_network"
John Warren94d8faf2015-09-15 12:22:24 -0400185 body = self.networks_client.update_network(net_id, name=new_name)
raiesmh08e1aad982013-08-05 14:19:36 +0530186 updated_net = body['network']
187 self.assertEqual(updated_net['name'], new_name)
Miguel Lavallecc939612013-02-22 17:27:20 -0600188 # Find a cidr that is not in use yet and create a subnet with it
Matthew Treinish6b8cd2a2014-03-03 20:45:56 +0000189 subnet = self.create_subnet(network)
raiesmh08e1aad982013-08-05 14:19:36 +0530190 subnet_id = subnet['id']
Mark Maglana5885eb32014-02-28 10:57:34 -0800191 # Verify subnet update
192 new_name = "New_subnet"
John Warren3961acd2015-10-02 14:38:53 -0400193 body = self.subnets_client.update_subnet(subnet_id, name=new_name)
raiesmh08e1aad982013-08-05 14:19:36 +0530194 updated_subnet = body['subnet']
Mark Maglana5885eb32014-02-28 10:57:34 -0800195 self.assertEqual(updated_subnet['name'], new_name)
Unmesh Gurjar44986832012-05-08 19:57:10 +0530196
Masayuki Igawa6d495d62014-03-19 16:38:57 +0900197 @test.attr(type='smoke')
Chris Hoge7579c1a2015-02-26 14:12:15 -0800198 @test.idempotent_id('2bf13842-c93f-4a69-83ed-717d2ec3b44e')
Unmesh Gurjar44986832012-05-08 19:57:10 +0530199 def test_show_network(self):
Mark Maglana5885eb32014-02-28 10:57:34 -0800200 # Verify the details of a network
John Warren94d8faf2015-09-15 12:22:24 -0400201 body = self.networks_client.show_network(self.network['id'])
Unmesh Gurjar44986832012-05-08 19:57:10 +0530202 network = body['network']
Mark Maglana5885eb32014-02-28 10:57:34 -0800203 for key in ['id', 'name']:
204 self.assertEqual(network[key], self.network[key])
Unmesh Gurjar44986832012-05-08 19:57:10 +0530205
Chris Hoge7579c1a2015-02-26 14:12:15 -0800206 @test.idempotent_id('867819bb-c4b6-45f7-acf9-90edcf70aa5e')
jun xied557d9b2014-01-09 14:00:36 +0800207 def test_show_network_fields(self):
Mark Maglana5885eb32014-02-28 10:57:34 -0800208 # Verify specific fields of a network
Zhi Kun Liu903596c2014-04-11 08:55:53 -0500209 fields = ['id', 'name']
John Warren94d8faf2015-09-15 12:22:24 -0400210 body = self.networks_client.show_network(self.network['id'],
211 fields=fields)
jun xied557d9b2014-01-09 14:00:36 +0800212 network = body['network']
Zhi Kun Liu903596c2014-04-11 08:55:53 -0500213 self.assertEqual(sorted(network.keys()), sorted(fields))
214 for field_name in fields:
Mark Maglana5885eb32014-02-28 10:57:34 -0800215 self.assertEqual(network[field_name], self.network[field_name])
jun xied557d9b2014-01-09 14:00:36 +0800216
Masayuki Igawa6d495d62014-03-19 16:38:57 +0900217 @test.attr(type='smoke')
Chris Hoge7579c1a2015-02-26 14:12:15 -0800218 @test.idempotent_id('f7ffdeda-e200-4a7a-bcbe-05716e86bf43')
Unmesh Gurjar44986832012-05-08 19:57:10 +0530219 def test_list_networks(self):
Sean Dague46c4a2b2013-01-03 17:54:17 -0500220 # Verify the network exists in the list of all networks
John Warren94d8faf2015-09-15 12:22:24 -0400221 body = self.networks_client.list_networks()
Mark Maglana5885eb32014-02-28 10:57:34 -0800222 networks = [network['id'] for network in body['networks']
223 if network['id'] == self.network['id']]
224 self.assertNotEmpty(networks, "Created network not found in the list")
Unmesh Gurjar44986832012-05-08 19:57:10 +0530225
Chris Hoge7579c1a2015-02-26 14:12:15 -0800226 @test.idempotent_id('6ae6d24f-9194-4869-9c85-c313cb20e080')
jun xie0b4735d2014-01-07 15:42:58 +0800227 def test_list_networks_fields(self):
Mark Maglana5885eb32014-02-28 10:57:34 -0800228 # Verify specific fields of the networks
Zhi Kun Liu903596c2014-04-11 08:55:53 -0500229 fields = ['id', 'name']
John Warren94d8faf2015-09-15 12:22:24 -0400230 body = self.networks_client.list_networks(fields=fields)
jun xie0b4735d2014-01-07 15:42:58 +0800231 networks = body['networks']
Mark Maglana5885eb32014-02-28 10:57:34 -0800232 self.assertNotEmpty(networks, "Network list returned is empty")
233 for network in networks:
Zhi Kun Liu903596c2014-04-11 08:55:53 -0500234 self.assertEqual(sorted(network.keys()), sorted(fields))
jun xie0b4735d2014-01-07 15:42:58 +0800235
Masayuki Igawa6d495d62014-03-19 16:38:57 +0900236 @test.attr(type='smoke')
Chris Hoge7579c1a2015-02-26 14:12:15 -0800237 @test.idempotent_id('bd635d81-6030-4dd1-b3b9-31ba0cfdf6cc')
Miguel Lavallecc939612013-02-22 17:27:20 -0600238 def test_show_subnet(self):
Mark Maglana5885eb32014-02-28 10:57:34 -0800239 # Verify the details of a subnet
John Warren3961acd2015-10-02 14:38:53 -0400240 body = self.subnets_client.show_subnet(self.subnet['id'])
Miguel Lavallecc939612013-02-22 17:27:20 -0600241 subnet = body['subnet']
Mark Maglana5885eb32014-02-28 10:57:34 -0800242 self.assertNotEmpty(subnet, "Subnet returned has no fields")
243 for key in ['id', 'cidr']:
244 self.assertIn(key, subnet)
245 self.assertEqual(subnet[key], self.subnet[key])
Miguel Lavallecc939612013-02-22 17:27:20 -0600246
Chris Hoge7579c1a2015-02-26 14:12:15 -0800247 @test.idempotent_id('270fff0b-8bfc-411f-a184-1e8fd35286f0')
jun xied557d9b2014-01-09 14:00:36 +0800248 def test_show_subnet_fields(self):
Mark Maglana5885eb32014-02-28 10:57:34 -0800249 # Verify specific fields of a subnet
Zhi Kun Liu903596c2014-04-11 08:55:53 -0500250 fields = ['id', 'network_id']
John Warren3961acd2015-10-02 14:38:53 -0400251 body = self.subnets_client.show_subnet(self.subnet['id'],
252 fields=fields)
jun xied557d9b2014-01-09 14:00:36 +0800253 subnet = body['subnet']
Zhi Kun Liu903596c2014-04-11 08:55:53 -0500254 self.assertEqual(sorted(subnet.keys()), sorted(fields))
255 for field_name in fields:
Mark Maglana5885eb32014-02-28 10:57:34 -0800256 self.assertEqual(subnet[field_name], self.subnet[field_name])
jun xied557d9b2014-01-09 14:00:36 +0800257
Masayuki Igawa6d495d62014-03-19 16:38:57 +0900258 @test.attr(type='smoke')
Chris Hoge7579c1a2015-02-26 14:12:15 -0800259 @test.idempotent_id('db68ba48-f4ea-49e9-81d1-e367f6d0b20a')
Miguel Lavallecc939612013-02-22 17:27:20 -0600260 def test_list_subnets(self):
261 # Verify the subnet exists in the list of all subnets
John Warren3961acd2015-10-02 14:38:53 -0400262 body = self.subnets_client.list_subnets()
Mark Maglana5885eb32014-02-28 10:57:34 -0800263 subnets = [subnet['id'] for subnet in body['subnets']
264 if subnet['id'] == self.subnet['id']]
265 self.assertNotEmpty(subnets, "Created subnet not found in the list")
raiesmh08e1aad982013-08-05 14:19:36 +0530266
Chris Hoge7579c1a2015-02-26 14:12:15 -0800267 @test.idempotent_id('842589e3-9663-46b0-85e4-7f01273b0412')
jun xie0b4735d2014-01-07 15:42:58 +0800268 def test_list_subnets_fields(self):
Mark Maglana5885eb32014-02-28 10:57:34 -0800269 # Verify specific fields of subnets
Zhi Kun Liu903596c2014-04-11 08:55:53 -0500270 fields = ['id', 'network_id']
John Warren3961acd2015-10-02 14:38:53 -0400271 body = self.subnets_client.list_subnets(fields=fields)
jun xie0b4735d2014-01-07 15:42:58 +0800272 subnets = body['subnets']
Mark Maglana5885eb32014-02-28 10:57:34 -0800273 self.assertNotEmpty(subnets, "Subnet list returned is empty")
274 for subnet in subnets:
Zhi Kun Liu903596c2014-04-11 08:55:53 -0500275 self.assertEqual(sorted(subnet.keys()), sorted(fields))
jun xie0b4735d2014-01-07 15:42:58 +0800276
Chris Hoge7579c1a2015-02-26 14:12:15 -0800277 @test.idempotent_id('f04f61a9-b7f3-4194-90b2-9bcf660d1bfe')
sukhdevc704a702014-01-15 11:50:56 -0800278 def test_delete_network_with_subnet(self):
279 # Creates a network
280 name = data_utils.rand_name('network-')
John Warren94d8faf2015-09-15 12:22:24 -0400281 body = self.networks_client.create_network(name=name)
sukhdevc704a702014-01-15 11:50:56 -0800282 network = body['network']
283 net_id = network['id']
Jordan Pittier9e227c52016-02-09 14:35:18 +0100284 self.addCleanup(test_utils.call_and_ignore_notfound_exc,
285 self.networks_client.delete_network, net_id)
sukhdevc704a702014-01-15 11:50:56 -0800286
287 # Find a cidr that is not in use yet and create a subnet with it
288 subnet = self.create_subnet(network)
289 subnet_id = subnet['id']
290
291 # Delete network while the subnet still exists
John Warren94d8faf2015-09-15 12:22:24 -0400292 body = self.networks_client.delete_network(net_id)
sukhdevc704a702014-01-15 11:50:56 -0800293
294 # Verify that the subnet got automatically deleted.
John Warren3961acd2015-10-02 14:38:53 -0400295 self.assertRaises(lib_exc.NotFound, self.subnets_client.show_subnet,
sukhdevc704a702014-01-15 11:50:56 -0800296 subnet_id)
297
298 # Since create_subnet adds the subnet to the delete list, and it is
melissamld13d1e82016-10-16 10:19:34 +0800299 # actually deleted here - this will create and issue, hence remove
sukhdevc704a702014-01-15 11:50:56 -0800300 # it from the list.
301 self.subnets.pop()
302
Chris Hoge7579c1a2015-02-26 14:12:15 -0800303 @test.idempotent_id('d2d596e2-8e76-47a9-ac51-d4648009f4d3')
Sergey Shnaidman18cf5972014-09-02 22:05:00 +0400304 def test_create_delete_subnet_without_gateway(self):
305 self._create_verify_delete_subnet()
306
Chris Hoge7579c1a2015-02-26 14:12:15 -0800307 @test.idempotent_id('9393b468-186d-496d-aa36-732348cd76e7')
Edgar Magana6a9ac342014-01-16 13:52:49 -0800308 def test_create_delete_subnet_with_gw(self):
Rohan Kanade35589aa2014-08-19 14:56:12 +0200309 self._create_verify_delete_subnet(
310 **self.subnet_dict(['gateway']))
Edgar Magana6a9ac342014-01-16 13:52:49 -0800311
Chris Hoge7579c1a2015-02-26 14:12:15 -0800312 @test.idempotent_id('bec949c4-3147-4ba6-af5f-cd2306118404')
Rohan Kanade35589aa2014-08-19 14:56:12 +0200313 def test_create_delete_subnet_with_allocation_pools(self):
314 self._create_verify_delete_subnet(
315 **self.subnet_dict(['allocation_pools']))
316
Chris Hoge7579c1a2015-02-26 14:12:15 -0800317 @test.idempotent_id('8217a149-0c6c-4cfb-93db-0486f707d13f')
Rohan Kanade35589aa2014-08-19 14:56:12 +0200318 def test_create_delete_subnet_with_gw_and_allocation_pools(self):
319 self._create_verify_delete_subnet(**self.subnet_dict(
320 ['gateway', 'allocation_pools']))
321
Chris Hoge7579c1a2015-02-26 14:12:15 -0800322 @test.idempotent_id('d830de0a-be47-468f-8f02-1fd996118289')
Rohan Kanade35589aa2014-08-19 14:56:12 +0200323 def test_create_delete_subnet_with_host_routes_and_dns_nameservers(self):
324 self._create_verify_delete_subnet(
325 **self.subnet_dict(['host_routes', 'dns_nameservers']))
326
Chris Hoge7579c1a2015-02-26 14:12:15 -0800327 @test.idempotent_id('94ce038d-ff0a-4a4c-a56b-09da3ca0b55d')
Rohan Kanade35589aa2014-08-19 14:56:12 +0200328 def test_create_delete_subnet_with_dhcp_enabled(self):
329 self._create_verify_delete_subnet(enable_dhcp=True)
330
Chris Hoge7579c1a2015-02-26 14:12:15 -0800331 @test.idempotent_id('3d3852eb-3009-49ec-97ac-5ce83b73010a')
Rohan Kanade35589aa2014-08-19 14:56:12 +0200332 def test_update_subnet_gw_dns_host_routes_dhcp(self):
333 network = self.create_network()
venakata anil1a2a64a2014-12-02 07:25:59 +0000334 self.addCleanup(self._delete_network, network)
Rohan Kanade35589aa2014-08-19 14:56:12 +0200335
336 subnet = self.create_subnet(
337 network, **self.subnet_dict(['gateway', 'host_routes',
338 'dns_nameservers',
339 'allocation_pools']))
340 subnet_id = subnet['id']
341 new_gateway = str(netaddr.IPAddress(
342 self._subnet_data[self._ip_version]['gateway']) + 1)
343 # Verify subnet update
344 new_host_routes = self._subnet_data[self._ip_version][
345 'new_host_routes']
346
347 new_dns_nameservers = self._subnet_data[self._ip_version][
348 'new_dns_nameservers']
349 kwargs = {'host_routes': new_host_routes,
350 'dns_nameservers': new_dns_nameservers,
351 'gateway_ip': new_gateway, 'enable_dhcp': True}
352
353 new_name = "New_subnet"
John Warren3961acd2015-10-02 14:38:53 -0400354 body = self.subnets_client.update_subnet(subnet_id, name=new_name,
355 **kwargs)
Rohan Kanade35589aa2014-08-19 14:56:12 +0200356 updated_subnet = body['subnet']
357 kwargs['name'] = new_name
358 self.assertEqual(sorted(updated_subnet['dns_nameservers']),
359 sorted(kwargs['dns_nameservers']))
360 del subnet['dns_nameservers'], kwargs['dns_nameservers']
361
362 self._compare_resource_attrs(updated_subnet, kwargs)
363
Chris Hoge7579c1a2015-02-26 14:12:15 -0800364 @test.idempotent_id('a4d9ec4c-0306-4111-a75c-db01a709030b')
Rohan Kanade35589aa2014-08-19 14:56:12 +0200365 def test_create_delete_subnet_all_attributes(self):
366 self._create_verify_delete_subnet(
367 enable_dhcp=True,
368 **self.subnet_dict(['gateway', 'host_routes', 'dns_nameservers']))
Edgar Magana6a9ac342014-01-16 13:52:49 -0800369
Yair Friedbfdfc752014-09-28 13:56:45 +0300370 @test.attr(type='smoke')
Chris Hoge7579c1a2015-02-26 14:12:15 -0800371 @test.idempotent_id('af774677-42a9-4e4b-bb58-16fe6a5bc1ec')
Kevin Benton6919da42016-03-05 18:00:03 -0800372 @test.requires_ext(extension='external-net', service='network')
373 @testtools.skipUnless(CONF.network.public_network_id,
374 'The public_network_id option must be specified.')
Yair Friedbfdfc752014-09-28 13:56:45 +0300375 def test_external_network_visibility(self):
376 """Verifies user can see external networks but not subnets."""
John Warren94d8faf2015-09-15 12:22:24 -0400377 body = self.networks_client.list_networks(**{'router:external': True})
Yair Friedbfdfc752014-09-28 13:56:45 +0300378 networks = [network['id'] for network in body['networks']]
379 self.assertNotEmpty(networks, "No external networks found")
380
381 nonexternal = [net for net in body['networks'] if
382 not net['router:external']]
383 self.assertEmpty(nonexternal, "Found non-external networks"
384 " in filtered list (%s)." % nonexternal)
385 self.assertIn(CONF.network.public_network_id, networks)
Kevin Benton6919da42016-03-05 18:00:03 -0800386 # only check the public network ID because the other networks may
387 # belong to other tests and their state may have changed during this
388 # test
389 body = self.subnets_client.list_subnets(
390 network_id=CONF.network.public_network_id)
391 self.assertEmpty(body['subnets'], "Public subnets visible")
Yair Friedbfdfc752014-09-28 13:56:45 +0300392
raiesmh086b055e22013-09-16 12:59:57 +0530393
Tong Liu7012c862016-04-11 22:32:05 +0000394class BulkNetworkOpsTest(base.BaseNetworkTest):
Ken'ichi Ohmichie03bea92015-11-19 07:45:58 +0000395 """Tests the following operations in the Neutron API:
raiesmh086b055e22013-09-16 12:59:57 +0530396
397 bulk network creation
398 bulk subnet creation
Eugene Nikanorove9d255a2013-12-18 16:31:42 +0400399 bulk port creation
Sean Dagueed6e5862016-04-04 10:49:13 -0400400 list project's networks
raiesmh086b055e22013-09-16 12:59:57 +0530401
402 v2.0 of the Neutron API is assumed. It is also assumed that the following
403 options are defined in the [network] section of etc/tempest.conf:
404
Sean Dagueed6e5862016-04-04 10:49:13 -0400405 project_network_cidr with a block of cidr's from which smaller blocks
406 can be allocated for project networks
raiesmh086b055e22013-09-16 12:59:57 +0530407
Sean Dagueed6e5862016-04-04 10:49:13 -0400408 project_network_mask_bits with the mask bits to be used to partition
409 the block defined by project-network_cidr
raiesmh086b055e22013-09-16 12:59:57 +0530410 """
411
raiesmh086b055e22013-09-16 12:59:57 +0530412 def _delete_networks(self, created_networks):
413 for n in created_networks:
John Warren94d8faf2015-09-15 12:22:24 -0400414 self.networks_client.delete_network(n['id'])
raiesmh086b055e22013-09-16 12:59:57 +0530415 # Asserting that the networks are not found in the list after deletion
John Warren94d8faf2015-09-15 12:22:24 -0400416 body = self.networks_client.list_networks()
Mark Maglana5885eb32014-02-28 10:57:34 -0800417 networks_list = [network['id'] for network in body['networks']]
raiesmh086b055e22013-09-16 12:59:57 +0530418 for n in created_networks:
419 self.assertNotIn(n['id'], networks_list)
420
421 def _delete_subnets(self, created_subnets):
422 for n in created_subnets:
John Warren3961acd2015-10-02 14:38:53 -0400423 self.subnets_client.delete_subnet(n['id'])
raiesmh086b055e22013-09-16 12:59:57 +0530424 # Asserting that the subnets are not found in the list after deletion
John Warren3961acd2015-10-02 14:38:53 -0400425 body = self.subnets_client.list_subnets()
Mark Maglana5885eb32014-02-28 10:57:34 -0800426 subnets_list = [subnet['id'] for subnet in body['subnets']]
raiesmh086b055e22013-09-16 12:59:57 +0530427 for n in created_subnets:
428 self.assertNotIn(n['id'], subnets_list)
429
430 def _delete_ports(self, created_ports):
431 for n in created_ports:
John Warren49c0fe52015-10-22 12:35:54 -0400432 self.ports_client.delete_port(n['id'])
raiesmh086b055e22013-09-16 12:59:57 +0530433 # Asserting that the ports are not found in the list after deletion
John Warren49c0fe52015-10-22 12:35:54 -0400434 body = self.ports_client.list_ports()
Mark Maglana5885eb32014-02-28 10:57:34 -0800435 ports_list = [port['id'] for port in body['ports']]
raiesmh086b055e22013-09-16 12:59:57 +0530436 for n in created_ports:
437 self.assertNotIn(n['id'], ports_list)
438
Masayuki Igawa6d495d62014-03-19 16:38:57 +0900439 @test.attr(type='smoke')
Chris Hoge7579c1a2015-02-26 14:12:15 -0800440 @test.idempotent_id('d4f9024d-1e28-4fc1-a6b1-25dbc6fa11e2')
Nayna Patelb03eab42013-08-08 08:58:48 +0000441 def test_bulk_create_delete_network(self):
442 # Creates 2 networks in one request
piyush1107867584aa72015-12-15 18:46:38 +0530443 network_list = [{'name': data_utils.rand_name('network-')},
444 {'name': data_utils.rand_name('network-')}]
Ken'ichi Ohmichi1f52fd92016-03-03 12:24:12 -0800445 body = self.networks_client.create_bulk_networks(networks=network_list)
Nayna Patelb03eab42013-08-08 08:58:48 +0000446 created_networks = body['networks']
Nayna Patelb03eab42013-08-08 08:58:48 +0000447 self.addCleanup(self._delete_networks, created_networks)
448 # Asserting that the networks are found in the list after creation
John Warren94d8faf2015-09-15 12:22:24 -0400449 body = self.networks_client.list_networks()
Mark Maglana5885eb32014-02-28 10:57:34 -0800450 networks_list = [network['id'] for network in body['networks']]
Nayna Patelb03eab42013-08-08 08:58:48 +0000451 for n in created_networks:
452 self.assertIsNotNone(n['id'])
453 self.assertIn(n['id'], networks_list)
raiesmh0867698322013-08-20 13:09:01 +0530454
Masayuki Igawa6d495d62014-03-19 16:38:57 +0900455 @test.attr(type='smoke')
Chris Hoge7579c1a2015-02-26 14:12:15 -0800456 @test.idempotent_id('8936533b-c0aa-4f29-8e53-6cc873aec489')
raiesmh082d5c6512013-09-06 15:35:05 +0530457 def test_bulk_create_delete_subnet(self):
Assaf Mullere4f78992014-06-19 17:32:14 +0300458 networks = [self.create_network(), self.create_network()]
raiesmh082d5c6512013-09-06 15:35:05 +0530459 # Creates 2 subnets in one request
Rohan Kanade0efb0232015-02-19 13:33:31 +0530460 if self._ip_version == 4:
Sean Dagueed6e5862016-04-04 10:49:13 -0400461 cidr = netaddr.IPNetwork(CONF.network.project_network_cidr)
462 mask_bits = CONF.network.project_network_mask_bits
Rohan Kanade0efb0232015-02-19 13:33:31 +0530463 else:
Sean Dagueed6e5862016-04-04 10:49:13 -0400464 cidr = netaddr.IPNetwork(CONF.network.project_network_v6_cidr)
465 mask_bits = CONF.network.project_network_v6_mask_bits
Rohan Kanade0efb0232015-02-19 13:33:31 +0530466
Mark Maglana5885eb32014-02-28 10:57:34 -0800467 cidrs = [subnet_cidr for subnet_cidr in cidr.subnet(mask_bits)]
Rohan Kanade0efb0232015-02-19 13:33:31 +0530468
Mark Maglana5885eb32014-02-28 10:57:34 -0800469 names = [data_utils.rand_name('subnet-') for i in range(len(networks))]
470 subnets_list = []
raiesmh082d5c6512013-09-06 15:35:05 +0530471 for i in range(len(names)):
472 p1 = {
Assaf Mullere4f78992014-06-19 17:32:14 +0300473 'network_id': networks[i]['id'],
raiesmh082d5c6512013-09-06 15:35:05 +0530474 'cidr': str(cidrs[(i)]),
475 'name': names[i],
Rohan Kanade0efb0232015-02-19 13:33:31 +0530476 'ip_version': self._ip_version
raiesmh082d5c6512013-09-06 15:35:05 +0530477 }
Mark Maglana5885eb32014-02-28 10:57:34 -0800478 subnets_list.append(p1)
479 del subnets_list[1]['name']
Ken'ichi Ohmichi1f52fd92016-03-03 12:24:12 -0800480 body = self.subnets_client.create_bulk_subnets(subnets=subnets_list)
raiesmh082d5c6512013-09-06 15:35:05 +0530481 created_subnets = body['subnets']
482 self.addCleanup(self._delete_subnets, created_subnets)
raiesmh082d5c6512013-09-06 15:35:05 +0530483 # Asserting that the subnets are found in the list after creation
John Warren3961acd2015-10-02 14:38:53 -0400484 body = self.subnets_client.list_subnets()
Mark Maglana5885eb32014-02-28 10:57:34 -0800485 subnets_list = [subnet['id'] for subnet in body['subnets']]
raiesmh082d5c6512013-09-06 15:35:05 +0530486 for n in created_subnets:
487 self.assertIsNotNone(n['id'])
488 self.assertIn(n['id'], subnets_list)
489
Masayuki Igawa6d495d62014-03-19 16:38:57 +0900490 @test.attr(type='smoke')
Chris Hoge7579c1a2015-02-26 14:12:15 -0800491 @test.idempotent_id('48037ff2-e889-4c3b-b86a-8e3f34d2d060')
raiesmh082d5c6512013-09-06 15:35:05 +0530492 def test_bulk_create_delete_port(self):
Assaf Mullere4f78992014-06-19 17:32:14 +0300493 networks = [self.create_network(), self.create_network()]
raiesmh082d5c6512013-09-06 15:35:05 +0530494 # Creates 2 ports in one request
Mark Maglana5885eb32014-02-28 10:57:34 -0800495 names = [data_utils.rand_name('port-') for i in range(len(networks))]
raiesmh082d5c6512013-09-06 15:35:05 +0530496 port_list = []
497 state = [True, False]
498 for i in range(len(names)):
499 p1 = {
Assaf Mullere4f78992014-06-19 17:32:14 +0300500 'network_id': networks[i]['id'],
raiesmh082d5c6512013-09-06 15:35:05 +0530501 'name': names[i],
502 'admin_state_up': state[i],
503 }
504 port_list.append(p1)
505 del port_list[1]['name']
Ken'ichi Ohmichi1f52fd92016-03-03 12:24:12 -0800506 body = self.ports_client.create_bulk_ports(ports=port_list)
raiesmh082d5c6512013-09-06 15:35:05 +0530507 created_ports = body['ports']
508 self.addCleanup(self._delete_ports, created_ports)
raiesmh082d5c6512013-09-06 15:35:05 +0530509 # Asserting that the ports are found in the list after creation
John Warren49c0fe52015-10-22 12:35:54 -0400510 body = self.ports_client.list_ports()
Mark Maglana5885eb32014-02-28 10:57:34 -0800511 ports_list = [port['id'] for port in body['ports']]
raiesmh082d5c6512013-09-06 15:35:05 +0530512 for n in created_ports:
513 self.assertIsNotNone(n['id'])
514 self.assertIn(n['id'], ports_list)
515
raiesmh0867698322013-08-20 13:09:01 +0530516
Tong Liu7012c862016-04-11 22:32:05 +0000517class BulkNetworkOpsIpV6Test(BulkNetworkOpsTest):
Rohan Kanade0efb0232015-02-19 13:33:31 +0530518 _ip_version = 6
519
520
Tong Liu7012c862016-04-11 22:32:05 +0000521class NetworksIpV6Test(NetworksTest):
Henry Gessauffda37a2014-01-16 11:17:55 -0500522 _ip_version = 6
Henry Gessauffda37a2014-01-16 11:17:55 -0500523
Chris Hoge7579c1a2015-02-26 14:12:15 -0800524 @test.idempotent_id('e41a4888-65a6-418c-a095-f7c2ef4ad59a')
Edgar Magana6a9ac342014-01-16 13:52:49 -0800525 def test_create_delete_subnet_with_gw(self):
Sean Dagueed6e5862016-04-04 10:49:13 -0400526 net = netaddr.IPNetwork(CONF.network.project_network_v6_cidr)
sridhargaddamea73d532014-05-13 14:48:30 +0530527 gateway = str(netaddr.IPAddress(net.first + 2))
Edgar Magana6a9ac342014-01-16 13:52:49 -0800528 name = data_utils.rand_name('network-')
Rohan Kanade35589aa2014-08-19 14:56:12 +0200529 network = self.create_network(network_name=name)
Edgar Magana6a9ac342014-01-16 13:52:49 -0800530 subnet = self.create_subnet(network, gateway)
531 # Verifies Subnet GW in IPv6
532 self.assertEqual(subnet['gateway_ip'], gateway)
Edgar Magana6a9ac342014-01-16 13:52:49 -0800533
Chris Hoge7579c1a2015-02-26 14:12:15 -0800534 @test.idempotent_id('ebb4fd95-524f-46af-83c1-0305b239338f')
Sergey Shnaidman18cf5972014-09-02 22:05:00 +0400535 def test_create_delete_subnet_with_default_gw(self):
Sean Dagueed6e5862016-04-04 10:49:13 -0400536 net = netaddr.IPNetwork(CONF.network.project_network_v6_cidr)
sridhargaddamea73d532014-05-13 14:48:30 +0530537 gateway_ip = str(netaddr.IPAddress(net.first + 1))
Edgar Magana6a9ac342014-01-16 13:52:49 -0800538 name = data_utils.rand_name('network-')
Rohan Kanade35589aa2014-08-19 14:56:12 +0200539 network = self.create_network(network_name=name)
Edgar Magana6a9ac342014-01-16 13:52:49 -0800540 subnet = self.create_subnet(network)
541 # Verifies Subnet GW in IPv6
sridhargaddamea73d532014-05-13 14:48:30 +0530542 self.assertEqual(subnet['gateway_ip'], gateway_ip)
Edgar Magana6a9ac342014-01-16 13:52:49 -0800543
Chris Hoge7579c1a2015-02-26 14:12:15 -0800544 @test.idempotent_id('a9653883-b2a4-469b-8c3c-4518430a7e55')
Sergey Shnaidman18cf5972014-09-02 22:05:00 +0400545 def test_create_list_subnet_with_no_gw64_one_network(self):
546 name = data_utils.rand_name('network-')
547 network = self.create_network(name)
548 ipv6_gateway = self.subnet_dict(['gateway'])['gateway']
549 subnet1 = self.create_subnet(network,
550 ip_version=6,
551 gateway=ipv6_gateway)
552 self.assertEqual(netaddr.IPNetwork(subnet1['cidr']).version, 6,
553 'The created subnet is not IPv6')
554 subnet2 = self.create_subnet(network,
555 gateway=None,
556 ip_version=4)
557 self.assertEqual(netaddr.IPNetwork(subnet2['cidr']).version, 4,
558 'The created subnet is not IPv4')
559 # Verifies Subnet GW is set in IPv6
560 self.assertEqual(subnet1['gateway_ip'], ipv6_gateway)
561 # Verifies Subnet GW is None in IPv4
guo yunxian0306a4a2016-07-29 16:32:28 +0800562 self.assertIsNone(subnet2['gateway_ip'])
Sergey Shnaidman18cf5972014-09-02 22:05:00 +0400563 # Verifies all 2 subnets in the same network
John Warren3961acd2015-10-02 14:38:53 -0400564 body = self.subnets_client.list_subnets()
Sergey Shnaidman18cf5972014-09-02 22:05:00 +0400565 subnets = [sub['id'] for sub in body['subnets']
566 if sub['network_id'] == network['id']]
567 test_subnet_ids = [sub['id'] for sub in (subnet1, subnet2)]
ghanshyam2dee5e32016-06-24 14:42:56 +0900568 six.assertCountEqual(self, subnets,
569 test_subnet_ids,
570 'Subnet are not in the same network')
Sergey Shnaidman18cf5972014-09-02 22:05:00 +0400571
Sergey She757c332014-11-25 01:16:32 +0300572
Tong Liu7012c862016-04-11 22:32:05 +0000573class NetworksIpV6TestAttrs(NetworksIpV6Test):
Sergey She757c332014-11-25 01:16:32 +0300574
575 @classmethod
Rohan Kanadea565e452015-01-27 14:00:13 +0530576 def skip_checks(cls):
577 super(NetworksIpV6TestAttrs, cls).skip_checks()
Sergey She757c332014-11-25 01:16:32 +0300578 if not CONF.network_feature_enabled.ipv6_subnet_attributes:
579 raise cls.skipException("IPv6 extended attributes for "
580 "subnets not available")
Sergey She757c332014-11-25 01:16:32 +0300581
Chris Hoge7579c1a2015-02-26 14:12:15 -0800582 @test.idempotent_id('da40cd1b-a833-4354-9a85-cd9b8a3b74ca')
Sergey Shnaidman18cf5972014-09-02 22:05:00 +0400583 def test_create_delete_subnet_with_v6_attributes_stateful(self):
Rohan Kanade35589aa2014-08-19 14:56:12 +0200584 self._create_verify_delete_subnet(
585 gateway=self._subnet_data[self._ip_version]['gateway'],
Sergey Shnaidman18cf5972014-09-02 22:05:00 +0400586 ipv6_ra_mode='dhcpv6-stateful',
587 ipv6_address_mode='dhcpv6-stateful')
588
Chris Hoge7579c1a2015-02-26 14:12:15 -0800589 @test.idempotent_id('176b030f-a923-4040-a755-9dc94329e60c')
Sergey Shnaidman18cf5972014-09-02 22:05:00 +0400590 def test_create_delete_subnet_with_v6_attributes_slaac(self):
591 self._create_verify_delete_subnet(
Rohan Kanade35589aa2014-08-19 14:56:12 +0200592 ipv6_ra_mode='slaac',
593 ipv6_address_mode='slaac')
Sean M. Collinsdd27a4d2014-05-13 10:33:15 -0400594
Chris Hoge7579c1a2015-02-26 14:12:15 -0800595 @test.idempotent_id('7d410310-8c86-4902-adf9-865d08e31adb')
Sergey Shnaidman18cf5972014-09-02 22:05:00 +0400596 def test_create_delete_subnet_with_v6_attributes_stateless(self):
597 self._create_verify_delete_subnet(
598 ipv6_ra_mode='dhcpv6-stateless',
599 ipv6_address_mode='dhcpv6-stateless')
Sergey She757c332014-11-25 01:16:32 +0300600
601 def _test_delete_subnet_with_ports(self, mode):
602 """Create subnet and delete it with existing ports"""
603 slaac_network = self.create_network()
604 subnet_slaac = self.create_subnet(slaac_network,
605 **{'ipv6_ra_mode': mode,
606 'ipv6_address_mode': mode})
607 port = self.create_port(slaac_network)
608 self.assertIsNotNone(port['fixed_ips'][0]['ip_address'])
John Warren3961acd2015-10-02 14:38:53 -0400609 self.subnets_client.delete_subnet(subnet_slaac['id'])
Sergey She757c332014-11-25 01:16:32 +0300610 self.subnets.pop()
John Warren3961acd2015-10-02 14:38:53 -0400611 subnets = self.subnets_client.list_subnets()
Sergey She757c332014-11-25 01:16:32 +0300612 subnet_ids = [subnet['id'] for subnet in subnets['subnets']]
613 self.assertNotIn(subnet_slaac['id'], subnet_ids,
614 "Subnet wasn't deleted")
reedip6fb7e1a2016-03-10 13:32:01 +0900615 self.assertRaisesRegex(
Masayuki Igawad9388762015-01-20 14:56:42 +0900616 lib_exc.Conflict,
Sergey She757c332014-11-25 01:16:32 +0300617 "There are one or more ports still in use on the network",
John Warren94d8faf2015-09-15 12:22:24 -0400618 self.networks_client.delete_network,
Sergey She757c332014-11-25 01:16:32 +0300619 slaac_network['id'])
620
Chris Hoge7579c1a2015-02-26 14:12:15 -0800621 @test.idempotent_id('88554555-ebf8-41ef-9300-4926d45e06e9')
Sergey She757c332014-11-25 01:16:32 +0300622 def test_create_delete_slaac_subnet_with_ports(self):
623 """Test deleting subnet with SLAAC ports
624
625 Create subnet with SLAAC, create ports in network
626 and then you shall be able to delete subnet without port
627 deletion. But you still can not delete the network.
628 """
629 self._test_delete_subnet_with_ports("slaac")
630
Chris Hoge7579c1a2015-02-26 14:12:15 -0800631 @test.idempotent_id('2de6ab5a-fcf0-4144-9813-f91a940291f1')
Sergey She757c332014-11-25 01:16:32 +0300632 def test_create_delete_stateless_subnet_with_ports(self):
633 """Test deleting subnet with DHCPv6 stateless ports
634
635 Create subnet with DHCPv6 stateless, create ports in network
636 and then you shall be able to delete subnet without port
637 deletion. But you still can not delete the network.
638 """
639 self._test_delete_subnet_with_ports("dhcpv6-stateless")