99
1010from tdc_config import *
1111
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+
1220def prepare_suite (obj , test ):
1321 original = obj .args .NAMES
1422
@@ -28,10 +36,10 @@ def prepare_suite(obj, test):
2836 shadow ['DEV2' ] = original ['DEV2' ]
2937 obj .args .NAMES = shadow
3038
31- if obj . args . namespace :
32- obj ._ns_create ()
39+ if netlink == True :
40+ obj ._nl_ns_create ()
3341 else :
34- obj ._ports_create ()
42+ obj ._ns_create ()
3543
3644 # Make sure the netns is visible in the fs
3745 while True :
@@ -70,15 +78,11 @@ def pre_case(self, caseinfo, test_skip):
7078 if test_skip :
7179 return
7280
73-
7481 def post_case (self ):
7582 if self .args .verbose :
7683 print ('{}.post_case' .format (self .sub_class ))
7784
78- if self .args .namespace :
79- self ._ns_destroy ()
80- else :
81- self ._ports_destroy ()
85+ self ._ns_destroy ()
8286
8387 def post_suite (self , index ):
8488 if self .args .verbose :
@@ -93,24 +97,11 @@ def post_suite(self, index):
9397
9498 subprocess .run (cmd , shell = True , stdout = subprocess .DEVNULL , stderr = subprocess .DEVNULL )
9599
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-
106100 def adjust_command (self , stage , command ):
107101 super ().adjust_command (stage , command )
108102 cmdform = 'list'
109103 cmdlist = list ()
110104
111- if not self .args .namespace :
112- return command
113-
114105 if self .args .verbose :
115106 print ('{}.adjust_command' .format (self .sub_class ))
116107
@@ -138,41 +129,59 @@ def adjust_command(self, stage, command):
138129 print ('adjust_command: return command [{}]' .format (command ))
139130 return command
140131
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" ];
151137
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
160167
161168 def _ns_create_cmds (self ):
162169 cmds = []
163170
164- if self .args .namespace :
165- ns = self .args .NAMES ['NS' ]
171+ ns = self .args .NAMES ['NS' ]
166172
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 )))
172181
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 )))
176185
177186 return cmds
178187
@@ -181,7 +190,6 @@ def _ns_create(self):
181190 Create the network namespace in which the tests will be run and set up
182191 the required network devices for it.
183192 '''
184- self ._ports_create ()
185193 self ._exec_cmd_batched ('pre' , self ._ns_create_cmds ())
186194
187195 def _ns_destroy_cmd (self ):
@@ -192,9 +200,7 @@ def _ns_destroy(self):
192200 Destroy the network namespace for testing (and any associated network
193201 devices as well)
194202 '''
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 ())
198204
199205 @cached_property
200206 def _proc (self ):
0 commit comments