1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
| | #! /usr/bin/python3
# SPDX-License-Identifier: GPL-2.0-or-later
#
# tasst - Test A Simple Socket Transport
# library of test helpers for passt & pasta
#
# tasst/scenario/simple - Smallest sensible network to use passt/pasta
#
# Copyright Red Hat
# Author: David Gibson <david@gibson.dropbear.id.au>
from tasst import Tasst
from tasst.nstool import UnshareSite
from tasst.address import IpiAllocator, TEST_NET_2, TEST_NET6_TASST_B
from tasst.transfer import BaseTransferTasst, MetaTcpUploadTasst, MetaUdpTransferTasst
class SimpleNetTasst(Tasst):
"""Base class for tests in a simple network scenario
The sample network has 2 sites (network namespaces) connected with
a veth link:
[simhost] <-veth-> [gw]
gw is set up as the default router for simhost.
simhost has addresses:
self.ip4 (IPv4), self.ip6 (IPv6), self.ip6_ll (IPv6 link local)
gw has addresses:
self.gw_ip4 (IPv4), self.gw_ip6 (IPv6), self.gw_ip6_ll (IPv6 link local)
self.remote_ip4 (IPv4), self.remote_ip6 (IPv6)
The "remote" addresses are on a different subnet from the others,
so the only way for simhost to reach them is via its default
route. This helps to exercise that we're actually using that,
rather than just local net routes.
"""
def setUp(self):
super().setUp()
self.simhost = UnshareSite(type(self).__name__ + '.simhost',
'-Ucnpf --mount-proc')
self.gw = UnshareSite(type(self).__name__ + '.gw', '-n',
parent=self.simhost, sudo=True)
self.ifname = 'veth'
self.gw_ifname = 'gw' + self.ifname
self.simhost.veth(self.ifname, self.gw_ifname, self.gw)
ipa_local = IpiAllocator()
self.ip4, self.ip6 = ipa_local.next_ipis()
self.gw_ip4, self.gw_ip6 = ipa_local.next_ipis()
ipa_remote = IpiAllocator(TEST_NET_2, TEST_NET6_TASST_B)
self.remote_ip4, self.remote_ip6 = ipa_remote.next_ipis()
self.gw.ifup('lo')
self.gw.ifup(self.gw_ifname, self.gw_ip4, self.gw_ip6,
self.remote_ip4, self.remote_ip6)
self.simhost.ifup('lo')
self.simhost.ifup(self.ifname, self.ip4, self.ip6)
# Once link is up on both sides, SLAAC will run
self.gw_ip6_ll = self.gw.addr_wait(self.gw_ifname, family='inet6', scope='link')[0]
self.ip6_ll = self.simhost.addr_wait(self.ifname, family='inet6', scope='link')[0]
# Set up the default route
self.simhost.fg('ip -4 route add default via {}'
.format(self.gw_ip4.ip), sudo=True)
self.simhost.fg('ip -6 route add default via {} dev {}'
.format(self.gw_ip6_ll.ip, self.ifname), sudo=True)
def tearDown(self):
self.gw.close()
self.simhost.close()
super().tearDown()
class SimpleNetConnectivityTasst(SimpleNetTasst, MetaTcpUploadTasst, MetaUdpTransferTasst):
"""
Check connectivity between the simulated host and the gateway,
before involving passt/pasta.
:avocado: tags=meta
"""
def setUp(self):
super().setUp()
BaseTransferTasst.subsetup(self, 'test/small.bin', self.simhost, self.gw,
self.remote_ip4.ip, self.remote_ip6.ip, 10000)
|