teststeps: Improvements and bugfixing of teststeps
[vswitchperf.git] / docs / testing / developer / devguide / design / vswitchperf_design.rst
1 .. This work is licensed under a Creative Commons Attribution 4.0 International License.
2 .. http://creativecommons.org/licenses/by/4.0
3 .. (c) OPNFV, Intel Corporation, AT&T and others.
4
5 .. _vsperf-design:
6
7 ======================
8 VSPERF Design Document
9 ======================
10
11 Intended Audience
12 =================
13
14 This document is intended to aid those who want to modify the vsperf code. Or
15 to extend it - for example to add support for new traffic generators,
16 deployment scenarios and so on.
17
18 Usage
19 =====
20
21 Example Connectivity to DUT
22 ---------------------------
23
24 Establish connectivity to the VSPERF DUT Linux host. If this is in an OPNFV lab
25 following the steps provided by `Pharos <https://www.opnfv.org/community/projects/pharos>`_
26 to `access the POD <https://wiki.opnfv.org/display/pharos/Pharos+Lab+Support>`_
27
28 The followign steps establish the VSPERF environment.
29
30 Example Command Lines
31 ---------------------
32
33 List all the cli options:
34
35 .. code-block:: console
36
37    $ ./vsperf -h
38
39 Run all tests that have ``tput`` in their name - ``phy2phy_tput``, ``pvp_tput`` etc.:
40
41 .. code-block:: console
42
43    $ ./vsperf --tests 'tput'
44
45 As above but override default configuration with settings in '10_custom.conf'.
46 This is useful as modifying configuration directly in the configuration files
47 in ``conf/NN_*.py`` shows up as changes under git source control:
48
49 .. code-block:: console
50
51    $ ./vsperf --conf-file=<path_to_custom_conf>/10_custom.conf --tests 'tput'
52
53 Override specific test parameters. Useful for shortening the duration of tests
54 for development purposes:
55
56 .. code-block:: console
57
58    $ ./vsperf --test-params 'TRAFFICGEN_DURATION=10;TRAFFICGEN_RFC2544_TESTS=1;' \
59                             'TRAFFICGEN_PKT_SIZES=(64,)' pvp_tput
60
61 Typical Test Sequence
62 =====================
63
64 This is a typical flow of control for a test.
65
66 .. image:: vsperf.png
67
68 .. _design-configuration:
69
70 Configuration
71 =============
72
73 The conf package contains the configuration files (``*.conf``) for all system
74 components, it also provides a ``settings`` object that exposes all of these
75 settings.
76
77 Settings are not passed from component to component. Rather they are available
78 globally to all components once they import the conf package.
79
80 .. code-block:: python
81
82    from conf import settings
83    ...
84    log_file = settings.getValue('LOG_FILE_DEFAULT')
85
86 Settings files (``*.conf``) are valid python code so can be set to complex
87 types such as lists and dictionaries as well as scalar types:
88
89 .. code-block:: python
90
91    first_packet_size = settings.getValue('PACKET_SIZE_LIST')[0]
92
93 Configuration Procedure and Precedence
94 --------------------------------------
95
96 Configuration files follow a strict naming convention that allows them to be
97 processed in a specific order. All the .conf files are named ``NNx_name.conf``,
98 where ``NN`` is a decimal number and ``x`` is an optional alphabetical suffix.
99 The files are processed in order from ``00_name.conf`` to ``99_name.conf``
100 (and from ``00a_name`` to ``00z_name``), so that if the name setting is given
101 in both a lower and higher numbered conf file then the higher numbered file
102 is the effective setting as it is processed after the setting in the lower
103 numbered file.
104
105 The values in the file specified by ``--conf-file`` takes precedence over all
106 the other configuration files and does not have to follow the naming
107 convention.
108
109 .. _paths-documentation:
110
111 Configuration of PATHS dictionary
112 ---------------------------------
113
114 VSPERF uses external tools like Open vSwitch and Qemu for execution of testcases. These
115 tools may be downloaded and built automatically (see :ref:`vsperf-installation-script`)
116 or installed manually by user from binary packages. It is also possible to use a combination
117 of both approaches, but it is essential to correctly set paths to all required tools.
118 These paths are stored within a PATHS dictionary, which is evaluated before execution
119 of each testcase, in order to setup testcase specific environment. Values selected for testcase
120 execution are internally stored inside TOOLS dictionary, which is used by VSPERF to execute
121 external tools, load kernel modules, etc.
122
123 The default configuration of PATHS dictionary is spread among three different configuration files
124 to follow logical grouping of configuration options. Basic description of PATHS dictionary
125 is placed inside ``conf/00_common.conf``. The configuration specific to DPDK and vswitches
126 is located at ``conf/02_vswitch.conf``. The last part related to the Qemu is defined inside
127 ``conf/04_vnf.conf``. Default configuration values can be used in case, that all required
128 tools were downloaded and built automatically by vsperf itself. In case, that some of
129 tools were installed manually from binary packages, then it will be necessary to modify
130 the content of PATHS dictionary accordingly.
131
132 Dictionary has a specific section of configuration options for every tool type, it means:
133
134     * ``PATHS['vswitch']`` - contains a separate dictionary for each of vswitches supported by VSPEF
135
136       Example:
137
138       .. code-block:: python
139
140          PATHS['vswitch'] = {
141             'OvsDpdkVhost': { ... },
142             'OvsVanilla' : { ... },
143             ...
144          }
145
146     * ``PATHS['dpdk']`` - contains paths to the dpdk sources, kernel modules and tools (e.g. testpmd)
147
148       Example:
149
150       .. code-block:: python
151
152          PATHS['dpdk'] = {
153             'type' : 'src',
154             'src': {
155                 'path': os.path.join(ROOT_DIR, 'src/dpdk/dpdk/'),
156                 'modules' : ['uio', os.path.join(RTE_TARGET, 'kmod/igb_uio.ko')],
157                 'bind-tool': 'tools/dpdk*bind.py',
158                 'testpmd': os.path.join(RTE_TARGET, 'app', 'testpmd'),
159             },
160             ...
161          }
162
163     * ``PATHS['qemu']`` - contains paths to the qemu sources and executable file
164
165       Example:
166
167       .. code-block:: python
168
169          PATHS['qemu'] = {
170              'type' : 'bin',
171              'bin': {
172                  'qemu-system': 'qemu-system-x86_64'
173              },
174              ...
175          }
176
177 Every section specific to the particular vswitch, dpdk or qemu may contain following types
178 of configuration options:
179
180     * option ``type`` - is a string, which defines the type of configured paths ('src' or 'bin')
181       to be selected for a given section:
182
183         * value ``src`` means, that VSPERF will use vswitch, DPDK or QEMU built from sources
184           e.g. by execution of ``systems/build_base_machine.sh`` script during VSPERF
185           installation
186
187         * value ``bin`` means, that VSPERF will use vswitch, DPDK or QEMU binaries installed
188           directly in the operating system, e.g. via OS specific packaging system
189
190     * option ``path`` - is a string with a valid system path; Its content is checked for
191       existence, prefixed with section name and stored into TOOLS for later use
192       e.g. ``TOOLS['dpdk_src']`` or ``TOOLS['vswitch_src']``
193
194     * option ``modules`` - is list of strings with names of kernel modules; Every module name
195       from given list is checked for a '.ko' suffix. In case that it matches and if it is not
196       an absolute path to the module, then module name is prefixed with value of ``path``
197       option defined for the same section
198
199       Example:
200
201       .. code-block:: python
202
203          """
204          snippet of PATHS definition from the configuration file:
205          """
206          PATHS['vswitch'] = {
207              'OvsVanilla' = {
208                  'type' : 'src',
209                  'src': {
210                      'path': '/tmp/vsperf/src_vanilla/ovs/ovs/',
211                      'modules' : ['datapath/linux/openvswitch.ko'],
212                      ...
213                  },
214                  ...
215              }
216              ...
217          }
218
219          """
220          Final content of TOOLS dictionary used during runtime:
221          """
222          TOOLS['vswitch_modules'] = ['/tmp/vsperf/src_vanilla/ovs/ovs/datapath/linux/openvswitch.ko']
223
224     * all other options are strings with names and paths to specific tools; If a given string
225       contains a relative path and option ``path`` is defined for a given section, then string
226       content will be prefixed with content of the ``path``. Otherwise the name of the tool will be
227       searched within standard system directories. In case that filename contains OS specific
228       wildcards, then they will be expanded to the real path. At the end of the processing, every
229       absolute path will be checked for its existence. In case that temporary path (i.e. path with
230       a ``_tmp`` suffix) does not exist, then log will be written and vsperf will continue. If any
231       other path will not exist, then vsperf execution will be terminated with a runtime error.
232
233       Example:
234
235       .. code-block:: python
236
237          """
238          snippet of PATHS definition from the configuration file:
239          """
240          PATHS['vswitch'] = {
241              'OvsDpdkVhost': {
242                  'type' : 'src',
243                  'src': {
244                      'path': '/tmp/vsperf/src_vanilla/ovs/ovs/',
245                      'ovs-vswitchd': 'vswitchd/ovs-vswitchd',
246                      'ovsdb-server': 'ovsdb/ovsdb-server',
247                      ...
248                  }
249                  ...
250              }
251              ...
252          }
253
254          """
255          Final content of TOOLS dictionary used during runtime:
256          """
257          TOOLS['ovs-vswitchd'] = '/tmp/vsperf/src_vanilla/ovs/ovs/vswitchd/ovs-vswitchd'
258          TOOLS['ovsdb-server'] = '/tmp/vsperf/src_vanilla/ovs/ovs/ovsdb/ovsdb-server'
259
260 Note: In case that ``bin`` type is set for DPDK, then ``TOOLS['dpdk_src']`` will be set to
261 the value of ``PATHS['dpdk']['src']['path']``. The reason is, that VSPERF uses downloaded
262 DPDK sources to copy DPDK and testpmd into the GUEST, where testpmd is built. In case,
263 that DPDK sources are not available, then vsperf will continue with test execution,
264 but testpmd can't be used as a guest loopback. This is useful in case, that other guest
265 loopback applications (e.g. buildin or l2fwd) are used.
266
267 Note: In case of RHEL 7.3 OS usage, binary package configuration is required
268 for Vanilla OVS tests. With the installation of a supported rpm for OVS there is
269 a section in the ``conf\10_custom.conf`` file that can be used.
270
271 .. _configuration-of-traffic-dictionary:
272
273 Configuration of TRAFFIC dictionary
274 -----------------------------------
275
276 TRAFFIC dictionary is used for configuration of traffic generator. Default values
277 can be found in configuration file ``conf/03_traffic.conf``. These default values
278 can be modified by (first option has the highest priorty):
279
280     1. ``Parameters`` section of testcase definition
281     2. command line options specified by ``--test-params`` argument
282     3. custom configuration file
283
284 It is to note, that in case of option 1 and 2, it is possible to specify only
285 values, which should be changed. In case of custom configuration file, it is
286 required to specify whole ``TRAFFIC`` dictionary with its all values or explicitly
287 call and update() method of ``TRAFFIC`` dictionary.
288
289 Detailed description of ``TRAFFIC`` dictionary items follows:
290
291 .. code-block:: console
292
293     'traffic_type'  - One of the supported traffic types.
294                       E.g. rfc2544_throughput, rfc2544_back2back
295                       or rfc2544_continuous
296                       Data type: str
297                       Default value: "rfc2544_throughput".
298     'bidir'         - Specifies if generated traffic will be full-duplex (True)
299                       or half-duplex (False)
300                       Data type: str
301                       Supported values: "True", "False"
302                       Default value: "False".
303     'frame_rate'    - Defines desired percentage of frame rate used during
304                       continuous stream tests.
305                       Data type: int
306                       Default value: 100.
307     'multistream'   - Defines number of flows simulated by traffic generator.
308                       Value 0 disables multistream feature
309                       Data type: int
310                       Supported values: 0-65536 for 'L4' stream type
311                                         unlimited for 'L2' and 'L3' stream types
312                       Default value: 0.
313     'stream_type'   - Stream type is an extension of the "multistream" feature.
314                       If multistream is disabled, then stream type will be
315                       ignored. Stream type defines ISO OSI network layer used
316                       for simulation of multiple streams.
317                       Data type: str
318                       Supported values:
319                          "L2" - iteration of destination MAC address
320                          "L3" - iteration of destination IP address
321                          "L4" - iteration of destination port
322                                 of selected transport protocol
323                       Default value: "L4".
324     'pre_installed_flows'
325                    -  Pre-installed flows is an extension of the "multistream"
326                       feature. If enabled, it will implicitly insert a flow
327                       for each stream. If multistream is disabled, then
328                       pre-installed flows will be ignored.
329                       Note: It is supported only for p2p deployment scenario.
330                       Data type: str
331                       Supported values:
332                          "Yes" - flows will be inserted into OVS
333                          "No"  - flows won't be inserted into OVS
334                       Default value: "No".
335     'flow_type'     - Defines flows complexity.
336                       Data type: str
337                       Supported values:
338                          "port" - flow is defined by ingress ports
339                          "IP"   - flow is defined by ingress ports
340                                   and src and dst IP addresses
341                       Default value: "port"
342     'flow_control'  - Controls flow control support by traffic generator.
343                       Supported values:
344                          False  - flow control is disabled
345                          True   - flow control is enabled
346                       Default value: False
347                       Note: Currently it is supported by IxNet only
348     'learning_frames' - Controls learning frames support by traffic generator.
349                       Supported values:
350                          False  - learning frames are disabled
351                          True   - learning frames are enabled
352                       Default value: True
353                       Note: Currently it is supported by IxNet only
354     'l2'            - A dictionary with l2 network layer details. Supported
355                       values are:
356         'srcmac'    - Specifies source MAC address filled by traffic generator.
357                       NOTE: It can be modified by vsperf in some scenarios.
358                       Data type: str
359                       Default value: "00:00:00:00:00:00".
360         'dstmac'    - Specifies destination MAC address filled by traffic generator.
361                       NOTE: It can be modified by vsperf in some scenarios.
362                       Data type: str
363                       Default value: "00:00:00:00:00:00".
364         'framesize' - Specifies default frame size. This value should not be
365                       changed directly. It will be overridden during testcase
366                       execution by values specified by list TRAFFICGEN_PKT_SIZES.
367                       Data type: int
368                       Default value: 64
369     'l3'            - A dictionary with l3 network layer details. Supported
370                       values are:
371         'enabled'   - Specifies if l3 layer should be enabled or disabled.
372                       Data type: bool
373                       Default value: True
374                       NOTE: Supported only by IxNet trafficgen class
375         'srcip'     - Specifies source MAC address filled by traffic generator.
376                       NOTE: It can be modified by vsperf in some scenarios.
377                       Data type: str
378                       Default value: "1.1.1.1".
379         'dstip'     - Specifies destination MAC address filled by traffic generator.
380                       NOTE: It can be modified by vsperf in some scenarios.
381                       Data type: str
382                       Default value: "90.90.90.90".
383         'proto'     - Specifies deflaut protocol type.
384                       Please check particular traffic generator implementation
385                       for supported protocol types.
386                       Data type: str
387                       Default value: "udp".
388     'l4'            - A dictionary with l4 network layer details. Supported
389                       values are:
390         'enabled'   - Specifies if l4 layer should be enabled or disabled.
391                       Data type: bool
392                       Default value: True
393                       NOTE: Supported only by IxNet trafficgen class
394         'srcport'   - Specifies source port of selected transport protocol.
395                       NOTE: It can be modified by vsperf in some scenarios.
396                       Data type: int
397                       Default value: 3000
398         'dstport'   - Specifies destination port of selected transport protocol.
399                       NOTE: It can be modified by vsperf in some scenarios.
400                       Data type: int
401                       Default value: 3001
402     'vlan'          - A dictionary with vlan encapsulation details. Supported
403                       values are:
404         'enabled'   - Specifies if vlan encapsulation should be enabled or
405                       disabled.
406                       Data type: bool
407                       Default value: False
408         'id'        - Specifies vlan id.
409                       Data type: int (NOTE: must fit to 12 bits)
410                       Default value: 0
411         'priority'  - Specifies a vlan priority (PCP header field).
412                       Data type: int (NOTE: must fit to 3 bits)
413                       Default value: 0
414         'cfi'       - Specifies if frames can or cannot be dropped during
415                       congestion (DEI header field).
416                       Data type: int (NOTE: must fit to 1 bit)
417                       Default value: 0
418
419 .. _configuration-of-guest-options:
420
421 Configuration of GUEST options
422 ------------------------------
423
424 VSPERF is able to setup scenarios involving a number of VMs in series or in parallel.
425 All configuration options related to a particular VM instance are defined as
426 lists and prefixed with ``GUEST_`` label. It is essential, that there is enough
427 items in all ``GUEST_`` options to cover all VM instances involved in the test.
428 In case there is not enough items, then VSPERF will use the first item of
429 particular ``GUEST_`` option to expand the list to required length.
430
431 Example of option expansion for 4 VMs:
432
433     .. code-block:: python
434
435        """
436        Original values:
437        """
438        GUEST_SMP = ['2']
439        GUEST_MEMORY = ['2048', '4096']
440
441        """
442        Values after automatic expansion:
443        """
444        GUEST_SMP = ['2', '2', '2', '2']
445        GUEST_MEMORY = ['2048', '4096', '2048', '2048']
446
447
448 First option can contain macros starting with ``#`` to generate VM specific values.
449 These macros can be used only for options of ``list`` or ``str`` types with ``GUEST_``
450 prefix.
451
452 Example of macros and their expansion for 2 VMs:
453
454     .. code-block:: python
455
456        """
457        Original values:
458        """
459        GUEST_SHARE_DIR = ['/tmp/qemu#VMINDEX_share']
460        GUEST_BRIDGE_IP = ['#IP(1.1.1.5)/16']
461
462        """
463        Values after automatic expansion:
464        """
465        GUEST_SHARE_DIR = ['/tmp/qemu0_share', '/tmp/qemu1_share']
466        GUEST_BRIDGE_IP = ['1.1.1.5/16', '1.1.1.6/16']
467
468 Additional examples are available at ``04_vnf.conf``.
469
470 Note: In  case, that macro is detected in the first item of the list, then
471 all other items are ignored and list content is created automatically.
472
473 Multiple macros can be used inside one configuration option definition, but macros
474 cannot be used inside other macros. The only exception is macro ``#VMINDEX``, which
475 is expanded first and thus it can be used inside other macros.
476
477 Following macros are supported:
478
479   * ``#VMINDEX`` - it is replaced by index of VM being executed; This macro
480     is expanded first, so it can be used inside other macros.
481
482     Example:
483
484     .. code-block:: python
485
486        GUEST_SHARE_DIR = ['/tmp/qemu#VMINDEX_share']
487
488   * ``#MAC(mac_address[, step])`` - it will iterate given ``mac_address``
489     with optional ``step``. In case that step is not defined, then it is set to 1.
490     It means, that first VM will use the value of ``mac_address``, second VM
491     value of ``mac_address`` increased by ``step``, etc.
492
493     Example:
494
495     .. code-block:: python
496
497        GUEST_NICS = [[{'mac' : '#MAC(00:00:00:00:00:01,2)'}]]
498
499   * ``#IP(ip_address[, step])`` - it will iterate given ``ip_address``
500     with optional ``step``. In case that step is not defined, then it is set to 1.
501     It means, that first VM will use the value of ``ip_address``, second VM
502     value of ``ip_address`` increased by ``step``, etc.
503
504     Example:
505
506     .. code-block:: python
507
508        GUEST_BRIDGE_IP = ['#IP(1.1.1.5)/16']
509
510   * ``#EVAL(expression)`` - it will evaluate given ``expression`` as python code;
511     Only simple expressions should be used. Call of the functions is not supported.
512
513     Example:
514
515     .. code-block:: python
516
517        GUEST_CORE_BINDING = [('#EVAL(6+2*#VMINDEX)', '#EVAL(7+2*#VMINDEX)')]
518
519 Other Configuration
520 -------------------
521
522 ``conf.settings`` also loads configuration from the command line and from the environment.
523
524 .. _pxp-deployment:
525
526 PXP Deployment
527 ==============
528
529 Every testcase uses one of the supported deployment scenarios to setup test environment.
530 The controller responsible for a given scenario configures flows in the vswitch to route
531 traffic among physical interfaces connected to the traffic generator and virtual
532 machines. VSPERF supports several deployments including PXP deployment, which can
533 setup various scenarios with multiple VMs.
534
535 These scenarios are realized by VswitchControllerPXP class, which can configure and
536 execute given number of VMs in serial or parallel configurations. Every VM can be
537 configured with just one or an even number of interfaces. In case that VM has more than
538 2 interfaces, then traffic is properly routed among pairs of interfaces.
539
540 Example of traffic routing for VM with 4 NICs in serial configuration:
541
542 .. code-block:: console
543
544                  +------------------------------------------+
545                  |  VM with 4 NICs                          |
546                  |  +---------------+    +---------------+  |
547                  |  |  Application  |    |  Application  |  |
548                  |  +---------------+    +---------------+  |
549                  |      ^       |            ^       |      |
550                  |      |       v            |       v      |
551                  |  +---------------+    +---------------+  |
552                  |  | logical ports |    | logical ports |  |
553                  |  |   0       1   |    |   2       3   |  |
554                  +--+---------------+----+---------------+--+
555                         ^       :            ^       :
556                         |       |            |       |
557                         :       v            :       v
558         +-----------+---------------+----+---------------+----------+
559         | vSwitch   |   0       1   |    |   2       3   |          |
560         |           | logical ports |    | logical ports |          |
561         | previous  +---------------+    +---------------+   next   |
562         | VM or PHY     ^       |            ^       |     VM or PHY|
563         |   port   -----+       +------------+       +--->   port   |
564         +-----------------------------------------------------------+
565
566 It is also possible to define different number of interfaces for each VM to better
567 simulate real scenarios.
568
569 Example of traffic routing for 2 VMs in serial configuration, where 1st VM has
570 4 NICs and 2nd VM 2 NICs:
571
572 .. code-block:: console
573
574            +------------------------------------------+  +---------------------+
575            |  1st VM with 4 NICs                      |  |  2nd VM with 2 NICs |
576            |  +---------------+    +---------------+  |  |  +---------------+  |
577            |  |  Application  |    |  Application  |  |  |  |  Application  |  |
578            |  +---------------+    +---------------+  |  |  +---------------+  |
579            |      ^       |            ^       |      |  |      ^       |      |
580            |      |       v            |       v      |  |      |       v      |
581            |  +---------------+    +---------------+  |  |  +---------------+  |
582            |  | logical ports |    | logical ports |  |  |  | logical ports |  |
583            |  |   0       1   |    |   2       3   |  |  |  |   0       1   |  |
584            +--+---------------+----+---------------+--+  +--+---------------+--+
585                   ^       :            ^       :               ^       :
586                   |       |            |       |               |       |
587                   :       v            :       v               :       v
588   +-----------+---------------+----+---------------+-------+---------------+----------+
589   | vSwitch   |   0       1   |    |   2       3   |       |   4       5   |          |
590   |           | logical ports |    | logical ports |       | logical ports |          |
591   | previous  +---------------+    +---------------+       +---------------+   next   |
592   | VM or PHY     ^       |            ^       |               ^       |     VM or PHY|
593   |   port   -----+       +------------+       +---------------+       +---->  port   |
594   +-----------------------------------------------------------------------------------+
595
596 The number of VMs involved in the test and the type of their connection is defined
597 by deployment name as follows:
598
599   * ``pvvp[number]`` - configures scenario with VMs connected in series with
600     optional ``number`` of VMs. In case that ``number`` is not specified, then
601     2 VMs will be used.
602
603     Example of 2 VMs in a serial configuration:
604
605     .. code-block:: console
606
607        +----------------------+  +----------------------+
608        |   1st VM             |  |   2nd VM             |
609        |   +---------------+  |  |   +---------------+  |
610        |   |  Application  |  |  |   |  Application  |  |
611        |   +---------------+  |  |   +---------------+  |
612        |       ^       |      |  |       ^       |      |
613        |       |       v      |  |       |       v      |
614        |   +---------------+  |  |   +---------------+  |
615        |   | logical ports |  |  |   | logical ports |  |
616        |   |   0       1   |  |  |   |   0       1   |  |
617        +---+---------------+--+  +---+---------------+--+
618                ^       :                 ^       :
619                |       |                 |       |
620                :       v                 :       v
621        +---+---------------+---------+---------------+--+
622        |   |   0       1   |         |   3       4   |  |
623        |   | logical ports | vSwitch | logical ports |  |
624        |   +---------------+         +---------------+  |
625        |       ^       |                 ^       |      |
626        |       |       +-----------------+       v      |
627        |   +----------------------------------------+   |
628        |   |              physical ports            |   |
629        |   |      0                         1       |   |
630        +---+----------------------------------------+---+
631                   ^                         :
632                   |                         |
633                   :                         v
634        +------------------------------------------------+
635        |                                                |
636        |                traffic generator               |
637        |                                                |
638        +------------------------------------------------+
639
640   * ``pvpv[number]`` - configures scenario with VMs connected in parallel with
641     optional ``number`` of VMs. In case that ``number`` is not specified, then
642     2 VMs will be used. Multistream feature is used to route traffic to particular
643     VMs (or NIC pairs of every VM). It means, that VSPERF will enable multistream
644     feature and sets the number of streams to the number of VMs and their NIC
645     pairs. Traffic will be dispatched based on Stream Type, i.e. by UDP port,
646     IP address or MAC address.
647
648     Example of 2 VMs in a parallel configuration, where traffic is dispatched
649         based on the UDP port.
650
651     .. code-block:: console
652
653        +----------------------+  +----------------------+
654        |   1st VM             |  |   2nd VM             |
655        |   +---------------+  |  |   +---------------+  |
656        |   |  Application  |  |  |   |  Application  |  |
657        |   +---------------+  |  |   +---------------+  |
658        |       ^       |      |  |       ^       |      |
659        |       |       v      |  |       |       v      |
660        |   +---------------+  |  |   +---------------+  |
661        |   | logical ports |  |  |   | logical ports |  |
662        |   |   0       1   |  |  |   |   0       1   |  |
663        +---+---------------+--+  +---+---------------+--+
664                ^       :                 ^       :
665                |       |                 |       |
666                :       v                 :       v
667        +---+---------------+---------+---------------+--+
668        |   |   0       1   |         |   3       4   |  |
669        |   | logical ports | vSwitch | logical ports |  |
670        |   +---------------+         +---------------+  |
671        |      ^         |                 ^       :     |
672        |      |     ......................:       :     |
673        |  UDP | UDP :   |                         :     |
674        |  port| port:   +--------------------+    :     |
675        |   0  |  1  :                        |    :     |
676        |      |     :                        v    v     |
677        |   +----------------------------------------+   |
678        |   |              physical ports            |   |
679        |   |    0                               1   |   |
680        +---+----------------------------------------+---+
681                 ^                               :
682                 |                               |
683                 :                               v
684        +------------------------------------------------+
685        |                                                |
686        |                traffic generator               |
687        |                                                |
688        +------------------------------------------------+
689
690
691 PXP deployment is backward compatible with PVP deployment, where ``pvp`` is
692 an alias for ``pvvp1`` and it executes just one VM.
693
694 The number of interfaces used by VMs is defined by configuration option
695 ``GUEST_NICS_NR``. In case that more than one pair of interfaces is defined
696 for VM, then:
697
698     * for ``pvvp`` (serial) scenario every NIC pair is connected in serial
699       before connection to next VM is created
700     * for ``pvpv`` (parallel) scenario every NIC pair is directly connected
701       to the physical ports and unique traffic stream is assigned to it
702
703 Examples:
704
705     * Deployment ``pvvp10`` will start 10 VMs and connects them in series
706     * Deployment ``pvpv4`` will start 4 VMs and connects them in parallel
707     * Deployment ``pvpv1`` and GUEST_NICS_NR = [4] will start 1 VM with
708       4 interfaces and every NIC pair is directly connected to the
709       physical ports
710     * Deployment ``pvvp`` and GUEST_NICS_NR = [2, 4] will start 2 VMs;
711       1st VM will have 2 interfaces and 2nd VM 4 interfaces. These interfaces
712       will be connected in serial, i.e. traffic will flow as follows:
713       PHY1 -> VM1_1 -> VM1_2 -> VM2_1 -> VM2_2 -> VM2_3 -> VM2_4 -> PHY2
714
715 Note: In case that only 1 or more than 2 NICs are configured for VM,
716 then ``testpmd`` should be used as forwarding application inside the VM.
717 As it is able to forward traffic between multiple VM NIC pairs.
718
719 Note: In case of ``linux_bridge``, all NICs are connected to the same
720 bridge inside the VM.
721
722 VM, vSwitch, Traffic Generator Independence
723 ===========================================
724
725 VSPERF supports different VSwitches, Traffic Generators, VNFs
726 and Forwarding Applications by using standard object-oriented polymorphism:
727
728   * Support for vSwitches is implemented by a class inheriting from IVSwitch.
729   * Support for Traffic Generators is implemented by a class inheriting from
730     ITrafficGenerator.
731   * Support for VNF is implemented by a class inheriting from IVNF.
732   * Support for Forwarding Applications is implemented by a class inheriting
733     from IPktFwd.
734
735 By dealing only with the abstract interfaces the core framework can support
736 many implementations of different vSwitches, Traffic Generators, VNFs
737 and Forwarding Applications.
738
739 IVSwitch
740 --------
741
742 .. code-block:: python
743
744     class IVSwitch:
745       start(self)
746       stop(self)
747       add_switch(switch_name)
748       del_switch(switch_name)
749       add_phy_port(switch_name)
750       add_vport(switch_name)
751       get_ports(switch_name)
752       del_port(switch_name, port_name)
753       add_flow(switch_name, flow)
754       del_flow(switch_name, flow=None)
755
756 ITrafficGenerator
757 -----------------
758
759 .. code-block:: python
760
761     class ITrafficGenerator:
762       connect()
763       disconnect()
764
765       send_burst_traffic(traffic, numpkts, time, framerate)
766
767       send_cont_traffic(traffic, time, framerate)
768       start_cont_traffic(traffic, time, framerate)
769       stop_cont_traffic(self):
770
771       send_rfc2544_throughput(traffic, tests, duration, lossrate)
772       start_rfc2544_throughput(traffic, tests, duration, lossrate)
773       wait_rfc2544_throughput(self)
774
775       send_rfc2544_back2back(traffic, tests, duration, lossrate)
776       start_rfc2544_back2back(traffic, , tests, duration, lossrate)
777       wait_rfc2544_back2back()
778
779 Note ``send_xxx()`` blocks whereas ``start_xxx()`` does not and must be followed by a subsequent call to ``wait_xxx()``.
780
781 IVnf
782 ----
783
784 .. code-block:: python
785
786     class IVnf:
787       start(memory, cpus,
788             monitor_path, shared_path_host,
789             shared_path_guest, guest_prompt)
790       stop()
791       execute(command)
792       wait(guest_prompt)
793       execute_and_wait (command)
794
795 IPktFwd
796 --------
797
798   .. code-block:: python
799
800     class IPktFwd:
801         start()
802         stop()
803
804
805 Controllers
806 -----------
807
808 Controllers are used in conjunction with abstract interfaces as way
809 of decoupling the control of vSwtiches, VNFs, TrafficGenerators
810 and Forwarding Applications from other components.
811
812 The controlled classes provide basic primitive operations. The Controllers
813 sequence and co-ordinate these primitive operation in to useful actions. For
814 instance the vswitch_controller_p2p can be used to bring any vSwitch (that
815 implements the primitives defined in IVSwitch) into the configuration required
816 by the Phy-to-Phy  Deployment Scenario.
817
818 In order to support a new vSwitch only a new implementation of IVSwitch needs
819 be created for the new vSwitch to be capable of fulfilling all the Deployment
820 Scenarios provided for by existing or future vSwitch Controllers.
821
822 Similarly if a new Deployment Scenario is required it only needs to be written
823 once as a new vSwitch Controller and it will immediately be capable of
824 controlling all existing and future vSwitches in to that Deployment Scenario.
825
826 Similarly the Traffic Controllers can be used to co-ordinate basic operations
827 provided by implementers of ITrafficGenerator to provide useful tests. Though
828 traffic generators generally already implement full test cases i.e. they both
829 generate suitable traffic and analyse returned traffic in order to implement a
830 test which has typically been predefined in an RFC document. However the
831 Traffic Controller class allows for the possibility of further enhancement -
832 such as iterating over tests for various packet sizes or creating new tests.
833
834 Traffic Controller's Role
835 -------------------------
836
837 .. image:: traffic_controller.png
838
839
840 Loader & Component Factory
841 --------------------------
842
843 The working of the Loader package (which is responsible for *finding* arbitrary
844 classes based on configuration data) and the Component Factory which is
845 responsible for *choosing* the correct class for a particular situation - e.g.
846 Deployment Scenario can be seen in this diagram.
847
848 .. image:: factory_and_loader.png
849
850 Routing Tables
851 ==============
852
853 Vsperf uses a standard set of routing tables in order to allow tests to easily
854 mix and match Deployment Scenarios (PVP, P2P topology), Tuple Matching and
855 Frame Modification requirements.
856
857 .. code-block:: console
858
859       +--------------+
860       |              |
861       | Table 0      |  table#0 - Match table. Flows designed to force 5 & 10
862       |              |  tuple matches go here.
863       |              |
864       +--------------+
865              |
866              |
867              v
868       +--------------+  table#1 - Routing table. Flow entries to forward
869       |              |  packets between ports goes here.
870       | Table 1      |  The chosen port is communicated to subsequent tables by
871       |              |  setting the metadata value to the egress port number.
872       |              |  Generally this table is set-up by by the
873       +--------------+  vSwitchController.
874              |
875              |
876              v
877       +--------------+  table#2 - Frame modification table. Frame modification
878       |              |  flow rules are isolated in this table so that they can
879       | Table 2      |  be turned on or off without affecting the routing or
880       |              |  tuple-matching flow rules. This allows the frame
881       |              |  modification and tuple matching required by the tests
882       |              |  in the VSWITCH PERFORMANCE FOR TELCO NFV test
883       +--------------+  specification to be independent of the Deployment
884              |          Scenario set up by the vSwitchController.
885              |
886              v
887       +--------------+
888       |              |
889       | Table 3      |  table#3 - Egress table. Egress packets on the ports
890       |              |  setup in Table 1.
891       +--------------+
892
893