blob: 8f260eae28091fd4daa357f3b351abe0bb0aac63 [file] [log] [blame]
Kevin Bentona305d592016-09-19 04:26:10 -07001# All Rights Reserved.
2#
3# Licensed under the Apache License, Version 2.0 (the "License"); you may
4# not use this file except in compliance with the License. You may obtain
5# a copy of the License at
6#
7# http://www.apache.org/licenses/LICENSE-2.0
8#
9# Unless required by applicable law or agreed to in writing, software
10# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12# License for the specific language governing permissions and limitations
13# under the License.
14
Federico Ressi06ef8542018-10-25 15:23:52 +020015import collections
16
17from neutron_lib import constants
Slawek Kaplonskic12b50c2020-11-09 11:58:46 +010018from neutron_lib.utils import test
Kevin Benton07c90562017-02-27 01:53:16 -080019from oslo_log import log as logging
Chandan Kumarc125fd12017-11-15 19:41:01 +053020from tempest.common import utils as tutils
Itzik Brownbac51dc2016-10-31 12:25:04 +000021from tempest.lib.common.utils import data_utils
Sławek Kapłońskic0caa2e2017-02-25 10:11:32 +000022from tempest.lib import decorators
Genadi Chereshnyae91b69c2017-07-16 09:51:58 +030023import testtools
Kevin Bentona305d592016-09-19 04:26:10 -070024
Federico Ressi06ef8542018-10-25 15:23:52 +020025from neutron_tempest_plugin.common import ip
Chandan Kumar667d3d32017-09-22 12:24:06 +053026from neutron_tempest_plugin.common import ssh
27from neutron_tempest_plugin.common import utils
28from neutron_tempest_plugin import config
29from neutron_tempest_plugin.scenario import base
Federico Ressi06ef8542018-10-25 15:23:52 +020030
Kevin Bentona305d592016-09-19 04:26:10 -070031
Kevin Benton07c90562017-02-27 01:53:16 -080032LOG = logging.getLogger(__name__)
Kevin Bentona305d592016-09-19 04:26:10 -070033CONF = config.CONF
Kevin Bentona305d592016-09-19 04:26:10 -070034
Federico Ressi06ef8542018-10-25 15:23:52 +020035
36ServerWithTrunkPort = collections.namedtuple(
37 'ServerWithTrunkPort',
38 ['port', 'subport', 'trunk', 'floating_ip', 'server',
39 'ssh_client'])
Jakub Libosvar6d397d32016-12-30 10:57:52 -050040
41
Kevin Bentona305d592016-09-19 04:26:10 -070042class TrunkTest(base.BaseTempestTestCase):
Alex Katzbaf14a52020-03-05 11:31:19 +020043 credentials = ['primary', 'admin']
Kevin Bentona305d592016-09-19 04:26:10 -070044 force_tenant_isolation = False
45
46 @classmethod
Chandan Kumarc125fd12017-11-15 19:41:01 +053047 @tutils.requires_ext(extension="trunk", service="network")
Kevin Bentona305d592016-09-19 04:26:10 -070048 def resource_setup(cls):
49 super(TrunkTest, cls).resource_setup()
50 # setup basic topology for servers we can log into
Federico Ressi06ef8542018-10-25 15:23:52 +020051 cls.rand_name = data_utils.rand_name(
52 cls.__name__.rsplit('.', 1)[-1])
53 cls.network = cls.create_network(name=cls.rand_name)
54 cls.subnet = cls.create_subnet(network=cls.network,
55 name=cls.rand_name)
Huifeng Le1c9f40b2018-11-07 01:14:21 +080056 cls.router = cls.create_router_by_client()
57 cls.create_router_interface(cls.router['id'], cls.subnet['id'])
Federico Ressi06ef8542018-10-25 15:23:52 +020058 cls.keypair = cls.create_keypair(name=cls.rand_name)
Kevin Bentona305d592016-09-19 04:26:10 -070059
Federico Ressi06ef8542018-10-25 15:23:52 +020060 def setUp(self):
61 super(TrunkTest, self).setUp()
62 self.security_group = self.create_security_group(name=self.rand_name)
63 self.create_loginable_secgroup_rule(self.security_group['id'])
Kevin Bentona305d592016-09-19 04:26:10 -070064
Federico Ressi06ef8542018-10-25 15:23:52 +020065 def _create_server_with_network(self, network, use_advanced_image=False):
66 port = self._create_server_port(network=network)
67 floating_ip = self.create_floatingip(port=port)
68 ssh_client = self._create_ssh_client(
69 floating_ip=floating_ip, use_advanced_image=use_advanced_image)
70 server = self._create_server(port=port,
71 use_advanced_image=use_advanced_image)
72 return ServerWithTrunkPort(port=port, subport=None, trunk=None,
73 floating_ip=floating_ip, server=server,
74 ssh_client=ssh_client)
75
76 def _create_server_with_trunk_port(self, subport_network=None,
77 segmentation_id=None,
78 use_advanced_image=False):
79 port = self._create_server_port()
80 floating_ip = self.create_floatingip(port=port)
81 ssh_client = self._create_ssh_client(
82 floating_ip=floating_ip, use_advanced_image=use_advanced_image)
83
84 subport = None
85 subports = None
86 if subport_network:
87 subport = self._create_server_port(
88 network=subport_network, mac_address=port['mac_address'])
89 subports = [{'port_id': subport['id'],
90 'segmentation_type': 'vlan',
91 'segmentation_id': segmentation_id}]
92 trunk = self.create_trunk(port=port, subports=subports)
93
94 server = self._create_server(port=port,
95 use_advanced_image=use_advanced_image)
96 return ServerWithTrunkPort(port=port, subport=subport, trunk=trunk,
97 floating_ip=floating_ip, server=server,
98 ssh_client=ssh_client)
99
100 def _create_server_port(self, network=None, **params):
101 network = network or self.network
102 return self.create_port(network=network, name=self.rand_name,
103 security_groups=[self.security_group['id']],
104 **params)
105
106 def _create_server(self, port, use_advanced_image=False, **params):
Slawek Kaplonskida17f002018-10-11 18:35:23 +0200107 if use_advanced_image:
108 flavor_ref = CONF.neutron_plugin_options.advanced_image_flavor_ref
109 image_ref = CONF.neutron_plugin_options.advanced_image_ref
Federico Ressi06ef8542018-10-25 15:23:52 +0200110 else:
111 flavor_ref = CONF.compute.flavor_ref
112 image_ref = CONF.compute.image_ref
113 return self.create_server(flavor_ref=flavor_ref,
114 image_ref=image_ref,
115 key_name=self.keypair['name'],
116 networks=[{'port': port['id']}],
117 **params)['server']
Jakub Libosvar6d397d32016-12-30 10:57:52 -0500118
Federico Ressi06ef8542018-10-25 15:23:52 +0200119 def _show_port(self, port, update=False):
120 observed = self.client.show_port(port['id'])['port']
121 if update:
122 port.update(observed)
123 return observed
Kevin Bentona305d592016-09-19 04:26:10 -0700124
Federico Ressi06ef8542018-10-25 15:23:52 +0200125 def _show_trunk(self, trunk, update=False):
126 observed = self.client.show_trunk(trunk['id'])['trunk']
127 if update:
128 trunk.update(observed)
129 return observed
Kevin Bentona305d592016-09-19 04:26:10 -0700130
Federico Ressi06ef8542018-10-25 15:23:52 +0200131 def _is_trunk_status(self, trunk, status, update=False):
132 return self._show_trunk(trunk, update)['status'] == status
Kevin Bentona305d592016-09-19 04:26:10 -0700133
Federico Ressi06ef8542018-10-25 15:23:52 +0200134 def _is_port_status(self, port, status, update=False):
135 return self._show_port(port, update)['status'] == status
136
137 def _wait_for_port(self, port, status=constants.ACTIVE):
138 utils.wait_until_true(
139 lambda: self._is_port_status(port, status),
140 exception=RuntimeError(
141 "Timed out waiting for port {!r} to transition to get "
142 "status {!r}.".format(port['id'], status)))
143
144 def _wait_for_trunk(self, trunk, status=constants.ACTIVE):
145 utils.wait_until_true(
146 lambda: self._is_trunk_status(trunk, status),
147 exception=RuntimeError(
148 "Timed out waiting for trunk {!r} to transition to get "
149 "status {!r}.".format(trunk['id'], status)))
150
151 def _create_ssh_client(self, floating_ip, use_advanced_image=False):
Huifeng Le1c9f40b2018-11-07 01:14:21 +0800152 if use_advanced_image:
Federico Ressi06ef8542018-10-25 15:23:52 +0200153 username = CONF.neutron_plugin_options.advanced_image_ssh_user
154 else:
155 username = CONF.validation.image_ssh_user
156 return ssh.Client(host=floating_ip['floating_ip_address'],
157 username=username,
158 pkey=self.keypair['private_key'])
Huifeng Le1c9f40b2018-11-07 01:14:21 +0800159
Federico Ressi06ef8542018-10-25 15:23:52 +0200160 def _assert_has_ssh_connectivity(self, ssh_client):
161 ssh_client.exec_command("true")
Huifeng Le1c9f40b2018-11-07 01:14:21 +0800162
Federico Ressi06ef8542018-10-25 15:23:52 +0200163 def _configure_vlan_subport(self, vm, vlan_tag, vlan_subnet):
164 self.wait_for_server_active(server=vm.server)
Slawek Kaplonski2211eab2020-10-20 16:43:53 +0200165 self.wait_for_guest_os_ready(vm.server)
Federico Ressi06ef8542018-10-25 15:23:52 +0200166 self._wait_for_trunk(trunk=vm.trunk)
167 self._wait_for_port(port=vm.port)
168 self._wait_for_port(port=vm.subport)
Huifeng Le1c9f40b2018-11-07 01:14:21 +0800169
Federico Ressi06ef8542018-10-25 15:23:52 +0200170 ip_command = ip.IPCommand(ssh_client=vm.ssh_client)
171 for address in ip_command.list_addresses(port=vm.port):
172 port_iface = address.device.name
173 break
174 else:
175 self.fail("Parent port fixed IP not found on server.")
Jakub Libosvar6d397d32016-12-30 10:57:52 -0500176
Federico Ressi06ef8542018-10-25 15:23:52 +0200177 subport_iface = ip_command.configure_vlan_subport(
178 port=vm.port, subport=vm.subport, vlan_tag=vlan_tag,
179 subnets=[vlan_subnet])
180 for address in ip_command.list_addresses(port=vm.subport):
181 self.assertEqual(subport_iface, address.device.name)
182 self.assertEqual(port_iface, address.device.parent)
183 break
184 else:
185 self.fail("Sub-port fixed IP not found on server.")
Jakub Libosvar6d397d32016-12-30 10:57:52 -0500186
Sławek Kapłońskic0caa2e2017-02-25 10:11:32 +0000187 @decorators.idempotent_id('bb13fe28-f152-4000-8131-37890a40c79e')
Kevin Bentona305d592016-09-19 04:26:10 -0700188 def test_trunk_subport_lifecycle(self):
189 """Test trunk creation and subport transition to ACTIVE status.
190
191 This is a basic test for the trunk extension to ensure that we
192 can create a trunk, attach it to a server, add/remove subports,
193 while ensuring the status transitions as appropriate.
194
195 This test does not assert any dataplane behavior for the subports.
196 It's just a high-level check to ensure the agents claim to have
197 wired the port correctly and that the trunk port itself maintains
198 connectivity.
199 """
Federico Ressi06ef8542018-10-25 15:23:52 +0200200 vm1 = self._create_server_with_trunk_port()
201 vm2 = self._create_server_with_trunk_port()
202 for vm in (vm1, vm2):
203 self.wait_for_server_active(server=vm.server)
Slawek Kaplonski2211eab2020-10-20 16:43:53 +0200204 self.wait_for_guest_os_ready(vm.server)
Federico Ressi06ef8542018-10-25 15:23:52 +0200205 self._wait_for_trunk(vm.trunk)
206 self._assert_has_ssh_connectivity(vm.ssh_client)
207
Kevin Bentona305d592016-09-19 04:26:10 -0700208 # create a few more networks and ports for subports
Yariv Rachmanifed6f862017-12-19 11:55:25 +0200209 # check limit of networks per project
Federico Ressi06ef8542018-10-25 15:23:52 +0200210 segment_ids = range(
211 3, 3 + CONF.neutron_plugin_options.max_networks_per_project)
212 tagged_networks = [self.create_network() for _ in segment_ids]
213 tagged_ports = [self.create_port(network=network)
214 for network in tagged_networks]
215 subports = [{'port_id': tagged_ports[i]['id'],
216 'segmentation_type': 'vlan',
217 'segmentation_id': segment_id}
218 for i, segment_id in enumerate(segment_ids)]
Jakub Libosvar6d397d32016-12-30 10:57:52 -0500219
Federico Ressi06ef8542018-10-25 15:23:52 +0200220 # add all subports to server1
221 self.client.add_subports(vm1.trunk['id'], subports)
222 self._wait_for_trunk(vm1.trunk)
223 for port in tagged_ports:
224 self._wait_for_port(port)
225
226 # ensure main data-plane wasn't interrupted
227 self._assert_has_ssh_connectivity(vm1.ssh_client)
228
229 # move subports over to other server
230 self.client.remove_subports(vm1.trunk['id'], subports)
231 # ensure all subports go down
232 for port in tagged_ports:
233 self._wait_for_port(port, status=constants.DOWN)
234
235 self.client.add_subports(vm2.trunk['id'], subports)
236
237 # wait for both trunks to go back to ACTIVE
238 for vm in [vm1, vm2]:
239 self._wait_for_trunk(vm.trunk)
240
241 # ensure subports come up on other trunk
242 for port in tagged_ports:
243 self._wait_for_port(port)
244
245 # final connectivity check
246 for vm in [vm1, vm2]:
247 self._wait_for_trunk(vm.trunk)
248 self._assert_has_ssh_connectivity(vm1.ssh_client)
249
Slawek Kaplonskic12b50c2020-11-09 11:58:46 +0100250 @test.unstable_test("bug 1897796")
Yariv Rachmanifa1081a2018-11-21 12:46:57 +0200251 @testtools.skipUnless(
252 (CONF.neutron_plugin_options.advanced_image_ref or
253 CONF.neutron_plugin_options.default_image_is_advanced),
254 "Advanced image is required to run this test.")
Sławek Kapłońskic0caa2e2017-02-25 10:11:32 +0000255 @decorators.idempotent_id('a8a02c9b-b453-49b5-89a2-cce7da66aafb')
Jakub Libosvar6d397d32016-12-30 10:57:52 -0500256 def test_subport_connectivity(self):
257 vlan_tag = 10
Jakub Libosvar6d397d32016-12-30 10:57:52 -0500258 vlan_network = self.create_network()
Federico Ressi06ef8542018-10-25 15:23:52 +0200259 vlan_subnet = self.create_subnet(network=vlan_network, gateway=None)
Jakub Libosvar6d397d32016-12-30 10:57:52 -0500260
Yariv Rachmanifa1081a2018-11-21 12:46:57 +0200261 use_advanced_image = (
262 not CONF.neutron_plugin_options.default_image_is_advanced)
263
264 vm1 = self._create_server_with_trunk_port(
265 subport_network=vlan_network,
266 segmentation_id=vlan_tag,
267 use_advanced_image=use_advanced_image)
268 vm2 = self._create_server_with_trunk_port(
269 subport_network=vlan_network,
270 segmentation_id=vlan_tag,
271 use_advanced_image=use_advanced_image)
Jakub Libosvar6d397d32016-12-30 10:57:52 -0500272
Federico Ressi06ef8542018-10-25 15:23:52 +0200273 for vm in [vm1, vm2]:
Bence Romsics2abbc922020-09-30 16:10:07 +0200274 self.check_connectivity(
275 host=vm.floating_ip['floating_ip_address'],
276 ssh_client=vm.ssh_client)
Federico Ressi06ef8542018-10-25 15:23:52 +0200277 self._configure_vlan_subport(vm=vm,
278 vlan_tag=vlan_tag,
279 vlan_subnet=vlan_subnet)
Jakub Libosvar6d397d32016-12-30 10:57:52 -0500280
Kevin Benton6f1f9d52017-03-01 09:14:45 -0800281 # Ping from server1 to server2 via VLAN interface should fail because
282 # we haven't allowed ICMP
283 self.check_remote_connectivity(
Federico Ressi06ef8542018-10-25 15:23:52 +0200284 vm1.ssh_client,
285 vm2.subport['fixed_ips'][0]['ip_address'],
286 should_succeed=False)
287
288 # allow intra-security-group traffic
Alex Katzbaf14a52020-03-05 11:31:19 +0200289 sg_rule = self.create_pingable_secgroup_rule(self.security_group['id'])
290 self.addCleanup(
291 self.os_primary.network_client.delete_security_group_rule,
292 sg_rule['id'])
Kevin Benton6f1f9d52017-03-01 09:14:45 -0800293 self.check_remote_connectivity(
Federico Ressi06ef8542018-10-25 15:23:52 +0200294 vm1.ssh_client,
Slawek Kaplonskie58219b2019-12-09 12:10:55 +0100295 vm2.subport['fixed_ips'][0]['ip_address'],
296 servers=[vm1, vm2])
Huifeng Le1c9f40b2018-11-07 01:14:21 +0800297
Alex Katzbaf14a52020-03-05 11:31:19 +0200298 @testtools.skipUnless(CONF.compute_feature_enabled.cold_migration,
299 'Cold migration is not available.')
300 @testtools.skipUnless(CONF.compute.min_compute_nodes > 1,
301 'Less than 2 compute nodes, skipping multinode '
302 'tests.')
303 @testtools.skipUnless(
304 (CONF.neutron_plugin_options.advanced_image_ref or
305 CONF.neutron_plugin_options.default_image_is_advanced),
306 "Advanced image is required to run this test.")
307 @decorators.attr(type='slow')
308 @decorators.idempotent_id('ecd7de30-1c90-4280-b97c-1bed776d5d07')
309 def test_trunk_vm_migration(self):
310 '''Test connectivity after migration of the server with trunk
311
312 A successfully migrated server shows a VERIFY_RESIZE status that
313 requires confirmation. Need to reconfigure VLAN interface on server
314 side after migration is finished as the configuration doesn't survive
315 the reboot.
316 '''
317 vlan_tag = 10
318 vlan_network = self.create_network()
319 vlan_subnet = self.create_subnet(vlan_network)
320 sg_rule = self.create_pingable_secgroup_rule(self.security_group['id'])
321 self.addCleanup(
322 self.os_primary.network_client.delete_security_group_rule,
323 sg_rule['id'])
324
325 use_advanced_image = (
326 not CONF.neutron_plugin_options.default_image_is_advanced)
327 servers = {}
328 for role in ['migrate', 'connection_test']:
329 servers[role] = self._create_server_with_trunk_port(
330 subport_network=vlan_network,
331 segmentation_id=vlan_tag,
332 use_advanced_image=use_advanced_image)
333 for role in ['migrate', 'connection_test']:
334 self.wait_for_server_active(servers[role].server)
Slawek Kaplonski2211eab2020-10-20 16:43:53 +0200335 self.wait_for_guest_os_ready(servers[role].server)
Alex Katzbaf14a52020-03-05 11:31:19 +0200336 self._configure_vlan_subport(vm=servers[role],
337 vlan_tag=vlan_tag,
338 vlan_subnet=vlan_subnet)
339
340 self.check_remote_connectivity(
341 servers['connection_test'].ssh_client,
342 servers['migrate'].subport['fixed_ips'][0]['ip_address'])
343
344 client = self.os_admin.compute.ServersClient()
345 client.migrate_server(servers['migrate'].server['id'])
346 self.wait_for_server_status(servers['migrate'].server,
347 'VERIFY_RESIZE')
348 client.confirm_resize_server(servers['migrate'].server['id'])
349 self._configure_vlan_subport(vm=servers['migrate'],
350 vlan_tag=vlan_tag,
351 vlan_subnet=vlan_subnet)
352
353 self.check_remote_connectivity(
354 servers['connection_test'].ssh_client,
355 servers['migrate'].subport['fixed_ips'][0]['ip_address'])
356
Huifeng Le1c9f40b2018-11-07 01:14:21 +0800357 @testtools.skipUnless(
Yariv Rachmanifa1081a2018-11-21 12:46:57 +0200358 (CONF.neutron_plugin_options.advanced_image_ref or
359 CONF.neutron_plugin_options.default_image_is_advanced),
Federico Ressi06ef8542018-10-25 15:23:52 +0200360 "Advanced image is required to run this test.")
Huifeng Le1c9f40b2018-11-07 01:14:21 +0800361 @testtools.skipUnless(
Federico Ressi06ef8542018-10-25 15:23:52 +0200362 CONF.neutron_plugin_options.q_agent == "linuxbridge",
363 "Linux bridge agent is required to run this test.")
Huifeng Le1c9f40b2018-11-07 01:14:21 +0800364 @decorators.idempotent_id('d61cbdf6-1896-491c-b4b4-871caf7fbffe')
365 def test_parent_port_connectivity_after_trunk_deleted_lb(self):
366 vlan_tag = 10
Huifeng Le1c9f40b2018-11-07 01:14:21 +0800367 vlan_network = self.create_network()
368 vlan_subnet = self.create_subnet(vlan_network)
369 self.create_router_interface(self.router['id'], vlan_subnet['id'])
370
Yariv Rachmanifa1081a2018-11-21 12:46:57 +0200371 use_advanced_image = (
372 not CONF.neutron_plugin_options.default_image_is_advanced)
373
Federico Ressi06ef8542018-10-25 15:23:52 +0200374 # Create servers
375 trunk_network_server = self._create_server_with_trunk_port(
376 subport_network=vlan_network,
377 segmentation_id=vlan_tag,
Yariv Rachmanifa1081a2018-11-21 12:46:57 +0200378 use_advanced_image=use_advanced_image)
Huifeng Le1c9f40b2018-11-07 01:14:21 +0800379 normal_network_server = self._create_server_with_network(self.network)
380 vlan_network_server = self._create_server_with_network(vlan_network)
Slawek Kaplonskie58219b2019-12-09 12:10:55 +0100381 vms = [normal_network_server, vlan_network_server]
Huifeng Le1c9f40b2018-11-07 01:14:21 +0800382
Federico Ressi06ef8542018-10-25 15:23:52 +0200383 self._configure_vlan_subport(vm=trunk_network_server,
384 vlan_tag=vlan_tag,
385 vlan_subnet=vlan_subnet)
Slawek Kaplonskie58219b2019-12-09 12:10:55 +0100386 for vm in vms:
Federico Ressi06ef8542018-10-25 15:23:52 +0200387 self.wait_for_server_active(vm.server)
Slawek Kaplonski2211eab2020-10-20 16:43:53 +0200388 self.wait_for_guest_os_ready(vm.server)
Huifeng Le1c9f40b2018-11-07 01:14:21 +0800389
Federico Ressi06ef8542018-10-25 15:23:52 +0200390 # allow ICMP traffic
Alex Katzbaf14a52020-03-05 11:31:19 +0200391 sg_rule = self.create_pingable_secgroup_rule(self.security_group['id'])
392 self.addCleanup(
393 self.os_primary.network_client.delete_security_group_rule,
394 sg_rule['id'])
Huifeng Le1c9f40b2018-11-07 01:14:21 +0800395
396 # Ping from trunk_network_server to normal_network_server
397 # via parent port
398 self.check_remote_connectivity(
Federico Ressi06ef8542018-10-25 15:23:52 +0200399 trunk_network_server.ssh_client,
400 normal_network_server.port['fixed_ips'][0]['ip_address'],
Slawek Kaplonskie58219b2019-12-09 12:10:55 +0100401 should_succeed=True,
402 servers=vms)
Huifeng Le1c9f40b2018-11-07 01:14:21 +0800403
404 # Ping from trunk_network_server to vlan_network_server via VLAN
405 # interface should success
406 self.check_remote_connectivity(
Federico Ressi06ef8542018-10-25 15:23:52 +0200407 trunk_network_server.ssh_client,
408 vlan_network_server.port['fixed_ips'][0]['ip_address'],
Slawek Kaplonskie58219b2019-12-09 12:10:55 +0100409 should_succeed=True,
410 servers=vms)
Huifeng Le1c9f40b2018-11-07 01:14:21 +0800411
412 # Delete the trunk
Federico Ressi06ef8542018-10-25 15:23:52 +0200413 self.delete_trunk(
414 trunk_network_server.trunk,
Huifeng Le1c9f40b2018-11-07 01:14:21 +0800415 detach_parent_port=False)
Federico Ressi06ef8542018-10-25 15:23:52 +0200416 LOG.debug("Trunk %s is deleted.",
417 trunk_network_server.trunk['id'])
Huifeng Le1c9f40b2018-11-07 01:14:21 +0800418
419 # Ping from trunk_network_server to normal_network_server
420 # via parent port success after trunk deleted
421 self.check_remote_connectivity(
Federico Ressi06ef8542018-10-25 15:23:52 +0200422 trunk_network_server.ssh_client,
423 normal_network_server.port['fixed_ips'][0]['ip_address'],
Slawek Kaplonskie58219b2019-12-09 12:10:55 +0100424 should_succeed=True,
425 servers=vms)
Huifeng Le1c9f40b2018-11-07 01:14:21 +0800426
427 # Ping from trunk_network_server to vlan_network_server via VLAN
428 # interface should fail after trunk deleted
429 self.check_remote_connectivity(
Federico Ressi06ef8542018-10-25 15:23:52 +0200430 trunk_network_server.ssh_client,
431 vlan_network_server.port['fixed_ips'][0]['ip_address'],
432 should_succeed=False)