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>`_

