9
9
10
10
from tdc_config import *
11
11
12
+ try :
13
+ from pyroute2 import netns
14
+ from pyroute2 import IPRoute
15
+ netlink = True
16
+ except ImportError :
17
+ netlink = False
18
+ print ("!!! Consider installing pyroute2 !!!" )
19
+
12
20
def prepare_suite (obj , test ):
13
21
original = obj .args .NAMES
14
22
@@ -28,10 +36,10 @@ def prepare_suite(obj, test):
28
36
shadow ['DEV2' ] = original ['DEV2' ]
29
37
obj .args .NAMES = shadow
30
38
31
- if obj . args . namespace :
32
- obj ._ns_create ()
39
+ if netlink == True :
40
+ obj ._nl_ns_create ()
33
41
else :
34
- obj ._ports_create ()
42
+ obj ._ns_create ()
35
43
36
44
# Make sure the netns is visible in the fs
37
45
while True :
@@ -70,15 +78,11 @@ def pre_case(self, caseinfo, test_skip):
70
78
if test_skip :
71
79
return
72
80
73
-
74
81
def post_case (self ):
75
82
if self .args .verbose :
76
83
print ('{}.post_case' .format (self .sub_class ))
77
84
78
- if self .args .namespace :
79
- self ._ns_destroy ()
80
- else :
81
- self ._ports_destroy ()
85
+ self ._ns_destroy ()
82
86
83
87
def post_suite (self , index ):
84
88
if self .args .verbose :
@@ -93,24 +97,11 @@ def post_suite(self, index):
93
97
94
98
subprocess .run (cmd , shell = True , stdout = subprocess .DEVNULL , stderr = subprocess .DEVNULL )
95
99
96
- def add_args (self , parser ):
97
- super ().add_args (parser )
98
- self .argparser_group = self .argparser .add_argument_group (
99
- 'netns' ,
100
- 'options for nsPlugin(run commands in net namespace)' )
101
- self .argparser_group .add_argument (
102
- '-N' , '--no-namespace' , action = 'store_false' , default = True ,
103
- dest = 'namespace' , help = 'Don\' t run commands in namespace' )
104
- return self .argparser
105
-
106
100
def adjust_command (self , stage , command ):
107
101
super ().adjust_command (stage , command )
108
102
cmdform = 'list'
109
103
cmdlist = list ()
110
104
111
- if not self .args .namespace :
112
- return command
113
-
114
105
if self .args .verbose :
115
106
print ('{}.adjust_command' .format (self .sub_class ))
116
107
@@ -138,41 +129,59 @@ def adjust_command(self, stage, command):
138
129
print ('adjust_command: return command [{}]' .format (command ))
139
130
return command
140
131
141
- def _ports_create_cmds (self ):
142
- cmds = []
143
-
144
- cmds .append (self ._replace_keywords ('link add $DEV0 type veth peer name $DEV1' ))
145
- cmds .append (self ._replace_keywords ('link set $DEV0 up' ))
146
- cmds .append (self ._replace_keywords ('link add $DUMMY type dummy' ))
147
- if not self .args .namespace :
148
- cmds .append (self ._replace_keywords ('link set $DEV1 up' ))
149
-
150
- return cmds
132
+ def _nl_ns_create (self ):
133
+ ns = self .args .NAMES ["NS" ];
134
+ dev0 = self .args .NAMES ["DEV0" ];
135
+ dev1 = self .args .NAMES ["DEV1" ];
136
+ dummy = self .args .NAMES ["DUMMY" ];
151
137
152
- def _ports_create (self ):
153
- self ._exec_cmd_batched ('pre' , self ._ports_create_cmds ())
154
-
155
- def _ports_destroy_cmd (self ):
156
- return self ._replace_keywords ('link del $DEV0' )
157
-
158
- def _ports_destroy (self ):
159
- self ._exec_cmd ('post' , self ._ports_destroy_cmd ())
138
+ if self .args .verbose :
139
+ print ('{}._nl_ns_create' .format (self .sub_class ))
140
+
141
+ netns .create (ns )
142
+ netns .pushns (newns = ns )
143
+ with IPRoute () as ip :
144
+ ip .link ('add' , ifname = dev1 , kind = 'veth' , peer = {'ifname' : dev0 , 'net_ns_fd' :'/proc/1/ns/net' })
145
+ ip .link ('add' , ifname = dummy , kind = 'dummy' )
146
+ while True :
147
+ try :
148
+ dev1_idx = ip .link_lookup (ifname = dev1 )[0 ]
149
+ dummy_idx = ip .link_lookup (ifname = dummy )[0 ]
150
+ ip .link ('set' , index = dev1_idx , state = 'up' )
151
+ ip .link ('set' , index = dummy_idx , state = 'up' )
152
+ break
153
+ except :
154
+ time .sleep (0.1 )
155
+ continue
156
+ netns .popns ()
157
+
158
+ with IPRoute () as ip :
159
+ while True :
160
+ try :
161
+ dev0_idx = ip .link_lookup (ifname = dev0 )[0 ]
162
+ ip .link ('set' , index = dev0_idx , state = 'up' )
163
+ break
164
+ except :
165
+ time .sleep (0.1 )
166
+ continue
160
167
161
168
def _ns_create_cmds (self ):
162
169
cmds = []
163
170
164
- if self .args .namespace :
165
- ns = self .args .NAMES ['NS' ]
171
+ ns = self .args .NAMES ['NS' ]
166
172
167
- cmds .append (self ._replace_keywords ('netns add {}' .format (ns )))
168
- cmds .append (self ._replace_keywords ('link set $DEV1 netns {}' .format (ns )))
169
- cmds .append (self ._replace_keywords ('link set $DUMMY netns {}' .format (ns )))
170
- cmds .append (self ._replace_keywords ('netns exec {} $IP link set $DEV1 up' .format (ns )))
171
- cmds .append (self ._replace_keywords ('netns exec {} $IP link set $DUMMY up' .format (ns )))
173
+ cmds .append (self ._replace_keywords ('netns add {}' .format (ns )))
174
+ cmds .append (self ._replace_keywords ('link add $DEV1 type veth peer name $DEV0' ))
175
+ cmds .append (self ._replace_keywords ('link set $DEV1 netns {}' .format (ns )))
176
+ cmds .append (self ._replace_keywords ('link add $DUMMY type dummy' .format (ns )))
177
+ cmds .append (self ._replace_keywords ('link set $DUMMY netns {}' .format (ns )))
178
+ cmds .append (self ._replace_keywords ('netns exec {} $IP link set $DEV1 up' .format (ns )))
179
+ cmds .append (self ._replace_keywords ('netns exec {} $IP link set $DUMMY up' .format (ns )))
180
+ cmds .append (self ._replace_keywords ('link set $DEV0 up' .format (ns )))
172
181
173
- if self .args .device :
174
- cmds .append (self ._replace_keywords ('link set $DEV2 netns {}' .format (ns )))
175
- cmds .append (self ._replace_keywords ('netns exec {} $IP link set $DEV2 up' .format (ns )))
182
+ if self .args .device :
183
+ cmds .append (self ._replace_keywords ('link set $DEV2 netns {}' .format (ns )))
184
+ cmds .append (self ._replace_keywords ('netns exec {} $IP link set $DEV2 up' .format (ns )))
176
185
177
186
return cmds
178
187
@@ -181,7 +190,6 @@ def _ns_create(self):
181
190
Create the network namespace in which the tests will be run and set up
182
191
the required network devices for it.
183
192
'''
184
- self ._ports_create ()
185
193
self ._exec_cmd_batched ('pre' , self ._ns_create_cmds ())
186
194
187
195
def _ns_destroy_cmd (self ):
@@ -192,9 +200,7 @@ def _ns_destroy(self):
192
200
Destroy the network namespace for testing (and any associated network
193
201
devices as well)
194
202
'''
195
- if self .args .namespace :
196
- self ._exec_cmd ('post' , self ._ns_destroy_cmd ())
197
- self ._ports_destroy ()
203
+ self ._exec_cmd ('post' , self ._ns_destroy_cmd ())
198
204
199
205
@cached_property
200
206
def _proc (self ):
0 commit comments