Merge "IETF Draft: Comments from IETF-96"
[vswitchperf.git] / conf / integration / 01_testcases.conf
1 # Copyright 2015-2016 Intel Corporation.
2 #
3 # Licensed under the Apache License, Version 2.0 (the "License");
4 # you may not use this file except in compliance with the License.
5 # You may obtain 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,
11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 # See the License for the specific language governing permissions and
13 # limitations under the License.
14
15 # The 1st value of SUPPORTED_TUNNELING_PROTO is used as the default
16 # tunneling protocol for OP2P tests.
17 SUPPORTED_TUNNELING_PROTO = ['vxlan', 'gre', 'geneve']
18
19 #
20 # Generic test configuration options are described at conf/01_testcases.conf
21 #
22
23 #
24 # Options specific to integration testcases are described below:
25 #
26 # Required for OP2P tests
27 # "Tunnel Type": ["vxlan"|"gre"|"geneve"]   # Tunnel Type defines tunneling protocol to use.
28 #                                   # It can be overridden by cli option tunnel_type.
29 #                                   # Values:
30 #                                   #    "vxlan" - iteration of destination MAC address
31 #                                   #    "gre" - iteration of destination IP address
32 #                                   #    "geneve" - iteration of destination UDP port
33 #                                   # Default value is "vxlan".
34 #
35 # biDirectional testing for OP2P is not yet supported.
36 # biDirectional must be set to False.
37 #
38 # "TestSteps": []                   # Definition of integration test steps.
39 #                                   # In case that this list is defined, then
40 #                                   # vsperf will execute defined test steps
41 #                                   # one by one. It can be used to configure
42 #                                   # vswitch, insert flows and transmit traffic.
43 #                                   # It is possible to refer to result of any
44 #                                   # previous step through #STEP[i][j] macro.
45 #                                   # Where i is a number of step (starts from 0)
46 #                                   # and j is index of result returned by step i.
47
48 #
49 # Common TestSteps parts ("macros")
50 #
51
52 # P2P macros
53 STEP_VSWITCH_P2P_FLOWS_INIT = [
54     ['vswitch', 'add_switch', 'int_br0'],           # STEP 0
55     ['vswitch', 'add_phy_port', 'int_br0'],         # STEP 1
56     ['vswitch', 'add_phy_port', 'int_br0'],         # STEP 2
57     ['vswitch', 'add_flow', 'int_br0', {'in_port': '#STEP[1][1]', 'actions': ['output:#STEP[2][1]'], 'idle_timeout': '0'}],
58     ['vswitch', 'add_flow', 'int_br0', {'in_port': '#STEP[2][1]', 'actions': ['output:#STEP[1][1]'], 'idle_timeout': '0'}],
59 ]
60
61 STEP_VSWITCH_P2P_FLOWS_FINIT = [
62     ['vswitch', 'dump_flows', 'int_br0'],
63     ['vswitch', 'del_flow', 'int_br0', {'in_port': '#STEP[1][1]'}],
64     ['vswitch', 'del_flow', 'int_br0', {'in_port': '#STEP[2][1]'}],
65     ['vswitch', 'del_port', 'int_br0', '#STEP[1][0]'],
66     ['vswitch', 'del_port', 'int_br0', '#STEP[2][0]'],
67     ['vswitch', 'del_switch', 'int_br0'],
68 ]
69
70 # PVP and PVVP macros
71 STEP_VSWITCH_PVP_INIT = [
72     ['vswitch', 'add_switch', 'int_br0'],           # STEP 0
73     ['vswitch', 'add_phy_port', 'int_br0'],         # STEP 1
74     ['vswitch', 'add_phy_port', 'int_br0'],         # STEP 2
75     ['vswitch', 'add_vport', 'int_br0'],            # STEP 3    vm1 ports
76     ['vswitch', 'add_vport', 'int_br0'],            # STEP 4
77 ]
78
79 STEP_VSWITCH_PVP_FINIT = [
80     ['vswitch', 'del_port', 'int_br0', '#STEP[1][0]'],
81     ['vswitch', 'del_port', 'int_br0', '#STEP[2][0]'],
82     ['vswitch', 'del_port', 'int_br0', '#STEP[3][0]'],
83     ['vswitch', 'del_port', 'int_br0', '#STEP[4][0]'],
84     ['vswitch', 'del_switch', 'int_br0'],
85 ]
86
87 STEP_VSWITCH_PVP_FLOWS_INIT = STEP_VSWITCH_PVP_INIT + [
88     ['vswitch', 'add_flow', 'int_br0', {'in_port': '#STEP[1][1]', 'actions': ['output:#STEP[3][1]'], 'idle_timeout': '0'}],
89     ['vswitch', 'add_flow', 'int_br0', {'in_port': '#STEP[4][1]', 'actions': ['output:#STEP[2][1]'], 'idle_timeout': '0'}],
90     ['vswitch', 'add_flow', 'int_br0', {'in_port': '#STEP[2][1]', 'actions': ['output:#STEP[4][1]'], 'idle_timeout': '0'}],
91     ['vswitch', 'add_flow', 'int_br0', {'in_port': '#STEP[3][1]', 'actions': ['output:#STEP[1][1]'], 'idle_timeout': '0'}],
92 ]
93
94 STEP_VSWITCH_PVP_FLOWS_FINIT = [
95     ['vswitch', 'dump_flows', 'int_br0'],
96     ['vswitch', 'del_flow', 'int_br0', {'in_port': '#STEP[1][1]'}],
97     ['vswitch', 'del_flow', 'int_br0', {'in_port': '#STEP[4][1]'}],
98     ['vswitch', 'del_flow', 'int_br0', {'in_port': '#STEP[2][1]'}],
99     ['vswitch', 'del_flow', 'int_br0', {'in_port': '#STEP[3][1]'}],
100 ] + STEP_VSWITCH_PVP_FINIT
101
102 STEP_VSWITCH_PVVP_INIT = STEP_VSWITCH_PVP_INIT + [
103     ['vswitch', 'add_vport', 'int_br0'],            # STEP 5    vm2 ports
104     ['vswitch', 'add_vport', 'int_br0'],            # STEP 6
105 ]
106
107 STEP_VSWITCH_PVVP_FINIT = [
108     ['vswitch', 'del_port', 'int_br0', '#STEP[5][0]'],  # vm2 ports
109     ['vswitch', 'del_port', 'int_br0', '#STEP[6][0]'],
110 ] + STEP_VSWITCH_PVP_FINIT
111
112 STEP_VSWITCH_PVVP_FLOWS_INIT = STEP_VSWITCH_PVVP_INIT + [
113     ['vswitch', 'add_flow', 'int_br0', {'in_port': '#STEP[1][1]', 'actions': ['output:#STEP[3][1]'], 'idle_timeout': '0'}],
114     ['vswitch', 'add_flow', 'int_br0', {'in_port': '#STEP[4][1]', 'actions': ['output:#STEP[5][1]'], 'idle_timeout': '0'}],
115     ['vswitch', 'add_flow', 'int_br0', {'in_port': '#STEP[6][1]', 'actions': ['output:#STEP[2][1]'], 'idle_timeout': '0'}],
116     ['vswitch', 'add_flow', 'int_br0', {'in_port': '#STEP[2][1]', 'actions': ['output:#STEP[6][1]'], 'idle_timeout': '0'}],
117     ['vswitch', 'add_flow', 'int_br0', {'in_port': '#STEP[5][1]', 'actions': ['output:#STEP[4][1]'], 'idle_timeout': '0'}],
118     ['vswitch', 'add_flow', 'int_br0', {'in_port': '#STEP[3][1]', 'actions': ['output:#STEP[1][1]'], 'idle_timeout': '0'}],
119 ]
120
121 STEP_VSWITCH_PVVP_FLOWS_FINIT = [
122     ['vswitch', 'dump_flows', 'int_br0'],
123     ['vswitch', 'del_flow', 'int_br0', {'in_port': '#STEP[1][1]'}],
124     ['vswitch', 'del_flow', 'int_br0', {'in_port': '#STEP[4][1]'}],
125     ['vswitch', 'del_flow', 'int_br0', {'in_port': '#STEP[6][1]'}],
126     ['vswitch', 'del_flow', 'int_br0', {'in_port': '#STEP[2][1]'}],
127     ['vswitch', 'del_flow', 'int_br0', {'in_port': '#STEP[5][1]'}],
128     ['vswitch', 'del_flow', 'int_br0', {'in_port': '#STEP[3][1]'}],
129 ] + STEP_VSWITCH_PVVP_FINIT
130
131 STEP_VSWITCH_P4VP_INIT = STEP_VSWITCH_PVVP_INIT + [
132     ['vswitch', 'add_vport', 'int_br0'],            # STEP 7    vm3 ports
133     ['vswitch', 'add_vport', 'int_br0'],            # STEP 8
134     ['vswitch', 'add_vport', 'int_br0'],            # STEP 9    vm4 ports
135     ['vswitch', 'add_vport', 'int_br0'],            # STEP 10
136 ]
137
138 STEP_VSWITCH_P4VP_FINIT = [
139     ['vswitch', 'del_port', 'int_br0', '#STEP[7][0]'],  # vm3 ports
140     ['vswitch', 'del_port', 'int_br0', '#STEP[8][0]'],
141     ['vswitch', 'del_port', 'int_br0', '#STEP[9][0]'],  # vm4 ports
142     ['vswitch', 'del_port', 'int_br0', '#STEP[10][0]'],
143 ] + STEP_VSWITCH_PVVP_FINIT
144
145 STEP_VSWITCH_P4VP_FLOWS_INIT = STEP_VSWITCH_P4VP_INIT + [
146             ['vswitch', 'add_flow', 'int_br0', {'in_port': '#STEP[1][1]', \
147                 'actions': ['output:#STEP[3][1]'], 'idle_timeout': '0'}],
148             ['vswitch', 'add_flow', 'int_br0', {'in_port': '#STEP[4][1]', \
149                 'actions': ['output:#STEP[5][1]'], 'idle_timeout': '0'}],
150             ['vswitch', 'add_flow', 'int_br0', {'in_port': '#STEP[6][1]', \
151                 'actions': ['output:#STEP[7][1]'], 'idle_timeout': '0'}],
152             ['vswitch', 'add_flow', 'int_br0', {'in_port': '#STEP[8][1]', \
153                 'actions': ['output:#STEP[9][1]'], 'idle_timeout': '0'}],
154             ['vswitch', 'add_flow', 'int_br0', {'in_port': '#STEP[10][1]', \
155                 'actions': ['output:#STEP[2][1]'], 'idle_timeout': '0'}],
156             ['vswitch', 'add_flow', 'int_br0', {'in_port': '#STEP[2][1]', \
157                 'actions': ['output:#STEP[10][1]'], 'idle_timeout': '0'}],
158             ['vswitch', 'add_flow', 'int_br0', {'in_port': '#STEP[9][1]', \
159                 'actions': ['output:#STEP[8][1]'], 'idle_timeout': '0'}],
160             ['vswitch', 'add_flow', 'int_br0', {'in_port': '#STEP[7][1]', \
161                 'actions': ['output:#STEP[6][1]'], 'idle_timeout': '0'}],
162             ['vswitch', 'add_flow', 'int_br0', {'in_port': '#STEP[5][1]', \
163                 'actions': ['output:#STEP[4][1]'], 'idle_timeout': '0'}],
164             ['vswitch', 'add_flow', 'int_br0', {'in_port': '#STEP[3][1]', \
165                 'actions': ['output:#STEP[1][1]'], 'idle_timeout': '0'}],
166 ]
167
168 STEP_VSWITCH_P4VP_FLOWS_FINIT = [
169     ['vswitch', 'dump_flows', 'int_br0'],
170     ['vswitch', 'del_flow', 'int_br0'],
171 ] + STEP_VSWITCH_P4VP_FINIT
172
173 STEP_VSWITCH_2PHY_2VM_INIT = STEP_VSWITCH_PVVP_INIT
174
175 STEP_VSWITCH_2PHY_2VM_FINIT = STEP_VSWITCH_PVVP_FINIT
176
177 STEP_VSWITCH_2_PARALLEL_VM_FLOWS_INIT  = [
178             # Setup Flows to reply ICMPv6 and similar packets, so to
179             # avoid flooding the internal port with their re-transmissions
180             ['vswitch', 'add_flow', 'int_br0', \
181                 {'priority': '1', 'dl_src': '00:00:00:00:00:01', \
182                 'actions': ['output:#STEP[3][1]'], 'idle_timeout': '0'}],
183             ['vswitch', 'add_flow', 'int_br0', \
184                 {'priority': '1', 'dl_src': '00:00:00:00:00:02', \
185                 'actions': ['output:#STEP[4][1]'], 'idle_timeout': '0'}],
186             ['vswitch', 'add_flow', 'int_br0', \
187                 {'priority': '1', 'dl_src': '00:00:00:00:00:03', \
188                 'actions': ['output:#STEP[5][1]'], 'idle_timeout': '0'}],
189             ['vswitch', 'add_flow', 'int_br0', \
190                 {'priority': '1', 'dl_src': '00:00:00:00:00:04', \
191                 'actions': ['output:#STEP[6][1]'], 'idle_timeout': '0'}],
192             # Forward UDP packets depending on dest port
193             ['vswitch', 'add_flow', 'int_br0', {'in_port': '#STEP[1][1]', \
194                 'dl_type': '0x0800', 'nw_proto': '17', 'udp_dst': '0', \
195                 'actions': ['output:#STEP[3][1]'], 'idle_timeout': '0'}],
196             ['vswitch', 'add_flow', 'int_br0', {'in_port': '#STEP[1][1]', \
197                 'dl_type': '0x0800', 'nw_proto': '17', 'udp_dst': '1', \
198                 'actions': ['output:#STEP[5][1]'], 'idle_timeout': '0'}],
199             # Send VM outputs to phy port #2
200             ['vswitch', 'add_flow', 'int_br0', {'in_port': '#STEP[4][1]', \
201                 'actions': ['output:#STEP[2][1]'], 'idle_timeout': '0'}],
202             ['vswitch', 'add_flow', 'int_br0', {'in_port': '#STEP[6][1]', \
203                 'actions': ['output:#STEP[2][1]'], 'idle_timeout': '0'}],
204 ]
205
206 STEP_VSWITCH_2PHY_4VM_INIT = STEP_VSWITCH_2PHY_2VM_INIT + [
207     ['vswitch', 'add_vport', 'int_br0'],            # STEP 7    vm3 ports
208     ['vswitch', 'add_vport', 'int_br0'],            # STEP 8
209     ['vswitch', 'add_vport', 'int_br0'],            # STEP 9    vm4 ports
210     ['vswitch', 'add_vport', 'int_br0'],            # STEP 10
211 ]
212
213 STEP_VSWITCH_2PHY_4VM_FINIT = [
214     ['vswitch', 'del_port', 'int_br0', '#STEP[7][0]'],  # vm3 ports
215     ['vswitch', 'del_port', 'int_br0', '#STEP[8][0]'],
216     ['vswitch', 'del_port', 'int_br0', '#STEP[9][0]'],  # vm4 ports
217     ['vswitch', 'del_port', 'int_br0', '#STEP[10][0]'],
218 ] + STEP_VSWITCH_2PHY_2VM_FINIT
219
220 STEP_VSWITCH_FLOWS_FINIT = [
221     ['vswitch', 'dump_flows', 'int_br0'],
222     ['vswitch', 'del_flow', 'int_br0'],
223 ]
224
225 STEP_VSWITCH_4_PARALLEL_VM_FLOWS_INIT = [
226             # Setup Flows to reply ICMPv6 and similar packets, so to
227             # avoid flooding the internal port with their re-transmissions
228             ['vswitch', 'add_flow', 'int_br0', \
229                 {'priority': '1', 'dl_src': '00:00:00:00:00:01', \
230                 'actions': ['output:#STEP[3][1]'], 'idle_timeout': '0'}],
231             ['vswitch', 'add_flow', 'int_br0', \
232                 {'priority': '1', 'dl_src': '00:00:00:00:00:02', \
233                 'actions': ['output:#STEP[4][1]'], 'idle_timeout': '0'}],
234             ['vswitch', 'add_flow', 'int_br0', \
235                 {'priority': '1', 'dl_src': '00:00:00:00:00:03', \
236                 'actions': ['output:#STEP[5][1]'], 'idle_timeout': '0'}],
237             ['vswitch', 'add_flow', 'int_br0', \
238                 {'priority': '1', 'dl_src': '00:00:00:00:00:04', \
239                 'actions': ['output:#STEP[6][1]'], 'idle_timeout': '0'}],
240             ['vswitch', 'add_flow', 'int_br0', \
241                 {'priority': '1', 'dl_src': '00:00:00:00:00:05', \
242                 'actions': ['output:#STEP[7][1]'], 'idle_timeout': '0'}],
243             ['vswitch', 'add_flow', 'int_br0', \
244                 {'priority': '1', 'dl_src': '00:00:00:00:00:06', \
245                 'actions': ['output:#STEP[8][1]'], 'idle_timeout': '0'}],
246             ['vswitch', 'add_flow', 'int_br0', \
247                 {'priority': '1', 'dl_src': '00:00:00:00:00:07', \
248                 'actions': ['output:#STEP[9][1]'], 'idle_timeout': '0'}],
249             ['vswitch', 'add_flow', 'int_br0', \
250                 {'priority': '1', 'dl_src': '00:00:00:00:00:08', \
251                 'actions': ['output:#STEP[10][1]'], 'idle_timeout': '0'}],
252             # Forward UDP packets depending on dest port
253             ['vswitch', 'add_flow', 'int_br0', {'in_port': '#STEP[1][1]', \
254                 'dl_type': '0x0800', 'nw_proto': '17', 'udp_dst': '0', \
255                 'actions': ['output:#STEP[3][1]'], 'idle_timeout': '0'}],
256             ['vswitch', 'add_flow', 'int_br0', {'in_port': '#STEP[1][1]', \
257                 'dl_type': '0x0800', 'nw_proto': '17', 'udp_dst': '1', \
258                 'actions': ['output:#STEP[5][1]'], 'idle_timeout': '0'}],
259             ['vswitch', 'add_flow', 'int_br0', {'in_port': '#STEP[1][1]', \
260                 'dl_type': '0x0800', 'nw_proto': '17', 'udp_dst': '2', \
261                 'actions': ['output:#STEP[7][1]'], 'idle_timeout': '0'}],
262             ['vswitch', 'add_flow', 'int_br0', {'in_port': '#STEP[1][1]', \
263                 'dl_type': '0x0800', 'nw_proto': '17', 'udp_dst': '3', \
264                 'actions': ['output:#STEP[9][1]'], 'idle_timeout': '0'}],
265             # Send VM outputs to phy port #2
266             ['vswitch', 'add_flow', 'int_br0', {'in_port': '#STEP[4][1]', \
267                 'actions': ['output:#STEP[2][1]'], 'idle_timeout': '0'}],
268             ['vswitch', 'add_flow', 'int_br0', {'in_port': '#STEP[6][1]', \
269                 'actions': ['output:#STEP[2][1]'], 'idle_timeout': '0'}],
270             ['vswitch', 'add_flow', 'int_br0', {'in_port': '#STEP[8][1]', \
271                 'actions': ['output:#STEP[2][1]'], 'idle_timeout': '0'}],
272             ['vswitch', 'add_flow', 'int_br0', {'in_port': '#STEP[10][1]', \
273                 'actions': ['output:#STEP[2][1]'], 'idle_timeout': '0'}],
274 ]
275
276 STEP_VSWITCH_2PHY_6VM_INIT = STEP_VSWITCH_2PHY_4VM_INIT + [
277             ['vswitch', 'add_vport', 'int_br0'],        # STEP 11   vm5    vhu8
278             ['vswitch', 'add_vport', 'int_br0'],        # STEP 12          vhu9
279             ['vswitch', 'add_vport', 'int_br0'],        # STEP 13   vm6    vhu10
280             ['vswitch', 'add_vport', 'int_br0'],        # STEP 14          vhu11
281 ]
282
283 STEP_VSWITCH_6_PARALLEL_VM_FLOWS_INIT = STEP_VSWITCH_4_PARALLEL_VM_FLOWS_INIT + [
284             ['vswitch', 'add_flow', 'int_br0', \
285                 {'priority': '1', 'dl_src': '00:00:00:00:00:09', \
286                 'actions': ['output:#STEP[11][1]'], 'idle_timeout': '0'}],
287             ['vswitch', 'add_flow', 'int_br0', \
288                 {'priority': '1', 'dl_src': '00:00:00:00:00:0a', \
289                 'actions': ['output:#STEP[12][1]'], 'idle_timeout': '0'}],
290             ['vswitch', 'add_flow', 'int_br0', \
291                 {'priority': '1', 'dl_src': '00:00:00:00:00:0b', \
292                 'actions': ['output:#STEP[13][1]'], 'idle_timeout': '0'}],
293             ['vswitch', 'add_flow', 'int_br0', \
294                 {'priority': '1', 'dl_src': '00:00:00:00:00:0c', \
295                 'actions': ['output:#STEP[14][1]'], 'idle_timeout': '0'}],
296             # Forward UDP packets depending on dest port
297             ['vswitch', 'add_flow', 'int_br0', {'in_port': '#STEP[1][1]', \
298                 'dl_type': '0x0800', 'nw_proto': '17', 'udp_dst': '4', \
299                 'actions': ['output:#STEP[11][1]'], 'idle_timeout': '0'}],
300             ['vswitch', 'add_flow', 'int_br0', {'in_port': '#STEP[1][1]', \
301                 'dl_type': '0x0800', 'nw_proto': '17', 'udp_dst': '5', \
302                 'actions': ['output:#STEP[13][1]'], 'idle_timeout': '0'}],
303             # Send VM outputs to phy port #2
304             ['vswitch', 'add_flow', 'int_br0', {'in_port': '#STEP[12][1]', \
305                 'actions': ['output:#STEP[2][1]'], 'idle_timeout': '0'}],
306             ['vswitch', 'add_flow', 'int_br0', {'in_port': '#STEP[14][1]', \
307                 'actions': ['output:#STEP[2][1]'], 'idle_timeout': '0'}],
308 ]
309
310 STEP_VSWITCH_2PHY_6VM_FINIT = [
311             ['vswitch', 'del_port', 'int_br0', '#STEP[11][0]'],  # vm5 ports
312             ['vswitch', 'del_port', 'int_br0', '#STEP[12][0]'],
313             ['vswitch', 'del_port', 'int_br0', '#STEP[13][0]'],  # vm6 ports
314             ['vswitch', 'del_port', 'int_br0', '#STEP[14][0]'],
315 ] + STEP_VSWITCH_2PHY_4VM_FINIT
316
317 #
318 # Definition of integration tests
319 #
320 INTEGRATION_TESTS = [
321     {
322         "Name": "overlay_p2p_mod_tput",
323         "Traffic Type": "rfc2544",
324         "Deployment": "ptunp",
325         "biDirectional": 'True',
326         "Tunnel Type": "vxlan",
327         "Description": ("Tunneling Throughput RFC2544 Test."
328                        "The encap and decap are performed inside the "
329                        "virtual switch itself in each direction to avoid "
330                        "the need of ingress overlay traffic."),
331     },
332     {
333         "Name": "overlay_p2p_tput",
334         "Traffic Type": "rfc2544",
335         "Deployment": "op2p",
336         "biDirectional": 'False',
337         "Tunnel Type": SUPPORTED_TUNNELING_PROTO[0],
338         "Tunnel Operation": "encapsulation",
339         "Description": "Overlay Encapsulation Throughput RFC2544 Test",
340     },
341     {
342         "Name": "overlay_p2p_cont",
343         "Traffic Type": "continuous",
344         "Deployment": "op2p",
345         "biDirectional": 'False',
346         "Tunnel Type": SUPPORTED_TUNNELING_PROTO[0],
347         "Tunnel Operation": "encapsulation",
348         "Description": "Overlay Encapsulation Continuous Stream",
349     },
350     {
351         "Name": "overlay_p2p_decap_tput",
352         "Traffic Type": "rfc2544",
353         "Deployment": "op2p",
354         "biDirectional": 'False',
355         "Tunnel Type": SUPPORTED_TUNNELING_PROTO[0],
356         "Tunnel Operation": "decapsulation",
357         "Description": "Overlay Decapsulation Throughput RFC2544 Test",
358     },
359     {
360         "Name": "overlay_p2p_decap_cont",
361         "Traffic Type": "continuous",
362         "Deployment": "op2p",
363         "biDirectional": 'False',
364         "Tunnel Type": SUPPORTED_TUNNELING_PROTO[0],
365         "Tunnel Operation": "decapsulation",
366         "Description": "Overlay Decapsulation Continuous Stream",
367     },
368     {
369         "Name": "vswitch_add_del_bridge",
370         "Deployment": "clean",
371         "Description": "vSwitch - add and delete bridge",
372         "TestSteps": [
373                         ['vswitch', 'add_switch', 'int_br0'],
374                         ['vswitch', 'del_switch', 'int_br0'],
375                      ]
376     },
377     {
378         "Name": "vswitch_add_del_bridges",
379         "Deployment": "clean",
380         "Description": "vSwitch - add and delete bridges",
381         "TestSteps": [
382                         ['vswitch', 'add_switch', 'int_br0'],
383                         ['vswitch', 'add_switch', 'int_br1'],
384                         ['vswitch', 'del_switch', 'int_br0'],
385                         ['vswitch', 'del_switch', 'int_br1'],
386                      ]
387     },
388     {
389         "Name": "vswitch_add_del_phy_port",
390         "Deployment": "clean",
391         "Description": "vSwitch - add and delete physical port",
392         "TestSteps": [
393                         ['vswitch', 'add_switch', 'int_br0'],
394                         ['vswitch', 'add_phy_port', 'int_br0'],
395                         ['vswitch', 'del_port', 'int_br0', '#STEP[1][0]'],
396                         ['vswitch', 'del_switch', 'int_br0'],
397                      ]
398     },
399     {
400         "Name": "vswitch_add_del_phy_ports",
401         "Deployment": "clean",
402         "Description": "vSwitch - add and delete physical ports",
403         "TestSteps": [
404                         ['vswitch', 'add_switch', 'int_br0'],
405                         ['vswitch', 'add_phy_port', 'int_br0'],
406                         ['vswitch', 'add_phy_port', 'int_br0'],
407                         ['vswitch', 'del_port', 'int_br0', '#STEP[1][0]'],
408                         ['vswitch', 'del_port', 'int_br0', '#STEP[2][0]'],
409                         ['vswitch', 'del_switch', 'int_br0'],
410                      ]
411     },
412     {
413         "Name": "vswitch_add_del_vport",
414         "Deployment": "clean",
415         "Description": "vSwitch - add and delete virtual port",
416         "TestSteps": [
417                         ['vswitch', 'add_switch', 'int_br0'],
418                         ['vswitch', 'add_vport', 'int_br0'],
419                         ['vswitch', 'del_port', 'int_br0', '#STEP[1][0]'],
420                         ['vswitch', 'del_switch', 'int_br0'],
421                      ]
422     },
423     {
424         "Name": "vswitch_add_del_vports",
425         "Deployment": "clean",
426         "Description": "vSwitch - add and delete virtual ports",
427         "TestSteps": [
428                         ['vswitch', 'add_switch', 'int_br0'],
429                         ['vswitch', 'add_vport', 'int_br0'],
430                         ['vswitch', 'add_vport', 'int_br0'],
431                         ['vswitch', 'del_port', 'int_br0', '#STEP[1][0]'],
432                         ['vswitch', 'del_port', 'int_br0', '#STEP[2][0]'],
433                         ['vswitch', 'del_switch', 'int_br0'],
434                      ]
435     },
436     {
437         "Name": "vswitch_add_del_flow",
438         "Deployment": "clean",
439         "Description": "vSwitch - add and delete flow",
440         "TestSteps": [
441                         ['vswitch', 'add_switch', 'int_br0'],
442                         ['vswitch', 'add_phy_port', 'int_br0'],
443                         ['vswitch', 'add_phy_port', 'int_br0'],
444                         ['vswitch', 'add_flow', 'int_br0', {'in_port': '#STEP[1][1]', 'actions': ['output:#STEP[2][1]'], 'idle_timeout': '0'}],
445                         ['vswitch', 'del_flow', 'int_br0', {'in_port': '#STEP[1][1]'}],
446                         ['vswitch', 'del_port', 'int_br0', '#STEP[1][0]'],
447                         ['vswitch', 'del_port', 'int_br0', '#STEP[2][0]'],
448                         ['vswitch', 'del_switch', 'int_br0'],
449                      ]
450     },
451     {
452         "Name": "vswitch_add_del_flows",
453         "Deployment": "clean",
454         "Description": "vSwitch - add and delete flows",
455         "TestSteps": STEP_VSWITCH_P2P_FLOWS_INIT +
456                      STEP_VSWITCH_P2P_FLOWS_FINIT
457     },
458     {
459         "Name": "vswitch_p2p_tput",
460         "Deployment": "clean",
461         "Description": "vSwitch - configure switch and execute RFC2544 throughput test",
462         "TestSteps": STEP_VSWITCH_P2P_FLOWS_INIT +
463                      [
464                         ['trafficgen', 'send_traffic', {'traffic_type' : 'throughput', 'bidir' : 'True'}],
465                      ] +
466                      STEP_VSWITCH_P2P_FLOWS_FINIT
467     },
468     {
469         "Name": "vswitch_p2p_back2back",
470         "Deployment": "clean",
471         "Description": "vSwitch - configure switch and execute RFC2544 back2back test",
472         "TestSteps": STEP_VSWITCH_P2P_FLOWS_INIT +
473                      [
474                         ['trafficgen', 'send_traffic', {'traffic_type' : 'back2back', 'bidir' : 'True'}],
475                      ] +
476                      STEP_VSWITCH_P2P_FLOWS_FINIT
477     },
478     {
479         "Name": "vswitch_p2p_cont",
480         "Deployment": "clean",
481         "Description": "vSwitch - configure switch and execute continuous stream test",
482         "TestSteps": STEP_VSWITCH_P2P_FLOWS_INIT +
483                      [
484                         ['trafficgen', 'send_traffic', {'traffic_type' : 'continuous', 'bidir' : 'True'}],
485                      ] +
486                      STEP_VSWITCH_P2P_FLOWS_FINIT
487     },
488     {
489         "Name": "vswitch_pvp",
490         "Deployment": "clean",
491         "Description": "vSwitch - configure switch and one vnf",
492         "TestSteps": STEP_VSWITCH_PVP_INIT +
493                      [
494                         ['vnf', 'start'],
495                         ['vnf', 'stop'],
496                      ] +
497                      STEP_VSWITCH_PVP_FINIT
498     },
499     {
500         "Name": "vswitch_pvp_tput",
501         "Deployment": "clean",
502         "Description": "vSwitch - configure switch, vnf and execute RFC2544 throughput test",
503         "TestSteps": STEP_VSWITCH_PVP_FLOWS_INIT +
504                      [
505                         ['vnf', 'start'],
506                         ['trafficgen', 'send_traffic', {'traffic_type' : 'throughput', 'bidir' : 'True'}],
507                         ['vnf', 'stop'],
508                      ] +
509                      STEP_VSWITCH_PVP_FLOWS_FINIT
510     },
511     {
512         "Name": "vswitch_pvp_back2back",
513         "Deployment": "clean",
514         "Description": "vSwitch - configure switch, vnf and execute RFC2544 back2back test",
515         "TestSteps": STEP_VSWITCH_PVP_FLOWS_INIT +
516                      [
517                         ['vnf', 'start'],
518                         ['trafficgen', 'send_traffic', {'traffic_type' : 'back2back', 'bidir' : 'True'}],
519                         ['vnf', 'stop'],
520                      ] +
521                      STEP_VSWITCH_PVP_FLOWS_FINIT
522     },
523     {
524         "Name": "vswitch_pvp_cont",
525         "Deployment": "clean",
526         "Description": "vSwitch - configure switch, vnf and execute continuous stream test",
527         "TestSteps": STEP_VSWITCH_PVP_FLOWS_INIT +
528                      [
529                         ['vnf', 'start'],
530                         ['trafficgen', 'send_traffic', {'traffic_type' : 'continuous', 'bidir' : 'True'}],
531                         ['vnf', 'stop'],
532                      ] +
533                      STEP_VSWITCH_PVP_FLOWS_FINIT
534     },
535     {
536         "Name": "vswitch_pvp_all",
537         "Deployment": "clean",
538         "Description": "vSwitch - configure switch, vnf and execute all test types",
539         "TestSteps": STEP_VSWITCH_PVP_FLOWS_INIT +
540                      [
541                         ['vnf', 'start'],
542                         ['trafficgen', 'send_traffic', {'traffic_type' : 'throughput', 'bidir' : 'True'}],
543                         ['trafficgen', 'send_traffic', {'traffic_type' : 'back2back', 'bidir' : 'True'}],
544                         ['trafficgen', 'send_traffic', {'traffic_type' : 'continuous', 'bidir' : 'True'}],
545                         ['vnf', 'stop'],
546                      ] +
547                      STEP_VSWITCH_PVP_FLOWS_FINIT
548     },
549     {
550         "Name": "vswitch_pvvp",
551         "Deployment": "clean",
552         "Description": "vSwitch - configure switch and two vnfs",
553         "TestSteps": STEP_VSWITCH_PVVP_INIT +
554                      [
555                         ['vnf1', 'start'],
556                         ['vnf2', 'start'],
557                         ['vnf1', 'stop'],
558                         ['vnf2', 'stop'],
559                      ] +
560                      STEP_VSWITCH_PVVP_FINIT
561     },
562     {
563         "Name": "vswitch_pvvp_tput",
564         "Deployment": "clean",
565         "Description": "vSwitch - configure switch, two chained vnfs and execute RFC2544 throughput test",
566         "TestSteps": STEP_VSWITCH_PVVP_FLOWS_INIT +
567                      [
568                         ['vnf1', 'start'],
569                         ['vnf2', 'start'],
570                         ['trafficgen', 'send_traffic', {'traffic_type' : 'throughput', 'bidir' : 'True'}],
571                         ['vnf1', 'stop'],
572                         ['vnf2', 'stop'],
573                      ] +
574                      STEP_VSWITCH_PVVP_FLOWS_FINIT
575     },
576     {
577         "Name": "vswitch_pvvp_back2back",
578         "Deployment": "clean",
579         "Description": "vSwitch - configure switch, two chained vnfs and execute RFC2544 back2back test",
580         "TestSteps": STEP_VSWITCH_PVVP_FLOWS_INIT +
581                      [
582                         ['vnf1', 'start'],
583                         ['vnf2', 'start'],
584                         ['trafficgen', 'send_traffic', {'traffic_type' : 'back2back', 'bidir' : 'True'}],
585                         ['vnf1', 'stop'],
586                         ['vnf2', 'stop'],
587                      ] +
588                      STEP_VSWITCH_PVVP_FLOWS_FINIT
589     },
590     {
591         "Name": "vswitch_pvvp_cont",
592         "Deployment": "clean",
593         "Description": "vSwitch - configure switch, two chained vnfs and execute continuous stream test",
594         "TestSteps": STEP_VSWITCH_PVVP_FLOWS_INIT +
595                      [
596                         ['vnf1', 'start'],
597                         ['vnf2', 'start'],
598                         ['trafficgen', 'send_traffic', {'traffic_type' : 'continuous', 'bidir' : 'True'}],
599                         ['vnf1', 'stop'],
600                         ['vnf2', 'stop'],
601                      ] +
602                      STEP_VSWITCH_PVVP_FLOWS_FINIT
603     },
604     {
605         "Name": "vswitch_pvvp_all",
606         "Deployment": "clean",
607         "Description": "vSwitch - configure switch, two chained vnfs and execute all test types",
608         "TestSteps": STEP_VSWITCH_PVVP_FLOWS_INIT +
609                      [
610                         ['vnf1', 'start'],
611                         ['vnf2', 'start'],
612                         ['trafficgen', 'send_traffic', {'traffic_type' : 'throughput', 'bidir' : 'True'}],
613                         ['trafficgen', 'send_traffic', {'traffic_type' : 'back2back', 'bidir' : 'True'}],
614                         ['trafficgen', 'send_traffic', {'traffic_type' : 'continuous', 'bidir' : 'True'}],
615                         ['vnf1', 'stop'],
616                         ['vnf2', 'stop'],
617                      ] +
618                      STEP_VSWITCH_PVVP_FLOWS_FINIT
619     },
620     {
621         "Name": "vswitch_p4vp",
622         "Description": "Just configure 4 chained vnfs",
623         "Deployment": "clean",
624         "TestSteps": STEP_VSWITCH_P4VP_FLOWS_INIT +
625         [
626             ['vnf1', 'start'],
627             ['vnf2', 'start'],
628             ['vnf3', 'start'],
629             ['vnf4', 'start'],
630             ['vnf1', 'stop'],
631             ['vnf2', 'stop'],
632             ['vnf3', 'stop'],
633             ['vnf4', 'stop'],
634         ] +
635         STEP_VSWITCH_P4VP_FLOWS_FINIT
636     },
637     {
638         "Name": "vswitch_p4vp_tput",
639         "Description": "4 chained vnfs, execute RFC2544 throughput test",
640         "Deployment": "clean",
641         "TestSteps": STEP_VSWITCH_P4VP_FLOWS_INIT +
642         [
643             ['vnf1', 'start'],
644             ['vnf2', 'start'],
645             ['vnf3', 'start'],
646             ['vnf4', 'start'],
647             ['trafficgen', 'send_traffic', {'traffic_type' : 'throughput', \
648                 'bidir' : 'True'}],
649             ['vnf1', 'stop'],
650             ['vnf2', 'stop'],
651             ['vnf3', 'stop'],
652             ['vnf4', 'stop'],
653         ] +
654         STEP_VSWITCH_P4VP_FLOWS_FINIT
655     },
656     {
657         "Name": "vswitch_p4vp_back2back",
658         "Description": "4 chained vnfs, execute RFC2544 back2back test",
659         "Deployment": "clean",
660         "TestSteps": STEP_VSWITCH_P4VP_FLOWS_INIT +
661         [
662             ['vnf1', 'start'],
663             ['vnf2', 'start'],
664             ['vnf3', 'start'],
665             ['vnf4', 'start'],
666             ['trafficgen', 'send_traffic', {'traffic_type' : 'back2back', \
667                 'bidir' : 'True'}],
668             ['vnf1', 'stop'],
669             ['vnf2', 'stop'],
670             ['vnf3', 'stop'],
671             ['vnf4', 'stop'],
672         ] +
673         STEP_VSWITCH_P4VP_FLOWS_FINIT
674     },
675     {
676         "Name": "vswitch_p4vp_cont",
677         "Description": "4 chained vnfs, execute continuous stream test",
678         "Deployment": "clean",
679         "TestSteps": STEP_VSWITCH_P4VP_FLOWS_INIT +
680         [
681             ['vnf1', 'start'],
682             ['vnf2', 'start'],
683             ['vnf3', 'start'],
684             ['vnf4', 'start'],
685             ['trafficgen', 'send_traffic', {'traffic_type' : 'continuous', \
686                 'bidir' : 'True'}],
687             ['vnf1', 'stop'],
688             ['vnf2', 'stop'],
689             ['vnf3', 'stop'],
690             ['vnf4', 'stop'],
691         ] +
692         STEP_VSWITCH_P4VP_FLOWS_FINIT
693     },
694     {
695         "Name": "vswitch_p4vp_all",
696         "Description": "4 chained vnfs, execute RFC2544 throughput test",
697         "Deployment": "clean",
698         "TestSteps": STEP_VSWITCH_P4VP_FLOWS_INIT +
699         [
700             ['vnf1', 'start'],
701             ['vnf2', 'start'],
702             ['vnf3', 'start'],
703             ['vnf4', 'start'],
704             ['trafficgen', 'send_traffic', {'traffic_type' : 'throughput', \
705                 'bidir' : 'True'}],
706             ['trafficgen', 'send_traffic', {'traffic_type' : 'back2back', \
707                 'bidir' : 'True'}],
708             ['trafficgen', 'send_traffic', {'traffic_type' : 'continuous', \
709                 'bidir' : 'True'}],
710             ['vnf1', 'stop'],
711             ['vnf2', 'stop'],
712             ['vnf3', 'stop'],
713             ['vnf4', 'stop'],
714         ] +
715         STEP_VSWITCH_P4VP_FLOWS_FINIT
716     },
717     {
718       # Topology: 2 Parallel PVP connections
719       # To run a Linux bridge as a loopback in the Guest use:
720       #     --test-params "guest_loopback=linux_bridge" --integration 2pvp_udp_dest_flows
721         "Name": "2pvp_udp_dest_flows",
722         "Description": "Continuous TC with 2 Parallel VMs, flows on UDP Dest Port",
723         "Deployment": "clean",
724         "Stream Type": "L4",
725         "MultiStream": 2,
726         "TestSteps": STEP_VSWITCH_2PHY_2VM_INIT +
727             STEP_VSWITCH_2_PARALLEL_VM_FLOWS_INIT + [
728             # Start 2 VMs
729             ['vnf1', 'start'],
730             ['vnf2', 'start'],
731             ['trafficgen', 'send_traffic', {'traffic_type' : 'continuous', 'bidir' : 'False'}],
732             ['vnf1', 'stop'],
733             ['vnf2', 'stop'],
734             # Clean up
735         ] + STEP_VSWITCH_FLOWS_FINIT +
736             STEP_VSWITCH_2PHY_2VM_FINIT
737     },
738     {
739       # Topology: 4 Parallel PVP connections
740       # To run a Linux bridge as a loopback in the Guest use:
741       #     --test-params "guest_loopback=linux_bridge" --integration 4pvp_udp_dest_flows
742         "Name": "4pvp_udp_dest_flows",
743         "Description": "Continuous TC with 4 Parallel VMs, flows on UDP Dest Port",
744         "Deployment": "clean",
745         "Stream Type": "L4",
746         "MultiStream": 4,
747         "TestSteps": STEP_VSWITCH_2PHY_4VM_INIT +
748             STEP_VSWITCH_4_PARALLEL_VM_FLOWS_INIT + [
749             # Start 4 VMs
750             ['vnf1', 'start'],
751             ['vnf2', 'start'],
752             ['vnf3', 'start'],
753             ['vnf4', 'start'],
754             ['trafficgen', 'send_traffic', {'traffic_type' : 'continuous', 'bidir' : 'False'}],
755             ['vnf1', 'stop'],
756             ['vnf2', 'stop'],
757             ['vnf3', 'stop'],
758             ['vnf4', 'stop'],
759             # Clean up
760         ] + STEP_VSWITCH_FLOWS_FINIT +
761             STEP_VSWITCH_2PHY_4VM_FINIT
762     },
763     {
764       # Topology: 6 Parallel PVP connections
765       # To run a Linux bridge as a loopback in the Guest use:
766       #     --test-params "guest_loopback=linux_bridge" --integration 6pvp_udp_dest_flows
767         "Name": "6pvp_udp_dest_flows",
768         "Description": "Continuous TC with 6 Parallel VMs, flows on UDP Dest Port",
769         "Deployment": "clean",
770         "Stream Type": "L4",
771         "MultiStream": 6,
772         "TestSteps": STEP_VSWITCH_2PHY_6VM_INIT +
773             STEP_VSWITCH_6_PARALLEL_VM_FLOWS_INIT + [
774             # Start VMs
775             ['vnf1', 'start'],
776             ['vnf2', 'start'],
777             ['vnf3', 'start'],
778             ['vnf4', 'start'],
779             ['vnf5', 'start'],
780             ['vnf6', 'start'],
781             ['trafficgen', 'send_traffic', {'traffic_type' : 'continuous', 'bidir' : 'False'}],
782             ['vnf1', 'stop'],
783             ['vnf2', 'stop'],
784             ['vnf3', 'stop'],
785             ['vnf4', 'stop'],
786             ['vnf5', 'stop'],
787             ['vnf6', 'stop'],
788         ] + STEP_VSWITCH_FLOWS_FINIT +
789         STEP_VSWITCH_2PHY_6VM_FINIT
790     },
791     {
792         # Testcase for verification of vHost User NUMA awareness feature
793         # introduced in DPDK v2.2. Test case will execute two VNFs, each
794         # pinned to different NUMA slot. After that it will verify that
795         # QEMU and PMD threads serving its interfaces are co-located
796         # at the same NUMA slot.
797         #
798         # Prerequisites:
799         #     * architecture with at least 2 NUMA slots
800         #     * OVS with DPDK support and DPDK v2.2 and newer
801         #     * OVS configuration utilizing both NUMA slots
802         #
803         #     Example of OVS configuration valid for DPDK v16.04 and cores
804         #     split between NUMA slots as follows:
805         #           node 0 cpus: 0 1 2 3 4 5 6 7 8 9
806         #           node 1 cpus: 10 11 12 13 14 15 16 17 18 19
807         #
808         #     VSWITCH_PMD_CPU_MASK = '1010'
809         #     VSWITCHD_DPDK_CONFIG = {
810         #         'dpdk-init' : 'true',
811         #         'dpdk-lcore-mask' : '0x4004',
812         #         'pmd-cpu-mask' : 'FF0FF',
813         #         'dpdk-socket-mem' : '1024,1024',
814         #     }
815         #
816         "Name": "vhost_numa_awareness",
817         "Deployment": "clean",
818         "Description": "vSwitch DPDK - verify that PMD threads are served "
819                        "by the same NUMA slot as QEMU instances",
820         "vSwitch" : "OvsDpdkVhost",
821         "TestSteps": STEP_VSWITCH_PVVP_INIT +                                       # STEP 0-6
822             [
823                 # check that at least 2 numa slots are available
824                 ['tools', 'exec', 'numactl -H', 'available: ([0-9]+)'],             # STEP 7
825                 ['tools', 'assert', '#STEP[-1][0]>1'],                              # STEP 8
826                 # store last 2 cores from numa slot 0
827                 ['tools', 'exec', 'numactl -H', 'node 0 cpus:.*\s+(\\d+) (\\d+)$'], # STEP 9
828                 # store last 2 cores from numa slot 1
829                 ['tools', 'exec', 'numactl -H', 'node 1 cpus:.*\s+(\\d+) (\\d+)$'], # STEP 10
830                 # pin VNF1 to 1st NUMA slot and VNF2 to 2nd NUMA slot
831                 ['settings', 'setValue', 'GUEST_CORE_BINDING',                      # STEP 11
832                     [("#STEP[-2][0][0]", "#STEP[-2][0][1]"),
833                      ("#STEP[-1][0][0]", "#STEP[-1][0][1]")]
834                 ],
835                 # start 2 VNFs
836                 ['vnf1', 'start'],                                                  # STEP 12
837                 ['vnf2', 'start'],                                                  # STEP 13
838                 # read paths to ovs utilities
839                 ['settings', 'getValue', 'TOOLS'],                                  # STEP 14
840                 # check that PMD thread serving VNF1 runs at NUMA slot 0
841                 ## i.e. get numa slot ID serving dpdhvhostuser0...
842                 ['tools', 'exec', "sudo #STEP[-1]['ovs-appctl'] "                   # STEP 15
843                     "dpif-netdev/pmd-rxq-show | "
844                     "sed -e '/dpdkvhostuser0/,$d' | tac",
845                     'pmd thread numa_id ([0-9])+'
846                 ],
847                 ## ...and check that it is NUMA slot 0
848                 ['tools', 'assert', '#STEP[-1][0]==0'],                             # STEP 16
849                 # check that PMD thread serving VNF2 runs at NUMA slot 1
850                 ## i.e. get numa slot ID serving dpdhvhostuser2...
851                 ['tools', 'exec', "sudo #STEP[-3]['ovs-appctl'] "                   # STEP 17
852                     "dpif-netdev/pmd-rxq-show | "
853                     "sed -e '/dpdkvhostuser2/,$d' | tac",
854                     'pmd thread numa_id ([0-9])+'
855                 ],
856                 ## ...and check that it is NUMA slot 1
857                 ['tools', 'assert', '#STEP[-1][0]==1'],                             # STEP 18
858                 # clean up
859                 ['vnf2', 'stop'],                                                   # STEP 19
860                 ['vnf1', 'stop'],                                                   # STEP 20
861             ] +
862             STEP_VSWITCH_PVVP_FINIT                                                 # STEP 21...
863     },
864 ]
865
866 # Example of TC definition with exact vSwitch, VNF and TRAFFICGEN values.
867 #    {
868 #        "Name": "ovs_vanilla_linux_bridge_pvp_cont",
869 #        "Deployment": "clean",
870 #        "Description": "vSwitch - configure OVS Vanilla, QemuVirtioNet with linux bridge and execute continuous stream test",
871 #        "vSwitch" : "OvsVanilla",
872 #        "VNF" : "QemuVirtioNet",
873 #        "Trafficgen": "IxNet",
874 #        "Parameters": {"guest_loopback" : "linux_bridge"},
875 #        "TestSteps": STEP_VSWITCH_PVP_FLOWS_INIT +
876 #                     [
877 #                        ['vnf', 'start'],
878 #                        ['trafficgen', 'send_traffic', {'traffic_type' : 'continuous', 'bidir' : 'True'}],
879 #                        ['vnf', 'stop'],
880 #                     ] +
881 #                     STEP_VSWITCH_PVP_FLOWS_FINIT
882 #    },