Control Plane Testing
*********************

TestON Setup
============

Setup ONOS Cluster
------------------
Follow instructions in `Install ONOS Controller <../installation.html#install-controller-onos>`_ to setup and run ONOS cluster


Setup Mininet Environment
-------------------------
- Clone Mininet and run the install script

    .. code-block:: console

        $ cd ~
        $ git clone https://github.com/jhall11/mininet.git      # Clone the repository
        $ cd mininet
        $ git branch -v -a                                      # Show all the remote repositories
        $ git checkout -b dynamic_topo origin/dynamic_topo      # Checkout the dynamic_topo repository
        $ cd util
        $ sudo ./install.sh -3fvn                               # Install OpenFlow 1.3, Open Vswitch and Mininet dependencies

- Follow `Trellis in a Box <https://github.com/opennetworkinglab/routing/tree/master/trellis>`_ to install Trellis dependencies, such as DHCP server and Quagga.

    .. note::
        If DHCP server does not properly run because of a permission error, please see `this <https://help.ubuntu.com/community/    isc-dhcp-server#Permission_issues_with_ISC-DHCP_server>`_ to solve the problem.

- Set environment variables as described in `Create a Cell File <../installation.html#create-a-cell-file>`_


Setup Test Station
------------------
- Follow `TestON installation guide <https://wiki.onosproject.org/display/ONOS/Installation>`_ to install TestON
- (Optional) Add ``OnosSystemTest/TestON/bin`` to ``$PATH`` for convenience


Run Tests
=========

Before you run any test, it is recommended to run cleanup script to kill any TestON, ssh, and Mininet sessions that are running.

.. code-block:: console

    cd ~/OnosSystemTest/TestON/bin
    ./cleanup.sh

Fabric-related tests are located in ``OnosSystemTest/TestON/tests/USECASE/SegmentRouting/``.
Each individual test can be run by executing ``cli.py`` script with test name. For example:

.. code-block:: console

    cd ~/OnosSystemTest/TestON/bin
    ./cli.py run SRSanity


Test Plan
=========

Topology
--------
- 0x1 single ToR
- 0x2 dual-homed ToR
- 2x2 leaf-spine
- 2x4 leaf-spine with dual-homed ToR
- 2x3 leaf-spine with dual-homed ToR on one leaf
- 2x5 topology with spines S0 and S1, and leafs L0, L1, L2, L3, L4

  - L1+L2 and L3+L4 are paired switches.
  - All spine links with L1-4 are double links.
  - Hosts take ips with dhcp and there exist 2 external routers.
  - Hosts can use ipv4 or ipv6.
  - We configure untagged/tagged single/dual home hosts in order to test every possible combination.
  - Most of the hosts reside in different ip subnets.

Tests Steps
-----------
- Configure and install ONOS
- Start mininet and check flow state
- Test connectivity

  - pingall
  - (Optional) ``ping 10.0.99.2`` to check external IPv4 connectivity
  - (Optional) ``ping6 2000:9902`` to check external IPv6 connectivity
- Additional actions and tests defined in each individual test case


Test Cases
----------
.. csv-table::
   :file: ../tables/testing-plan.csv
   :widths: 1, 2, 6, 1, 1, 2, 1
   :header-rows: 1

Test Results
============
ONF runs all Mininet based Trellis tests nightly.
Test results are automatically published `here <https://wiki.onosproject.org/display/ONOS/1.12-Segment+Routing>`_