blob: 98fe6aed1199e95b15fb893ae5c6d7e5fa365e8d [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
Kevin Benton07c90562017-02-27 01:53:16 -080018from oslo_log import log as logging
Chandan Kumarc125fd12017-11-15 19:41:01 +053019from tempest.common import utils as tutils
Itzik Brownbac51dc2016-10-31 12:25:04 +000020from tempest.lib.common.utils import data_utils
Sławek Kapłońskic0caa2e2017-02-25 10:11:32 +000021from tempest.lib import decorators
Genadi Chereshnyae91b69c2017-07-16 09:51:58 +030022import testtools
Kevin Bentona305d592016-09-19 04:26:10 -070023
Federico Ressi06ef8542018-10-25 15:23:52 +020024from neutron_tempest_plugin.common import ip
Chandan Kumar667d3d32017-09-22 12:24:06 +053025from neutron_tempest_plugin.common import ssh
26from neutron_tempest_plugin.common import utils
27from neutron_tempest_plugin import config
28from neutron_tempest_plugin.scenario import base
Federico Ressi06ef8542018-10-25 15:23:52 +020029
Kevin Bentona305d592016-09-19 04:26:10 -070030
Kevin Benton07c90562017-02-27 01:53:16 -080031LOG = logging.getLogger(__name__)
Kevin Bentona305d592016-09-19 04:26:10 -070032CONF = config.CONF
Kevin Bentona305d592016-09-19 04:26:10 -070033
Federico Ressi06ef8542018-10-25 15:23:52 +020034
35ServerWithTrunkPort = collections.namedtuple(
36 'ServerWithTrunkPort',
37 ['port', 'subport', 'trunk', 'floating_ip', 'server',
38 'ssh_client'])
Jakub Libosvar6d397d32016-12-30 10:57:52 -050039
40
Kevin Bentona305d592016-09-19 04:26:10 -070041class TrunkTest(base.BaseTempestTestCase):
Alex Katzbaf14a52020-03-05 11:31:19 +020042 credentials = ['primary', 'admin']
Kevin Bentona305d592016-09-19 04:26:10 -070043 force_tenant_isolation = False
44
45 @classmethod
Chandan Kumarc125fd12017-11-15 19:41:01 +053046 @tutils.requires_ext(extension="trunk", service="network")
Kevin Bentona305d592016-09-19 04:26:10 -070047 def resource_setup(cls):
48 super(TrunkTest, cls).resource_setup()
49 # setup basic topology for servers we can log into
Federico Ressi06ef8542018-10-25 15:23:52 +020050 cls.rand_name = data_utils.rand_name(
51 cls.__name__.rsplit('.', 1)[-1])
52 cls.network = cls.create_network(name=cls.rand_name)
53 cls.subnet = cls.create_subnet(network=cls.network,
54 name=cls.rand_name)
Huifeng Le1c9f40b2018-11-07 01:14:21 +080055 cls.router = cls.create_router_by_client()
56 cls.create_router_interface(cls.router['id'], cls.subnet['id'])
Federico Ressi06ef8542018-10-25 15:23:52 +020057 cls.keypair = cls.create_keypair(name=cls.rand_name)
Kevin Bentona305d592016-09-19 04:26:10 -070058
Federico Ressi06ef8542018-10-25 15:23:52 +020059 def setUp(self):
60 super(TrunkTest, self).setUp()
61 self.security_group = self.create_security_group(name=self.rand_name)
62 self.create_loginable_secgroup_rule(self.security_group['id'])
Kevin Bentona305d592016-09-19 04:26:10 -070063
Federico Ressi06ef8542018-10-25 15:23:52 +020064 def _create_server_with_network(self, network, use_advanced_image=False):
65 port = self._create_server_port(network=network)
66 floating_ip = self.create_floatingip(port=port)
67 ssh_client = self._create_ssh_client(
68 floating_ip=floating_ip, use_advanced_image=use_advanced_image)
69 server = self._create_server(port=port,
70 use_advanced_image=use_advanced_image)
71 return ServerWithTrunkPort(port=port, subport=None, trunk=None,
72 floating_ip=floating_ip, server=server,
73 ssh_client=ssh_client)
74
75 def _create_server_with_trunk_port(self, subport_network=None,
76 segmentation_id=None,
77 use_advanced_image=False):
78 port = self._create_server_port()
79 floating_ip = self.create_floatingip(port=port)
80 ssh_client = self._create_ssh_client(
81 floating_ip=floating_ip, use_advanced_image=use_advanced_image)
82
83 subport = None
84 subports = None
85 if subport_network:
86 subport = self._create_server_port(
87 network=subport_network, mac_address=port['mac_address'])
88 subports = [{'port_id': subport['id'],
89 'segmentation_type': 'vlan',
90 'segmentation_id': segmentation_id}]
91 trunk = self.create_trunk(port=port, subports=subports)
92
93 server = self._create_server(port=port,
94 use_advanced_image=use_advanced_image)
95 return ServerWithTrunkPort(port=port, subport=subport, trunk=trunk,
96 floating_ip=floating_ip, server=server,
97 ssh_client=ssh_client)
98
99 def _create_server_port(self, network=None, **params):
100 network = network or self.network
101 return self.create_port(network=network, name=self.rand_name,
102 security_groups=[self.security_group['id']],
103 **params)
104
105 def _create_server(self, port, use_advanced_image=False, **params):
Slawek Kaplonskida17f002018-10-11 18:35:23 +0200106 if use_advanced_image:
107 flavor_ref = CONF.neutron_plugin_options.advanced_image_flavor_ref
108 image_ref = CONF.neutron_plugin_options.advanced_image_ref
Federico Ressi06ef8542018-10-25 15:23:52 +0200109 else:
110 flavor_ref = CONF.compute.flavor_ref
111 image_ref = CONF.compute.image_ref
112 return self.create_server(flavor_ref=flavor_ref,
113 image_ref=image_ref,
114 key_name=self.keypair['name'],
115 networks=[{'port': port['id']}],
116 **params)['server']
Jakub Libosvar6d397d32016-12-30 10:57:52 -0500117
Federico Ressi06ef8542018-10-25 15:23:52 +0200118 def _show_port(self, port, update=False):
119 observed = self.client.show_port(port['id'])['port']
120 if update:
121 port.update(observed)
122 return observed
Kevin Bentona305d592016-09-19 04:26:10 -0700123
Federico Ressi06ef8542018-10-25 15:23:52 +0200124 def _show_trunk(self, trunk, update=False):
125 observed = self.client.show_trunk(trunk['id'])['trunk']
126 if update:
127 trunk.update(observed)
128 return observed
Kevin Bentona305d592016-09-19 04:26:10 -0700129
Federico Ressi06ef8542018-10-25 15:23:52 +0200130 def _is_trunk_status(self, trunk, status, update=False):
131 return self._show_trunk(trunk, update)['status'] == status
Kevin Bentona305d592016-09-19 04:26:10 -0700132
Federico Ressi06ef8542018-10-25 15:23:52 +0200133 def _is_port_status(self, port, status, update=False):
134 return self._show_port(port, update)['status'] == status
135
136 def _wait_for_port(self, port, status=constants.ACTIVE):
137 utils.wait_until_true(
138 lambda: self._is_port_status(port, status),
139 exception=RuntimeError(
140 "Timed out waiting for port {!r} to transition to get "
141 "status {!r}.".format(port['id'], status)))
142
143 def _wait_for_trunk(self, trunk, status=constants.ACTIVE):
144 utils.wait_until_true(
145 lambda: self._is_trunk_status(trunk, status),
146 exception=RuntimeError(
147 "Timed out waiting for trunk {!r} to transition to get "
148 "status {!r}.".format(trunk['id'], status)))
149
150 def _create_ssh_client(self, floating_ip, use_advanced_image=False):
Huifeng Le1c9f40b2018-11-07 01:14:21 +0800151 if use_advanced_image:
Federico Ressi06ef8542018-10-25 15:23:52 +0200152 username = CONF.neutron_plugin_options.advanced_image_ssh_user
153 else:
154 username = CONF.validation.image_ssh_user
155 return ssh.Client(host=floating_ip['floating_ip_address'],
156 username=username,
157 pkey=self.keypair['private_key'])
Huifeng Le1c9f40b2018-11-07 01:14:21 +0800158
Federico Ressi06ef8542018-10-25 15:23:52 +0200159 def _assert_has_ssh_connectivity(self, ssh_client):
160 ssh_client.exec_command("true")
Huifeng Le1c9f40b2018-11-07 01:14:21 +0800161
Federico Ressi06ef8542018-10-25 15:23:52 +0200162 def _configure_vlan_subport(self, vm, vlan_tag, vlan_subnet):
163 self.wait_for_server_active(server=vm.server)
Slawek Kaplonski2211eab2020-10-20 16:43:53 +0200164 self.wait_for_guest_os_ready(vm.server)
Federico Ressi06ef8542018-10-25 15:23:52 +0200165 self._wait_for_trunk(trunk=vm.trunk)
166 self._wait_for_port(port=vm.port)
167 self._wait_for_port(port=vm.subport)
Huifeng Le1c9f40b2018-11-07 01:14:21 +0800168
Federico Ressi06ef8542018-10-25 15:23:52 +0200169 ip_command = ip.IPCommand(ssh_client=vm.ssh_client)
170 for address in ip_command.list_addresses(port=vm.port):
171 port_iface = address.device.name
172 break
173 else:
174 self.fail("Parent port fixed IP not found on server.")
Jakub Libosvar6d397d32016-12-30 10:57:52 -0500175
Federico Ressi06ef8542018-10-25 15:23:52 +0200176 subport_iface = ip_command.configure_vlan_subport(
177 port=vm.port, subport=vm.subport, vlan_tag=vlan_tag,
178 subnets=[vlan_subnet])
179 for address in ip_command.list_addresses(port=vm.subport):
180 self.assertEqual(subport_iface, address.device.name)
181 self.assertEqual(port_iface, address.device.parent)
182 break
183 else:
184 self.fail("Sub-port fixed IP not found on server.")
Jakub Libosvar6d397d32016-12-30 10:57:52 -0500185
Sławek Kapłońskic0caa2e2017-02-25 10:11:32 +0000186 @decorators.idempotent_id('bb13fe28-f152-4000-8131-37890a40c79e')
Kevin Bentona305d592016-09-19 04:26:10 -0700187 def test_trunk_subport_lifecycle(self):
188 """Test trunk creation and subport transition to ACTIVE status.
189
190 This is a basic test for the trunk extension to ensure that we
191 can create a trunk, attach it to a server, add/remove subports,
192 while ensuring the status transitions as appropriate.
193
194 This test does not assert any dataplane behavior for the subports.
195 It's just a high-level check to ensure the agents claim to have
196 wired the port correctly and that the trunk port itself maintains
197 connectivity.
198 """
Federico Ressi06ef8542018-10-25 15:23:52 +0200199 vm1 = self._create_server_with_trunk_port()
200 vm2 = self._create_server_with_trunk_port()
201 for vm in (vm1, vm2):
202 self.wait_for_server_active(server=vm.server)
Slawek Kaplonski2211eab2020-10-20 16:43:53 +0200203 self.wait_for_guest_os_ready(vm.server)
Federico Ressi06ef8542018-10-25 15:23:52 +0200204 self._wait_for_trunk(vm.trunk)
205 self._assert_has_ssh_connectivity(vm.ssh_client)
206
Kevin Bentona305d592016-09-19 04:26:10 -0700207 # create a few more networks and ports for subports
Yariv Rachmanifed6f862017-12-19 11:55:25 +0200208 # check limit of networks per project
Federico Ressi06ef8542018-10-25 15:23:52 +0200209 segment_ids = range(
210 3, 3 + CONF.neutron_plugin_options.max_networks_per_project)
211 tagged_networks = [self.create_network() for _ in segment_ids]
212 tagged_ports = [self.create_port(network=network)
213 for network in tagged_networks]
214 subports = [{'port_id': tagged_ports[i]['id'],
215 'segmentation_type': 'vlan',
216 'segmentation_id': segment_id}
217 for i, segment_id in enumerate(segment_ids)]
Jakub Libosvar6d397d32016-12-30 10:57:52 -0500218
Federico Ressi06ef8542018-10-25 15:23:52 +0200219 # add all subports to server1
220 self.client.add_subports(vm1.trunk['id'], subports)
221 self._wait_for_trunk(vm1.trunk)
222 for port in tagged_ports:
223 self._wait_for_port(port)
224
225 # ensure main data-plane wasn't interrupted
226 self._assert_has_ssh_connectivity(vm1.ssh_client)
227
228 # move subports over to other server
229 self.client.remove_subports(vm1.trunk['id'], subports)
230 # ensure all subports go down
231 for port in tagged_ports:
232 self._wait_for_port(port, status=constants.DOWN)
233
234 self.client.add_subports(vm2.trunk['id'], subports)
235
236 # wait for both trunks to go back to ACTIVE
237 for vm in [vm1, vm2]:
238 self._wait_for_trunk(vm.trunk)
239
240 # ensure subports come up on other trunk
241 for port in tagged_ports:
242 self._wait_for_port(port)
243
244 # final connectivity check
245 for vm in [vm1, vm2]:
246 self._wait_for_trunk(vm.trunk)
247 self._assert_has_ssh_connectivity(vm1.ssh_client)
248
Yariv Rachmanifa1081a2018-11-21 12:46:57 +0200249 @testtools.skipUnless(
250 (CONF.neutron_plugin_options.advanced_image_ref or
251 CONF.neutron_plugin_options.default_image_is_advanced),
252 "Advanced image is required to run this test.")
Sławek Kapłońskic0caa2e2017-02-25 10:11:32 +0000253 @decorators.idempotent_id('a8a02c9b-b453-49b5-89a2-cce7da66aafb')
Jakub Libosvar6d397d32016-12-30 10:57:52 -0500254 def test_subport_connectivity(self):
255 vlan_tag = 10
Jakub Libosvar6d397d32016-12-30 10:57:52 -0500256 vlan_network = self.create_network()
Federico Ressi06ef8542018-10-25 15:23:52 +0200257 vlan_subnet = self.create_subnet(network=vlan_network, gateway=None)
Jakub Libosvar6d397d32016-12-30 10:57:52 -0500258
Yariv Rachmanifa1081a2018-11-21 12:46:57 +0200259 use_advanced_image = (
260 not CONF.neutron_plugin_options.default_image_is_advanced)
261
262 vm1 = self._create_server_with_trunk_port(
263 subport_network=vlan_network,
264 segmentation_id=vlan_tag,
265 use_advanced_image=use_advanced_image)
266 vm2 = self._create_server_with_trunk_port(
267 subport_network=vlan_network,
268 segmentation_id=vlan_tag,
269 use_advanced_image=use_advanced_image)
Jakub Libosvar6d397d32016-12-30 10:57:52 -0500270
Federico Ressi06ef8542018-10-25 15:23:52 +0200271 for vm in [vm1, vm2]:
Bence Romsics2abbc922020-09-30 16:10:07 +0200272 self.check_connectivity(
273 host=vm.floating_ip['floating_ip_address'],
274 ssh_client=vm.ssh_client)
Federico Ressi06ef8542018-10-25 15:23:52 +0200275 self._configure_vlan_subport(vm=vm,
276 vlan_tag=vlan_tag,
277 vlan_subnet=vlan_subnet)
Jakub Libosvar6d397d32016-12-30 10:57:52 -0500278
Kevin Benton6f1f9d52017-03-01 09:14:45 -0800279 # Ping from server1 to server2 via VLAN interface should fail because
280 # we haven't allowed ICMP
281 self.check_remote_connectivity(
Federico Ressi06ef8542018-10-25 15:23:52 +0200282 vm1.ssh_client,
283 vm2.subport['fixed_ips'][0]['ip_address'],
284 should_succeed=False)
285
286 # allow intra-security-group traffic
Alex Katzbaf14a52020-03-05 11:31:19 +0200287 sg_rule = self.create_pingable_secgroup_rule(self.security_group['id'])
288 self.addCleanup(
289 self.os_primary.network_client.delete_security_group_rule,
290 sg_rule['id'])
Kevin Benton6f1f9d52017-03-01 09:14:45 -0800291 self.check_remote_connectivity(
Federico Ressi06ef8542018-10-25 15:23:52 +0200292 vm1.ssh_client,
Slawek Kaplonskie58219b2019-12-09 12:10:55 +0100293 vm2.subport['fixed_ips'][0]['ip_address'],
294 servers=[vm1, vm2])
Huifeng Le1c9f40b2018-11-07 01:14:21 +0800295
Alex Katzbaf14a52020-03-05 11:31:19 +0200296 @testtools.skipUnless(CONF.compute_feature_enabled.cold_migration,
297 'Cold migration is not available.')
298 @testtools.skipUnless(CONF.compute.min_compute_nodes > 1,
299 'Less than 2 compute nodes, skipping multinode '
300 'tests.')
301 @testtools.skipUnless(
302 (CONF.neutron_plugin_options.advanced_image_ref or
303 CONF.neutron_plugin_options.default_image_is_advanced),
304 "Advanced image is required to run this test.")
305 @decorators.attr(type='slow')
306 @decorators.idempotent_id('ecd7de30-1c90-4280-b97c-1bed776d5d07')
307 def test_trunk_vm_migration(self):
308 '''Test connectivity after migration of the server with trunk
309
310 A successfully migrated server shows a VERIFY_RESIZE status that
311 requires confirmation. Need to reconfigure VLAN interface on server
312 side after migration is finished as the configuration doesn't survive
313 the reboot.
314 '''
315 vlan_tag = 10
316 vlan_network = self.create_network()
317 vlan_subnet = self.create_subnet(vlan_network)
318 sg_rule = self.create_pingable_secgroup_rule(self.security_group['id'])
319 self.addCleanup(
320 self.os_primary.network_client.delete_security_group_rule,
321 sg_rule['id'])
322
323 use_advanced_image = (
324 not CONF.neutron_plugin_options.default_image_is_advanced)
325 servers = {}
326 for role in ['migrate', 'connection_test']:
327 servers[role] = self._create_server_with_trunk_port(
328 subport_network=vlan_network,
329 segmentation_id=vlan_tag,
330 use_advanced_image=use_advanced_image)
331 for role in ['migrate', 'connection_test']:
332 self.wait_for_server_active(servers[role].server)
Slawek Kaplonski2211eab2020-10-20 16:43:53 +0200333 self.wait_for_guest_os_ready(servers[role].server)
Alex Katzbaf14a52020-03-05 11:31:19 +0200334 self._configure_vlan_subport(vm=servers[role],
335 vlan_tag=vlan_tag,
336 vlan_subnet=vlan_subnet)
337
338 self.check_remote_connectivity(
339 servers['connection_test'].ssh_client,
340 servers['migrate'].subport['fixed_ips'][0]['ip_address'])
341
342 client = self.os_admin.compute.ServersClient()
343 client.migrate_server(servers['migrate'].server['id'])
344 self.wait_for_server_status(servers['migrate'].server,
345 'VERIFY_RESIZE')
346 client.confirm_resize_server(servers['migrate'].server['id'])
347 self._configure_vlan_subport(vm=servers['migrate'],
348 vlan_tag=vlan_tag,
349 vlan_subnet=vlan_subnet)
350
351 self.check_remote_connectivity(
352 servers['connection_test'].ssh_client,
353 servers['migrate'].subport['fixed_ips'][0]['ip_address'])
354
Huifeng Le1c9f40b2018-11-07 01:14:21 +0800355 @testtools.skipUnless(
Yariv Rachmanifa1081a2018-11-21 12:46:57 +0200356 (CONF.neutron_plugin_options.advanced_image_ref or
357 CONF.neutron_plugin_options.default_image_is_advanced),
Federico Ressi06ef8542018-10-25 15:23:52 +0200358 "Advanced image is required to run this test.")
Huifeng Le1c9f40b2018-11-07 01:14:21 +0800359 @testtools.skipUnless(
Federico Ressi06ef8542018-10-25 15:23:52 +0200360 CONF.neutron_plugin_options.q_agent == "linuxbridge",
361 "Linux bridge agent is required to run this test.")
Huifeng Le1c9f40b2018-11-07 01:14:21 +0800362 @decorators.idempotent_id('d61cbdf6-1896-491c-b4b4-871caf7fbffe')
363 def test_parent_port_connectivity_after_trunk_deleted_lb(self):
364 vlan_tag = 10
Huifeng Le1c9f40b2018-11-07 01:14:21 +0800365 vlan_network = self.create_network()
366 vlan_subnet = self.create_subnet(vlan_network)
367 self.create_router_interface(self.router['id'], vlan_subnet['id'])
368
Yariv Rachmanifa1081a2018-11-21 12:46:57 +0200369 use_advanced_image = (
370 not CONF.neutron_plugin_options.default_image_is_advanced)
371
Federico Ressi06ef8542018-10-25 15:23:52 +0200372 # Create servers
373 trunk_network_server = self._create_server_with_trunk_port(
374 subport_network=vlan_network,
375 segmentation_id=vlan_tag,
Yariv Rachmanifa1081a2018-11-21 12:46:57 +0200376 use_advanced_image=use_advanced_image)
Huifeng Le1c9f40b2018-11-07 01:14:21 +0800377 normal_network_server = self._create_server_with_network(self.network)
378 vlan_network_server = self._create_server_with_network(vlan_network)
Slawek Kaplonskie58219b2019-12-09 12:10:55 +0100379 vms = [normal_network_server, vlan_network_server]
Huifeng Le1c9f40b2018-11-07 01:14:21 +0800380
Federico Ressi06ef8542018-10-25 15:23:52 +0200381 self._configure_vlan_subport(vm=trunk_network_server,
382 vlan_tag=vlan_tag,
383 vlan_subnet=vlan_subnet)
Slawek Kaplonskie58219b2019-12-09 12:10:55 +0100384 for vm in vms:
Federico Ressi06ef8542018-10-25 15:23:52 +0200385 self.wait_for_server_active(vm.server)
Slawek Kaplonski2211eab2020-10-20 16:43:53 +0200386 self.wait_for_guest_os_ready(vm.server)
Huifeng Le1c9f40b2018-11-07 01:14:21 +0800387
Federico Ressi06ef8542018-10-25 15:23:52 +0200388 # allow ICMP traffic
Alex Katzbaf14a52020-03-05 11:31:19 +0200389 sg_rule = self.create_pingable_secgroup_rule(self.security_group['id'])
390 self.addCleanup(
391 self.os_primary.network_client.delete_security_group_rule,
392 sg_rule['id'])
Huifeng Le1c9f40b2018-11-07 01:14:21 +0800393
394 # Ping from trunk_network_server to normal_network_server
395 # via parent port
396 self.check_remote_connectivity(
Federico Ressi06ef8542018-10-25 15:23:52 +0200397 trunk_network_server.ssh_client,
398 normal_network_server.port['fixed_ips'][0]['ip_address'],
Slawek Kaplonskie58219b2019-12-09 12:10:55 +0100399 should_succeed=True,
400 servers=vms)
Huifeng Le1c9f40b2018-11-07 01:14:21 +0800401
402 # Ping from trunk_network_server to vlan_network_server via VLAN
403 # interface should success
404 self.check_remote_connectivity(
Federico Ressi06ef8542018-10-25 15:23:52 +0200405 trunk_network_server.ssh_client,
406 vlan_network_server.port['fixed_ips'][0]['ip_address'],
Slawek Kaplonskie58219b2019-12-09 12:10:55 +0100407 should_succeed=True,
408 servers=vms)
Huifeng Le1c9f40b2018-11-07 01:14:21 +0800409
410 # Delete the trunk
Federico Ressi06ef8542018-10-25 15:23:52 +0200411 self.delete_trunk(
412 trunk_network_server.trunk,
Huifeng Le1c9f40b2018-11-07 01:14:21 +0800413 detach_parent_port=False)
Federico Ressi06ef8542018-10-25 15:23:52 +0200414 LOG.debug("Trunk %s is deleted.",
415 trunk_network_server.trunk['id'])
Huifeng Le1c9f40b2018-11-07 01:14:21 +0800416
417 # Ping from trunk_network_server to normal_network_server
418 # via parent port success after trunk deleted
419 self.check_remote_connectivity(
Federico Ressi06ef8542018-10-25 15:23:52 +0200420 trunk_network_server.ssh_client,
421 normal_network_server.port['fixed_ips'][0]['ip_address'],
Slawek Kaplonskie58219b2019-12-09 12:10:55 +0100422 should_succeed=True,
423 servers=vms)
Huifeng Le1c9f40b2018-11-07 01:14:21 +0800424
425 # Ping from trunk_network_server to vlan_network_server via VLAN
426 # interface should fail after trunk deleted
427 self.check_remote_connectivity(
Federico Ressi06ef8542018-10-25 15:23:52 +0200428 trunk_network_server.ssh_client,
429 vlan_network_server.port['fixed_ips'][0]['ip_address'],
430 should_succeed=False)