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