Moving docs to rst

Change-Id: I7f054b5afbe6021c03bbce04cce4938d5fba425c
diff --git a/docs/.gitignore b/docs/.gitignore
new file mode 100644
index 0000000..2fbfb8c
--- /dev/null
+++ b/docs/.gitignore
@@ -0,0 +1,2 @@
+build
+doc_venv
\ No newline at end of file
diff --git a/docs/Makefile b/docs/Makefile
new file mode 100644
index 0000000..379e0e2
--- /dev/null
+++ b/docs/Makefile
@@ -0,0 +1,25 @@
+# Minimal makefile for Sphinx documentation
+#
+
+# You can set these variables from the command line.
+SPHINXOPTS    =
+SPHINXBUILD   = sphinx-build
+SOURCEDIR     = source
+BUILDDIR      = build
+
+# Put it first so that "make" without argument is like "make help".
+help:
+	@$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
+
+.PHONY: help Makefile
+
+doc_venv:
+	virtualenv doc_venv ;\
+	source ./doc_venv/bin/activate ;\
+	pip install livereload ;\
+	pip install -r requirements.txt
+
+# Catch-all target: route all unknown targets to Sphinx using the new
+# "make mode" option.  $(O) is meant as a shortcut for $(SPHINXOPTS).
+%: Makefile
+	@$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
\ No newline at end of file
diff --git a/docs/README.md b/docs/README.md
deleted file mode 100644
index 6aed37b..0000000
--- a/docs/README.md
+++ /dev/null
@@ -1,5 +0,0 @@
-# BBSim Documentation
-
-- [ONU State Machine](./onu-state-machine.md)
-- [Using development dependencies](./development-dependencies.md)
-- [BBR](./bbr.md)
\ No newline at end of file
diff --git a/docs/__init__.py b/docs/__init__.py
new file mode 100644
index 0000000..f99c2ea
--- /dev/null
+++ b/docs/__init__.py
@@ -0,0 +1,13 @@
+# Copyright 2018-present Open Networking Foundation
+
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+
+# http://www.apache.org/licenses/LICENSE-2.0
+
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
\ No newline at end of file
diff --git a/docs/bbr.md b/docs/bbr.md
deleted file mode 100644
index 359d106..0000000
--- a/docs/bbr.md
+++ /dev/null
@@ -1,66 +0,0 @@
-# BBR
-
-BBR (a.k.a BBSim Reflector) is a tool designed to scale test BBSim.
-It is responsible to emulate ONOS and VOLTHA in order to quickly reply
-to any message that BBSim sends.
-
-Here is a graph of the measuraments of BBSim performance captured over
-10 runs with different PON Layout
-
-![BBSim Performances](./assets/bbr_runs.png "BBSim Performances") 
-
-
-## Run BBR
-
-To run `bbr` you need to have a `bbsim` instance running.
-
-You can start `bbsim` locally with:
-
-```bash
-$ DOCKER_RUN_ARGS="-onu 16 -pon 4" make docker-run
-```
-
-Once `bbsim` is up and running you'll see this on the console:
-
-```bash
-docker run -p 50070:50070 -p 50060:50060 --privileged --rm --name bbsim """"bbsim:0.0.2-dev /app/bbsim -onu 16 -pon 4
-time="2019-10-18T00:24:46Z" level=info msg="BroadBand Simulator is on" NumNniPerOlt=1 NumOnuPerPon=16 NumPonPerOlt=4 OltID=0
-time="2019-10-18T00:24:46Z" level=debug msg=CreateOLT ID=0 NumNni=1 NumOnuPerPon=16 NumPon=4 module=OLT
-time="2019-10-18T00:24:46Z" level=info msg="Successfully activated DHCP Server" module=NNI
-time="2019-10-18T00:24:46Z" level=debug msg="Created OLT with id: 0"
-time="2019-10-18T00:24:46Z" level=debug msg="Started APIService"
-time="2019-10-18T00:24:46Z" level=debug msg="APIServer Listening on: 0.0.0.0:50070"
-time="2019-10-18T00:24:46Z" level=debug msg="OLT Listening on: 0.0.0.0:50060" module=OLT
-```
-
-At this point you can start `bbr` (note that you need to pass the same number of ONUs and PON Ports to the two processes):
-
-```bash
-$ ./bbr -onu 16 -pon 4
-```
-
-`bbr` will run to completion and output the time it took to bring all the ONUs to the `dhcp_ack` state.
-If the `bbr` process doesn't exit, it means something went wrong.
-
-## Debugging and issue reporting
-
-If you are experiencing issues with `bbr` please capture:
-- `bbr` logs
-- `bbsim` logs
-- `bbsimctl onu list` output
-
-You can use these commands to capture `bbsim` and `bbr` logs during execution:
-
-```bash
-$ DOCKER_RUN_ARGS="-onu 16 -pon 4" make docker-run 2>&1 | tee bbsim.logs
-```
-
-```bash
-$ ./bbr -onu 16 -pon 4 2>&1 | tee bbr.logs
-```
-
-And this command to retrieve the list of onus in the system (run this command once `bbr` is hanging but before terminating `bbsim`):
-
-```bash
-docker exec bbsim bbsimctl onu list > onu.list
-```
\ No newline at end of file
diff --git a/docs/development-dependencies.md b/docs/development-dependencies.md
deleted file mode 100644
index fa1a474..0000000
--- a/docs/development-dependencies.md
+++ /dev/null
@@ -1,21 +0,0 @@
-# Development dependencies
-
-To use a patched version of the `omci-sim` library:
-
-```bash
-make dep
-cd vendor/github.com/opencord/
-rm -rf omci-sim/
-git clone https://gerrit.opencord.org/omci-sim
-cd omci-sim
-```
-
-Once done, go to `gerrit.opencord.org` and locate the patch you want to get. Click on the download URL and copy the `Checkout` command.
-
-It should look something like:
-
-```
-git fetch ssh://teone@gerrit.opencord.org:29418/omci-sim refs/changes/67/15067/1 && git checkout FETCH_HEAD
-```
-
-Then just execute that command in the `omci-sim` folder inside the vendored dependencies.
\ No newline at end of file
diff --git a/docs/onu-state-machine.md b/docs/onu-state-machine.md
deleted file mode 100644
index 6155ecf..0000000
--- a/docs/onu-state-machine.md
+++ /dev/null
@@ -1,31 +0,0 @@
-# ONU State Machine
-
-In `BBSim` the device state is createdtained using a state machine library: [fsm](https://github.com/looplab/fsm).
-
-Here is a list of possible state transitions in BBSim:
-
-|Transition|Starting States|End State| Notes |
-| --- | --- | --- | --- |
-| - | - | created |
-| discover | created | discovered |
-| enable | discovered, disabled | enabled |
-| receive_eapol_flow | enabled, gem_port_added | eapol_flow_received |
-| add_gem_port | enabled, eapol_flow_received | gem_port_added | We need to wait for both the flow and the gem port to come before moving to `auth_started` |
-| start_auth | eapol_flow_received, gem_port_added | auth_started |
-| eap_start_sent | auth_started | eap_start_sent |
-| eap_response_identity_sent | eap_start_sent | eap_response_identity_sent |
-| eap_response_challenge_sent | eap_response_identity_sent | eap_response_challenge_sent |
-| eap_response_success_received | eap_response_challenge_sent | eap_response_success_received |
-| auth_failed | auth_started, eap_start_sent, eap_response_identity_sent, eap_response_challenge_sent | auth_failed |
-| start_dhcp | eap_response_success_received | dhcp_started |
-| dhcp_discovery_sent | dhcp_started | dhcp_discovery_sent |
-| dhcp_request_sent | dhcp_discovery_sent | dhcp_request_sent |
-| dhcp_ack_received | dhcp_request_sent | dhcp_ack_received |
-| dhcp_failed | dhcp_started, dhcp_discovery_sent, dhcp_request_sent | dhcp_failed |
-
-
-In addition some transition can be forced via the API:
-
-|Transition|Starting States|End State| Notes |
-| --- | --- | --- | --- |
-| disable | eap_response_success_received, auth_failed, dhcp_ack_received, dhcp_failed | disabled | Emulates a devide mulfunction. Sends a `DyingGaspInd` and then an `OnuIndication{OperState: 'down'}`|
\ No newline at end of file
diff --git a/docs/requirements.txt b/docs/requirements.txt
new file mode 100644
index 0000000..3496da1
--- /dev/null
+++ b/docs/requirements.txt
@@ -0,0 +1,14 @@
+Sphinx~=1.8.5
+actdiag~=0.5.4
+blockdiag~=1.5.4
+livereload~=2.6.1
+nwdiag~=1.0.4
+recommonmark~=0.6.0
+rstcheck~=3.3.1
+seqdiag~=0.9.6
+sphinx-reload~=0.2.0
+sphinx-rtd-theme~=0.4.3
+sphinxcontrib-actdiag~=0.8.5
+sphinxcontrib-blockdiag~=1.5.5
+sphinxcontrib-nwdiag~=0.9.5
+sphinxcontrib-seqdiag~=0.8.5
\ No newline at end of file
diff --git a/docs/source/__init__.py b/docs/source/__init__.py
new file mode 100644
index 0000000..f99c2ea
--- /dev/null
+++ b/docs/source/__init__.py
@@ -0,0 +1,13 @@
+# Copyright 2018-present Open Networking Foundation
+
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+
+# http://www.apache.org/licenses/LICENSE-2.0
+
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
\ No newline at end of file
diff --git a/docs/assets/bbr_runs.png b/docs/source/_static/bbr_runs.png
similarity index 100%
rename from docs/assets/bbr_runs.png
rename to docs/source/_static/bbr_runs.png
Binary files differ
diff --git a/docs/source/bbr.rst b/docs/source/bbr.rst
new file mode 100644
index 0000000..f62a3d7
--- /dev/null
+++ b/docs/source/bbr.rst
@@ -0,0 +1,75 @@
+.. _BBSim Reflector:
+
+BBSim Reflector
+===============
+
+BBR (a.k.a BBSim Reflector) is a tool designed to scale test BBSim. It
+is responsible to emulate ONOS and VOLTHA in order to quickly reply to
+any message that BBSim sends.
+
+Here is a graph of the measuraments of BBSim performance captured over
+10 runs with different PON Layout
+
+.. figure:: ./_static/bbr_runs.png
+   :alt: BBSim Performances
+
+   BBSim Performances
+
+Run BBR
+-------
+
+To run ``bbr`` you need to have a ``bbsim`` instance running.
+
+You can start ``bbsim`` locally with:
+
+.. code:: bash
+
+   $ DOCKER_RUN_ARGS="-onu 16 -pon 4" make docker-run
+
+Once ``bbsim`` is up and running you’ll see this on the console:
+
+.. code:: bash
+
+   docker run -p 50070:50070 -p 50060:50060 --privileged --rm --name bbsim """"bbsim:0.0.2-dev /app/bbsim -onu 16 -pon 4
+   time="2019-10-18T00:24:46Z" level=info msg="BroadBand Simulator is on" NumNniPerOlt=1 NumOnuPerPon=16 NumPonPerOlt=4 OltID=0
+   time="2019-10-18T00:24:46Z" level=debug msg=CreateOLT ID=0 NumNni=1 NumOnuPerPon=16 NumPon=4 module=OLT
+   time="2019-10-18T00:24:46Z" level=info msg="Successfully activated DHCP Server" module=NNI
+   time="2019-10-18T00:24:46Z" level=debug msg="Created OLT with id: 0"
+   time="2019-10-18T00:24:46Z" level=debug msg="Started APIService"
+   time="2019-10-18T00:24:46Z" level=debug msg="APIServer Listening on: 0.0.0.0:50070"
+   time="2019-10-18T00:24:46Z" level=debug msg="OLT Listening on: 0.0.0.0:50060" module=OLT
+
+At this point you can start ``bbr`` (note that you need to pass the same
+number of ONUs and PON Ports to the two processes):
+
+.. code:: bash
+
+   $ ./bbr -onu 16 -pon 4
+
+``bbr`` will run to completion and output the time it took to bring all
+the ONUs to the ``dhcp_ack`` state. If the ``bbr`` process doesn’t exit,
+it means something went wrong.
+
+Debugging and issue reporting
+-----------------------------
+
+If you are experiencing issues with ``bbr`` please capture: - ``bbr``
+logs - ``bbsim`` logs - ``bbsimctl onu list`` output
+
+You can use these commands to capture ``bbsim`` and ``bbr`` logs during
+execution:
+
+.. code:: bash
+
+   $ DOCKER_RUN_ARGS="-onu 16 -pon 4" make docker-run 2>&1 | tee bbsim.logs
+
+.. code:: bash
+
+   $ ./bbr -onu 16 -pon 4 2>&1 | tee bbr.logs
+
+And this command to retrieve the list of onus in the system (run this
+command once ``bbr`` is hanging but before terminating ``bbsim``):
+
+.. code:: bash
+
+   docker exec bbsim bbsimctl onu list > onu.list
diff --git a/docs/source/bbsimctl.rst b/docs/source/bbsimctl.rst
new file mode 100644
index 0000000..ea7b344
--- /dev/null
+++ b/docs/source/bbsimctl.rst
@@ -0,0 +1,87 @@
+.. _BBSimCtl:
+
+BBSimCtl
+========
+
+BBSim comes with a gRPC interface to control the internal state. This
+interface can be queried using `bbsimctl` (the tool can be build with
+`make build` and it's available inside the `bbsim` container):
+
+.. code:: bash
+
+    $ ./bbsimctl --help
+    Usage:
+      bbsimctl [OPTIONS] <command>
+
+    Global Options:
+      -c, --config=FILE           Location of client config file [$BBSIMCTL_CONFIG]
+      -s, --server=SERVER:PORT    IP/Host and port of XOS
+      -d, --debug                 Enable debug mode
+
+    Help Options:
+      -h, --help                  Show this help message
+
+    Available commands:
+      completion  generate shell compleition
+      config      generate bbsimctl configuration
+      log         set bbsim log level
+      olt         OLT Commands
+      onu         ONU Commands
+
+``bbsimctl`` can be configured via a config file such as:
+
+.. code:: bash
+
+    $ cat ~/.bbsim/config
+    apiVersion: v1
+    server: 127.0.0.1:50070
+    grpc:
+      timeout: 10s
+
+Example commands
+----------------
+
+.. code:: bash
+
+    $ ./bbsimctl olt get
+    ID    SERIALNUMBER    OPERSTATE    INTERNALSTATE
+    0     BBSIM_OLT_0     up           enabled
+
+
+    $ ./bbsimctl olt pons
+    PON Ports for : BBSIM_OLT_0
+
+    ID    OPERSTATE
+    0     up
+    1     up
+    2     up
+    3     up
+
+
+    $ ./bbsimctl onu list
+    PONPORTID    ID    SERIALNUMBER    STAG    CTAG    OPERSTATE    INTERNALSTATE
+    0            1     BBSM00000001    900     900     up           eap_response_identity_sent
+    0            2     BBSM00000002    900     901     up           eap_start_sent
+    0            3     BBSM00000003    900     902     up           auth_failed
+    0            4     BBSM00000004    900     903     up           auth_failed
+    1            1     BBSM00000101    900     904     up           eap_response_success_received
+    1            2     BBSM00000102    900     905     up           eap_response_success_received
+    1            3     BBSM00000103    900     906     up           eap_response_challenge_sent
+    1            4     BBSM00000104    900     907     up           auth_failed
+    2            1     BBSM00000201    900     908     up           auth_failed
+    2            2     BBSM00000202    900     909     up           eap_start_sent
+    2            3     BBSM00000203    900     910     up           eap_response_identity_sent
+    2            4     BBSM00000204    900     911     up           eap_start_sent
+    3            1     BBSM00000301    900     912     up           eap_response_identity_sent
+    3            2     BBSM00000302    900     913     up           auth_failed
+    3            3     BBSM00000303    900     914     up           auth_failed
+    3            4     BBSM00000304    900     915     up           auth_failed
+
+Autocomplete
+------------
+
+``bbsimctl`` comes with autocomplete, just run:
+
+.. code:: bash
+
+    source <(bbsimctl completion bash)
diff --git a/docs/source/conf.py b/docs/source/conf.py
new file mode 100644
index 0000000..0a9ac82
--- /dev/null
+++ b/docs/source/conf.py
@@ -0,0 +1,188 @@
+# Copyright 2018-present Open Networking Foundation
+
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+
+# http://www.apache.org/licenses/LICENSE-2.0
+
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# -*- coding: utf-8 -*-
+#
+# Configuration file for the Sphinx documentation builder.
+#
+# This file does only contain a selection of the most common options. For a
+# full list see the documentation:
+# http://www.sphinx-doc.org/en/master/config
+
+# -- Path setup --------------------------------------------------------------
+
+# If extensions (or modules to document with autodoc) are in another directory,
+# add these directories to sys.path here. If the directory is relative to the
+# documentation root, use os.path.abspath to make it absolute, like shown here.
+#
+# import os
+# import sys
+# sys.path.insert(0, os.path.abspath('.'))
+
+
+# -- Project information -----------------------------------------------------
+
+project = u'BBSim'
+copyright = u'2019, Open Networking Foundation'
+author = u'Open Networking Foundation'
+
+# The short X.Y version
+version = u''
+# The full version, including alpha/beta/rc tags
+release = u''
+
+
+# -- General configuration ---------------------------------------------------
+
+# If your documentation needs a minimal Sphinx version, state it here.
+#
+# needs_sphinx = '1.0'
+
+# Add any Sphinx extension module names here, as strings. They can be
+# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
+# ones.
+extensions = [
+    'sphinx.ext.graphviz'
+]
+
+# Add any paths that contain templates here, relative to this directory.
+templates_path = ['_templates']
+
+# The suffix(es) of source filenames.
+# You can specify multiple suffix as a list of string:
+#
+# source_suffix = ['.rst', '.md']
+source_suffix = '.rst'
+
+# The master toctree document.
+master_doc = 'index'
+
+# The language for content autogenerated by Sphinx. Refer to documentation
+# for a list of supported languages.
+#
+# This is also used if you do content translation via gettext catalogs.
+# Usually you set "language" from the command line for these cases.
+language = None
+
+# List of patterns, relative to source directory, that match files and
+# directories to ignore when looking for source files.
+# This pattern also affects html_static_path and html_extra_path.
+exclude_patterns = []
+
+# The name of the Pygments (syntax highlighting) style to use.
+pygments_style = None
+
+
+# -- Options for HTML output -------------------------------------------------
+
+# The theme to use for HTML and HTML Help pages.  See the documentation for
+# a list of builtin themes.
+#
+html_theme = 'alabaster'
+
+# Theme options are theme-specific and customize the look and feel of a theme
+# further.  For a list of options available for each theme, see the
+# documentation.
+#
+# html_theme_options = {}
+
+# Add any paths that contain custom static files (such as style sheets) here,
+# relative to this directory. They are copied after the builtin static files,
+# so a file named "default.css" will overwrite the builtin "default.css".
+html_static_path = ['_static']
+
+# Custom sidebar templates, must be a dictionary that maps document names
+# to template names.
+#
+# The default sidebars (for documents that don't match any pattern) are
+# defined by theme itself.  Builtin themes are using these templates by
+# default: ``['localtoc.html', 'relations.html', 'sourcelink.html',
+# 'searchbox.html']``.
+#
+# html_sidebars = {}
+
+
+# -- Options for HTMLHelp output ---------------------------------------------
+
+# Output file base name for HTML help builder.
+htmlhelp_basename = 'BBSimdoc'
+
+
+# -- Options for LaTeX output ------------------------------------------------
+
+latex_elements = {
+    # The paper size ('letterpaper' or 'a4paper').
+    #
+    # 'papersize': 'letterpaper',
+
+    # The font size ('10pt', '11pt' or '12pt').
+    #
+    # 'pointsize': '10pt',
+
+    # Additional stuff for the LaTeX preamble.
+    #
+    # 'preamble': '',
+
+    # Latex figure (float) alignment
+    #
+    # 'figure_align': 'htbp',
+}
+
+# Grouping the document tree into LaTeX files. List of tuples
+# (source start file, target name, title,
+#  author, documentclass [howto, manual, or own class]).
+latex_documents = [
+    (master_doc, 'BBSim.tex', u'BBSim Documentation',
+     u'Open Networking Foundation', 'manual'),
+]
+
+
+# -- Options for manual page output ------------------------------------------
+
+# One entry per manual page. List of tuples
+# (source start file, name, description, authors, manual section).
+man_pages = [
+    (master_doc, 'bbsim', u'BBSim Documentation',
+     [author], 1)
+]
+
+
+# -- Options for Texinfo output ----------------------------------------------
+
+# Grouping the document tree into Texinfo files. List of tuples
+# (source start file, target name, title, author,
+#  dir menu entry, description, category)
+texinfo_documents = [
+    (master_doc, 'BBSim', u'BBSim Documentation',
+     author, 'BBSim', 'One line description of project.',
+     'Miscellaneous'),
+]
+
+
+# -- Options for Epub output -------------------------------------------------
+
+# Bibliographic Dublin Core info.
+epub_title = project
+
+# The unique identifier of the text. This can be a ISBN number
+# or the project homepage.
+#
+# epub_identifier = ''
+
+# A unique identification for the text.
+#
+# epub_uid = ''
+
+# A list of files that should not be packed into the epub file.
+epub_exclude_files = ['search.html']
diff --git a/docs/source/development-dependencies.rst b/docs/source/development-dependencies.rst
new file mode 100644
index 0000000..0a5e2ac
--- /dev/null
+++ b/docs/source/development-dependencies.rst
@@ -0,0 +1,26 @@
+.. _Development dependencies:
+
+Development dependencies
+========================
+
+To use a patched version of the ``omci-sim`` library:
+
+.. code:: bash
+
+   make dep
+   cd vendor/github.com/opencord/
+   rm -rf omci-sim/
+   git clone https://gerrit.opencord.org/omci-sim
+   cd omci-sim
+
+Once done, go to ``gerrit.opencord.org`` and locate the patch you want
+to get. Click on the download URL and copy the ``Checkout`` command.
+
+It should look something like:
+
+::
+
+   git fetch ssh://teone@gerrit.opencord.org:29418/omci-sim refs/changes/67/15067/1 && git checkout FETCH_HEAD
+
+Then just execute that command in the ``omci-sim`` folder inside the
+vendored dependencies.
diff --git a/docs/source/index.rst b/docs/source/index.rst
new file mode 100644
index 0000000..5aabec3
--- /dev/null
+++ b/docs/source/index.rst
@@ -0,0 +1,67 @@
+.. BBSim documentation master file, created by
+   sphinx-quickstart on Fri Oct 25 12:03:42 2019.
+   You can adapt this file completely to your liking, but it should at least
+   contain the root `toctree` directive.
+
+Welcome to BBSim's documentation!
+=================================
+
+.. toctree::
+   :maxdepth: 2
+   :caption: Contents:
+
+   onu-state-machine.rst
+   development-dependencies.rst
+   bbr.rst
+   bbsimctl.rst
+
+
+Quickstart
+----------
+
+BBSim (a.k.a. BroadBand Simulator) is a tool designed to emulate an `Openolt <https://github.com/opencord/openolt>`_
+compatible device.
+
+In order to use BBSim you need to have:
+
+- a Kubernetes cluster
+- helm
+- a working installation of VOLTHA
+
+We strongly recommend the utilization of `kind-voltha <https://github.com/ciena/kind-voltha>`_ to setup such environment.
+
+Installation
+------------
+
+Once VOLTHA is up and running, you can deploy BBSim with this command:
+
+.. code:: bash
+
+    helm install -n bbsim cord/bbsim
+
+The BBSim installation can be customized to emulate multiple ONUs and multiple PON Ports:
+
+.. code:: bash
+
+    helm install -n bbsim cord/bbsim --set onu=8 --set pon=2
+
+Once BBSim is installed you can verify that it's running with:
+
+.. code:: bash
+
+    kubectl logs -n voltha -f $(kubectl get pods -n voltha | grep bbsim | awk '{print $1}')
+
+Provision a BBSim OLT in VOLTHA
+-------------------------------
+
+Create the device:
+
+.. code:: bash
+
+    voltctl device create -t openolt -H $(kubectl get -n voltha service/bbsim -o go-template='{{.spec.clusterIP}}'):50060
+
+Enable the device:
+
+.. code:: bash
+
+    voltctl device enable $(voltctl device list --filter Type~openolt -q)
diff --git a/docs/source/onu-state-machine.rst b/docs/source/onu-state-machine.rst
new file mode 100644
index 0000000..9df3ca6
--- /dev/null
+++ b/docs/source/onu-state-machine.rst
@@ -0,0 +1,113 @@
+.. _ONU State Machine:
+
+ONU State Machine
+=================
+
+In ``BBSim`` the device state is createdtained using a state machine
+library: `fsm <https://github.com/looplab/fsm>`__.
+
+Here is a list of possible state transitions in BBSim:
+
++--------------------------------+----------------------------------------------------------------------------------------+--------------------------------+-----------------------------------------------------------------------------------------------+
+| Transition                     | Starting States                                                                        | End State                      | Notes                                                                                         |
++================================+========================================================================================+================================+===============================================================================================+
+|                                |                                                                                        | created                        |                                                                                               |
++--------------------------------+----------------------------------------------------------------------------------------+--------------------------------+-----------------------------------------------------------------------------------------------+
+| discover                       | created                                                                                | discovered                     |                                                                                               |
++--------------------------------+----------------------------------------------------------------------------------------+--------------------------------+-----------------------------------------------------------------------------------------------+
+| enable                         | discovered, disabled                                                                   | enabled                        |                                                                                               |
++--------------------------------+----------------------------------------------------------------------------------------+--------------------------------+-----------------------------------------------------------------------------------------------+
+| receive_eapol_flow             | enabled, gem_port_added                                                                | eapol_flow_received            |                                                                                               |
++--------------------------------+----------------------------------------------------------------------------------------+--------------------------------+-----------------------------------------------------------------------------------------------+
+| add_gem_port                   | enabled, eapol_flow_received                                                           | gem_port_added                 | We need to wait for both the flow and the gem port to come before moving to ``auth_started``  |
++--------------------------------+----------------------------------------------------------------------------------------+--------------------------------+-----------------------------------------------------------------------------------------------+
+| start_auth                     | eapol_flow_received, gem_port_added                                                    | auth_started                   |                                                                                               |
++--------------------------------+----------------------------------------------------------------------------------------+--------------------------------+-----------------------------------------------------------------------------------------------+
+| eap_start_sent                 | auth_started                                                                           | eap_start_sent                 |                                                                                               |
++--------------------------------+----------------------------------------------------------------------------------------+--------------------------------+-----------------------------------------------------------------------------------------------+
+| eap_response_identity_sent     | eap_start_sent                                                                         | eap_response_identity_sent     |                                                                                               |
++--------------------------------+----------------------------------------------------------------------------------------+--------------------------------+-----------------------------------------------------------------------------------------------+
+| eap_response_challenge_sent    | eap_response_identity_sent                                                             | eap_response_challenge_sent    |                                                                                               |
++--------------------------------+----------------------------------------------------------------------------------------+--------------------------------+-----------------------------------------------------------------------------------------------+
+| eap_response_success_received  | eap_response_challenge_sent                                                            | eap_response_success_received  |                                                                                               |
++--------------------------------+----------------------------------------------------------------------------------------+--------------------------------+-----------------------------------------------------------------------------------------------+
+| auth_failed                    | auth_started, eap_start_sent, eap_response_identity_sent, eap_response_challenge_sent  | auth_failed                    |                                                                                               |
++--------------------------------+----------------------------------------------------------------------------------------+--------------------------------+-----------------------------------------------------------------------------------------------+
+| start_dhcp                     | eap_response_success_received                                                          | dhcp_started                   |                                                                                               |
++--------------------------------+----------------------------------------------------------------------------------------+--------------------------------+-----------------------------------------------------------------------------------------------+
+| dhcp_discovery_sent            | dhcp_started                                                                           | dhcp_discovery_sent            |                                                                                               |
++--------------------------------+----------------------------------------------------------------------------------------+--------------------------------+-----------------------------------------------------------------------------------------------+
+| dhcp_request_sent              | dhcp_discovery_sent                                                                    | dhcp_request_sent              |                                                                                               |
++--------------------------------+----------------------------------------------------------------------------------------+--------------------------------+-----------------------------------------------------------------------------------------------+
+| dhcp_ack_received              | dhcp_request_sent                                                                      | dhcp_ack_received              |                                                                                               |
++--------------------------------+----------------------------------------------------------------------------------------+--------------------------------+-----------------------------------------------------------------------------------------------+
+| dhcp_failed                    | dhcp_started, dhcp_discovery_sent, dhcp_request_sent                                   | dhcp_failed                    |                                                                                               |
++--------------------------------+----------------------------------------------------------------------------------------+--------------------------------+-----------------------------------------------------------------------------------------------+
+
+In addition some transition can be forced via the API:
+
++---------------------+----------------------------------------------------------------------------+-----------+---------------------------------------------------------------------------------------------------------+
+| End StateTransition | Starting States                                                            | End State | Notes                                                                                                   |
++=====================+============================================================================+===========+=========================================================================================================+
+| disable             | eap_response_success_received, auth_failed, dhcp_ack_received, dhcp_failed | disabled  | Emulates a devide mulfunction. Sends a ``DyingGaspInd`` and then an ``OnuIndication{OperState: 'down'}``|
++---------------------+----------------------------------------------------------------------------+-----------+---------------------------------------------------------------------------------------------------------+
+
+Below is a diagram of the state machine:
+
+- In blue PON related states
+- In green EAPOL related states
+- In yellow DHCP related states
+- In purple operator driven states
+
+..
+  TODO Evaluate http://blockdiag.com/en/seqdiag/examples.html
+
+.. graphviz::
+
+    digraph {
+        graph [pad="1,1" bgcolor="#cccccc"]
+        node [style=filled]
+
+        created [fillcolor="#bee7fa"]
+        discovered [fillcolor="#bee7fa"]
+        enabled [fillcolor="#bee7fa"]
+        disabled [fillcolor="#f9d6ff"]
+        gem_port_added [fillcolor="#bee7fa"]
+
+        eapol_flow_received [fillcolor="#e6ffc2"]
+        auth_started [fillcolor="#e6ffc2"]
+        eap_start_sent [fillcolor="#e6ffc2"]
+        eap_response_identity_sent [fillcolor="#e6ffc2"]
+        eap_response_challenge_sent [fillcolor="#e6ffc2"]
+        eap_response_success_received [fillcolor="#e6ffc2"]
+        auth_failed [fillcolor="#e6ffc2"]
+
+        dhcp_started [fillcolor="#fffacc"]
+        dhcp_discovery_sent [fillcolor="#fffacc"]
+        dhcp_request_sent [fillcolor="#fffacc"]
+        dhcp_ack_received [fillcolor="#fffacc"]
+        dhcp_failed [fillcolor="#fffacc"]
+
+        created -> discovered -> enabled
+        enabled -> gem_port_added -> eapol_flow_received -> auth_started
+        enabled -> eapol_flow_received -> gem_port_added -> auth_started
+
+        auth_started -> eap_start_sent -> eap_response_identity_sent -> eap_response_challenge_sent -> eap_response_success_received
+        auth_started -> auth_failed
+        eap_start_sent -> auth_failed
+        eap_response_identity_sent -> auth_failed
+        eap_response_challenge_sent -> auth_failed
+
+        eap_response_success_received -> dhcp_started
+        dhcp_started -> dhcp_discovery_sent -> dhcp_request_sent -> dhcp_ack_received
+        dhcp_started -> dhcp_failed
+        dhcp_discovery_sent -> dhcp_failed
+        dhcp_request_sent -> dhcp_failed
+        dhcp_ack_received dhcp_failed
+
+        eap_response_success_received -> disabled
+        auth_failed -> disabled
+        dhcp_ack_received -> disabled
+        dhcp_failed -> disabled
+        disabled -> enabled
+    }
\ No newline at end of file