=================================
Product Certification with VOLTHA
=================================

.. attention::

    This page contains outdated information, as the ONF marketplace is no longer
    available.

VOLTHA is part of the `continuous certification program at ONF <https://opennetworking.org/continuous-certification-program/>`_.
You can see the currently certified products in the `ONF marketplace <https://opennetworking.org/marketplace/?_product_project=voltha>`_.

The following document describes the procedure to include and certify an
OLT or an ONU with VOLTHA.  The process of getting a product certified
consists of several phases:

- testing and validation with VOLTHA at the vendor premises
- showcase of successful integration with VOLTHA to the TST
- shipment and integration of the product (OLT/ONU) at a community lab
  (e.g. Berlin with DT)
- Creation of automated CI jobs in Jenkins that start nightly automation tests.
- Test maintenance. It's the Vendors and the VOLTHA community responsibility
  to maintain the created tests.

Finally a brief Description of the device and a point of contact need to
be sent to `Michelle Roth @ ONF <mroth@linuxfoundation.org>`_ to be
showcased in the `marketplace <https://opennetworking.org/marketplace/?_product_project=voltha>`_ after successful verification.

Once all these steps are completed the product will be certified for
the next release of VOLTHA.  Let's describe each phase in detail.

Vendor's premises Testing
-------------------------
The first step is for the vendor to guarantee that the OLT or the ONU are VOLTHA compatible is complying got ONF's
automated sanity test.
To do so we suggest setting up a HW test pod according as described in the `physical setup guide <https://docs.voltha.org/master/overview/lab_setup.html>`_.

Once the setup is running the next step is running the Sanity tests, as described in the `testing documentation <https://docs.voltha.org/master/voltha-system-tests/README.html#running-tests-on-physical-pod>`_.
If those pass the hardware is ready to be shown to the VOLTHA TST.

Showcase to VOLTHA TST
----------------------
Once the OLT has passed tests in the Vendor lab it's ready to be showcased to the VOLTHA Technical Steering Team.
The request needs to be performed to the Technical TST leader or to `Timon Sloane <timon@opennetworking.org>`_ who will
forward the request appropriately.
During a scheduled TST meeting (Tuesday 8 AM PST) the vendor will showcase the OLT/ONU to the TST by starting from a
fresh VOLTHA instance, connecting the OLT and then performing the Sanity test.
With the test passing the TST will give approval for shipment of the device (ONU/OLT) to an ONF community lab.

ONF's community lab integration
-------------------------------

Once the TST has given approval for device integration in VOLTHA nighly tests the Vendor needs to ship the device to
any one of the ONF community lab, including a wiring diagram (if needed) Currently there are two locations:

- DT Office in Berlin, Germany. Address: Winterfeldtstraße 21, 10781 Berlin, Germany. Point of contact `Bjoern Nagel @ DT <NagelB@telekom.de>`_

Once the OLT arrives the technicians will rack it and wire it according to
the diagram shared.  For an OLT the NNI connection will be provided to the
AGG switch and all the management will also be connected with management IP
assigned according to the network of the pod.

For an ONU it will be connected to one of the existing OLTs in the pod,
according to space, technology and topology requirements.  Once all the
racking and wiring is complete the device will appear under the ONF network,
accessible via VPN.

Automated CI Jobs
-----------------
Once the device in included in one of the community pods it's the responsibility of the vendor to integrate
it into the nightly VOLTHA tests. This process is done by submitting a series of patches to different repositories.
The process is different for ONUs and OLTs.
To create jenkins jobs see https://docs.voltha.org/master/testing/voltha_test_automation.html#hardware-or-physical-pod-jobs

OLT
+++
A new OLT needs a full new configuration, job and data.
The job can be created according to the desired workflow to be tested. Information can be found in the
`system tests information <https://docs.voltha.org/master/testing/voltha_test_automation.html#hardware-or-physical-pod-jobs>`_
The required patches are:

- ci-management. Creates the job that will run in jenkins. Job Example ``https://github.com/opencord/ci-management/blob/master/jjb/voltha-test/voltha-certification.yaml``
- pod configs. Inserts information about the OLT and target ONUs data. `Data example <https://github.com/opencord/pod-configs/blob/master/deployment-configs/menlo-certification-pod-radisys-1600g-DT.yaml>`_
  and `kubernetes example <https://github.com/opencord/pod-configs/blob/master/kubernetes-configs/menlo-certification-pod-radisys-1600g.conf>`_
- voltha-system-tests. Adds the sadis configuration for the OLT and the ONU. `Sadis Example <https://github.com/opencord/voltha-system-tests/blob/master/tests/data/menlo-certification-pod-radisys-1600g-sadis-DT.json>`_

Once these are created and merged the job will appear on jenkins and
run accordingly.

ONU
+++

A new ONU it's attached to an existing OLT, so just the information for
that ONU needs to be added to the proper OLT files.

The required patches are:

- pod configs. Inserts information about the ONU into an existing pod. `Info and Target example <https://github.com/opencord/pod-configs/blob/master/deployment-configs/menlo-certification-pod-radisys-1600g-DT.yaml>`_
- voltha-system-tests. Adds the sadis configuration for the ONU. Example `Sadis ONU example <https://github.com/opencord/voltha-system-tests/blob/master/tests/data/menlo-certification-pod-radisys-1600g-sadis-DT.json>`_

Job maintenance
---------------

It's the responsibility of the Vendor, the VOLTHA TST and the community at
large to mantain, manage and update the job to make sure the OLT gets
certified for each of the following VOLTHA releases.



ONF Contacts
------------
For any further information please contact:

- `Michelle Roth <mroth@opennetworking.org>`_
