Development Quickstart VOLTHA 2.x Build Setup.

These notes describe the checking out and building from the multiple gerrit repositories needed to run a VOLTHA 2.x environment with docker-compose. Starting point is a basic Ubuntu 16.04 or 18.04 installation with internet access.

These notes are intended for iterative development only. The testing environments and production environments will run a Kubernetes Helm based deployment.

Install prerequisites

Patch and updated

sudo apt update
sudo apt dist-upgrade

Add docker-ce apt repo and install docker and build tools

curl -fsSL | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] $(lsb_release -cs) stable"
sudo apt update
sudo apt install build-essential docker-ce git

Install current docker-compose. Older versions may cause docker build problems:

sudo curl -L "$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod 755 /usr/local/bin/docker-compose

Install the Golang ppa apt repository and install golang 1.13.

sudo add-apt-repository ppa:longsleep/golang-backports
sudo apt update
sudo apt install golang-1.13

Setup environment

Setup a local Golang and docker-compose environment, verifying the golang-1.13 binaries are in your path. Also add your local GOPATH bin folder to PATH Add export statements to your ~/.profile to persist.

mkdir $HOME/source
mkdir $HOME/go
export GO111MODULE=on
export GOPATH=$HOME/go
export DOCKER_TAG=latest
export PATH=$PATH:/usr/lib/go-1.13/bin:$GOPATH/bin
go version

Allow your current non-root user $USER docker system access

sudo usermod -a -G docker $USER

Logout/Login to assume new group membership needed for running docker as non-root user and verify any environment variables set in ~/.profile.

Checkout source and build images

VOLTHA 2.x Core Containers

Checkout needed source from gerrit. Build the voltha-rw-core docker image.

cd ~/source/
git clone
cd ~/source/voltha-go
make build

For more details regarding building and debugging the 2.x core outside of Docker refer to voltha-go

VOLTHA 2.x OpenOLT Container

Checkout needed source from gerrit. Build the voltha-openolt-adapter docker image.

cd ~/source/
git clone
cd ~/source/voltha-openolt-adapter/
make build

For more details regarding building and debugging the openolt adapter container refer to voltha-openolt-adapter

VOLTHA 2.x OpenONU Container

Checkout needed source from gerrit. Build the voltha-openonu-adapter docker image.

cd ~/source/
git clone
cd ~/source/voltha-openonu-adapter/
make build

VOLTHA 2.x OFAgent

Checkout needed source from gerrit. Build the voltha-ofagent docker image.

cd ~/source/
git clone
cd ~/source/ofagent-go/
make docker-build

ONOS Container with VOLTHA Compatible Apps

By default the standard ONOS docker image does not contain nor start any apps needed by VOLTHA. If you use the standard image then you need to use the ONOS restful API to load needed apps separately.

For development convenience there is an ONOS docker image build that adds in the current compatible VOLTHA apps. Checkout and build the ONOS image with added ONOS apps (olt, aaa, sadis, dhcpl2relay, and kafka).

cd ~/source/
git clone
cd ~/source/voltha-onos
make build

Install voltctl VOLTHA Command Line Management Tool

A working Golang build environment is required as voltctl is build and run directly from the host. Build the voltctl executable and install in ~/go/bin which should already be in your $PATH

cd ~/source/
git clone
cd ~/source/voltctl
make build
make install

Configure the voltctl environment configuration files ~/.volt/config and ~/.volt/command_options to point at the local voltha-rw-core instance that will be running.

mkdir ~/.volt/

cat << EOF > ~/.volt/config
apiVersion: v2
server: localhost:50057
  useTls: false
  caCert: ""
  cert: ""
  key: ""
  verify: ""
  timeout: 10s

cat << EOF > ~/.volt/command_options
  format: table{{.Id}}\t{{.Type}}\t{{.Root}}\t{{.ParentId}}\t{{.SerialNumber}}\t{{.Address}}\t{{.AdminState}}\t{{.OperStatus}}\t{{.ConnectStatus}}\t{{.Reason}}
  order: -Root,SerialNumber

  order: PortNo

  order: Priority,EthType

  order: RootDeviceId,DataPathId

  order: Id

  order: Priority,EthType

  order: Id

  order: Component,Name,Id

  order: ComponentName,PackageName,Level

  order: ComponentName,PackageName,Level

Install VOLTHA bbsim olt/onu Simulator (Optional)

If you do not have physical OLT/ONU hardware you can build a simulator.

cd ~/source/
git clone
cd ~/source/bbsim
make docker-build



Run the combined docker-compose yaml configuration file that starts the core, its dependent systems (etcd, zookeeper, and kafka) and the openonu and openolt adapters. Export the DOCKER_HOST_IP environment variable to your non-localhost IP address needed for inter-container communication. This can be the IP assigned to eth0 or the docker0 bridge (typically

For convenience you can also export DOCKER_TAG to signify the docker images tag you would like to use. Though for typical development you may have to edit compose/system-test.yml to override the specific docker image DOCKER_TAG needed. The DOCKER_REGISTRY and DOCKER_REPOSITORY variables are not needed unless you wish to override the docker image path. See the system-test.yml file for details on the docker image path creation string.

export DOCKER_TAG=latest

cd ~/source/voltha-go
docker-compose -f compose/system-test.yml up -d

WARNING: The DOCKER_REGISTRY variable is not set. Defaulting to a blank string.
WARNING: The DOCKER_REPOSITORY variable is not set. Defaulting to a blank string.
Creating network "compose_default" with driver "bridge"
Pulling zookeeper (wurstmeister/zookeeper:latest)...
latest: Pulling from wurstmeister/zookeeper
a3ed95caeb02: Pull complete
ef38b711a50f: Pull complete
e057c74597c7: Pull complete
666c214f6385: Pull complete
c3d6a96f1ffc: Pull complete
3fe26a83e0ca: Pull complete
3d3a7dd3a3b1: Pull complete
f8cc938abe5f: Pull complete
9978b75f7a58: Pull complete
4d4dbcc8f8cc: Pull complete
8b130a9baa49: Pull complete
6b9611650a73: Pull complete
5df5aac51927: Pull complete
76eea4448d9b: Pull complete
8b66990876c6: Pull complete
f0dd38204b6f: Pull complete
Digest: sha256:7a7fd44a72104bfbd24a77844bad5fabc86485b036f988ea927d1780782a6680
Status: Downloaded newer image for wurstmeister/zookeeper:latest
Pulling kafka (wurstmeister/kafka:2.11-2.0.1)...
2.11-2.0.1: Pulling from wurstmeister/kafka
4fe2ade4980c: Pull complete
6fc58a8d4ae4: Pull complete
819f4a45746c: Pull complete
a3133bc2e3e5: Pull complete
72f0dc369677: Pull complete
1e1130fc942d: Pull complete
Digest: sha256:20d08a6849383b124bccbe58bc9c48ec202eefb373d05e0a11e186459b84f2a0
Status: Downloaded newer image for wurstmeister/kafka:2.11-2.0.1
Pulling etcd (
v3.2.9: Pulling from coreos/etcd
88286f41530e: Pull complete
2fa4a2c3ffb5: Pull complete
539b8e6ccce1: Pull complete
79e70e608afa: Pull complete
f1bf8f503bff: Pull complete
c4abfc27d146: Pull complete
Digest: sha256:1913dd980d55490fa50640bbef0f4540d124e5c66d6db271b0b4456e9370a272
Status: Downloaded newer image for
Creating compose_kafka_1           ... done
Creating compose_cli_1             ... done
Creating compose_adapter_openolt_1 ... done
Creating compose_rw_core_1         ... done
Creating compose_adapter_openonu_1 ... done
Creating compose_etcd_1            ... done
Creating compose_onos_1            ... done
Creating compose_ofagent_1         ... done
Creating compose_zookeeper_1       ... done

Verify containers have continuous uptime and no restarts

$ docker-compose -f compose/system-test.yml ps
WARNING: The DOCKER_REGISTRY variable is not set. Defaulting to a blank string.
WARNING: The DOCKER_REPOSITORY variable is not set. Defaulting to a blank string.
          Name                         Command               State                                             Ports                                            
compose_adapter_openolt_1   /app/openolt --kafka_adapt ...   Up>50062/tcp                                                                   
compose_adapter_openonu_1   /voltha/adapters/brcm_open ...   Up                                                                                                 
compose_etcd_1              etcd --name=etcd0 --advert ...   Up>2379/tcp,>2380/tcp,>4001/tcp                   
compose_kafka_1                      Up>9092/tcp                                                                     
compose_ofagent_1           /app/ofagent --controller= ...   Up                                                                                                 
compose_onos_1              ./bin/onos-service server        Up      6640/tcp,>6653/tcp,>8101/tcp,>8181/tcp, 9876/tcp 
compose_rw_core_1           /app/rw_core -kv_store_typ ...   Up>50057/tcp                                                                   
compose_zookeeper_1         /bin/sh -c /usr/sbin/sshd  ...   Up>2181/tcp, 22/tcp, 2888/tcp, 3888/tcp
$ docker ps
CONTAINER ID        IMAGE                           COMMAND                  CREATED             STATUS              PORTS                                                                                        NAMES
08a0e7a1ee5c        voltha-openolt-adapter:latest   "/app/openolt --kafk…"   31 seconds ago      Up 27 seconds>50062/tcp                                                                     compose_adapter_openolt_1
1f364cf7912d        wurstmeister/zookeeper:latest   "/bin/sh -c '/usr/sb…"   31 seconds ago      Up 27 seconds       22/tcp, 2888/tcp, 3888/tcp,>2181/tcp                                           compose_zookeeper_1
ab1822baed41        wurstmeister/kafka:2.11-2.0.1   ""         31 seconds ago      Up 24 seconds>9092/tcp                                                                       compose_kafka_1
22a4fe4b2eb4        voltha-ofagent-go:latest        "/app/ofagent --cont…"   31 seconds ago      Up 23 seconds                                                                                                    compose_ofagent_1
d34e1c976db5        voltha-rw-core:latest           "/app/rw_core -kv_st…"   31 seconds ago      Up 26 seconds>50057/tcp                                                                     compose_rw_core_1
f6ef52975dc0        voltha-openonu-adapter:latest   "/voltha/adapters/br…"   31 seconds ago      Up 29 seconds                                                                                                    compose_adapter_openonu_1
7ce8bcf7436c        voltha-onos:latest              "./bin/onos-service …"   31 seconds ago      Up 25 seconds>6653/tcp,>8101/tcp, 6640/tcp, 9876/tcp,>8181/tcp   compose_onos_1
60ac172726f5      "etcd --name=etcd0 -…"   31 seconds ago      Up 28 seconds>2379/tcp,>2380/tcp,>4001/tcp                     compose_etcd_1

Verify Cluster Communication

Use voltctl commands to verify core and adapters are running.

voltctl adapter list
ID                   VENDOR            VERSION      SINCELASTCOMMUNICATION
brcm_openomci_onu    VOLTHA OpenONU    2.3.2-dev    UNKNOWN
openolt              VOLTHA OpenOLT    2.3.5-dev    UNKNOWN

List "devices" to verify no devices exist.

voltctl device list

At this point create/preprovision and enable an olt device and add flows via onos and ofagent.

Physical OLT/ONU Testing with Passing Traffic

Start a physical OLT and ONU. Tested with Edgecore OLT, Broadcom based ONU, and RG capable of EAPoL. Create/Preprovision the OLT and enable. The create command returns the device ID needed for enable and subsequent commands.

Add device to VOLTHA

voltctl device create -t openolt -H

voltctl device enable db87c4b48843bb99567d3d94

Verify device state

voltctl device list
ID                          TYPE                 ROOT     PARENTID                    SERIALNUMBER    ADDRESS             ADMINSTATE    OPERSTATUS    CONNECTSTATUS    REASON
db87c4b48843bb99567d3d94    openolt              true     a82bb53678ae                EC1721000221    ENABLED       ACTIVE        REACHABLE        
082d7c2e628325ccc3336275    brcm_openomci_onu    false    db87c4b48843bb99567d3d94    ALPHe3d1cf57    unknown             ENABLED       ACTIVE        REACHABLE        omci-flows-pushed
voltctl device port list db87c4b48843bb99567d3d94
1048576      nni-1048576      ETHERNET_NNI    ENABLED       ACTIVE                    []
536870912    pon-536870912    PON_OLT         ENABLED       ACTIVE                    [{082d7c2e628325ccc3336275 536870912}]
536870913    pon-536870913    PON_OLT         ENABLED       ACTIVE                    []
536870914    pon-536870914    PON_OLT         ENABLED       ACTIVE                    []
536870915    pon-536870915    PON_OLT         ENABLED       ACTIVE                    []
536870916    pon-536870916    PON_OLT         ENABLED       ACTIVE                    []
536870917    pon-536870917    PON_OLT         ENABLED       ACTIVE                    []
536870918    pon-536870918    PON_OLT         ENABLED       ACTIVE                    []
536870919    pon-536870919    PON_OLT         ENABLED       ACTIVE                    []
536870920    pon-536870920    PON_OLT         ENABLED       ACTIVE                    []
536870921    pon-536870921    PON_OLT         ENABLED       ACTIVE                    []
536870922    pon-536870922    PON_OLT         ENABLED       ACTIVE                    []
536870923    pon-536870923    PON_OLT         ENABLED       ACTIVE                    []
536870924    pon-536870924    PON_OLT         ENABLED       ACTIVE                    []
536870925    pon-536870925    PON_OLT         ENABLED       ACTIVE                    []
536870926    pon-536870926    PON_OLT         ENABLED       ACTIVE                    []
536870927    pon-536870927    PON_OLT         ENABLED       ACTIVE                    []
voltctl device port list 082d7c2e628325ccc3336275
16           uni-16      ETHERNET_UNI    ENABLED       ACTIVE                    []
17           uni-17      ETHERNET_UNI    ENABLED       DISCOVERED                []
18           uni-18      ETHERNET_UNI    ENABLED       DISCOVERED                []
19           uni-19      ETHERNET_UNI    ENABLED       DISCOVERED                []
20           uni-20      ETHERNET_UNI    ENABLED       DISCOVERED                []
536870912    PON port    PON_ONU         ENABLED       ACTIVE                    [{db87c4b48843bb99567d3d94 536870912}]

Verify ONOS device state and eventual EAPoL authentication. ONOS default Username is karaf, Password is karaf

ssh -p 8101 karaf@localhost

Display the device and ports discovered

karaf@root > ports

id=of:0000a82bb53678ae, available=true, local-status=connected 4m27s ago, role=MASTER, type=SWITCH, mfr=VOLTHA Project, hw=open_pon, sw=open_pon, serial=EC1721000221, chassis=a82bb53678ae, driver=voltha, channelId=, managementAddress=, protocol=OF_13
  port=16, state=enabled, type=fiber, speed=0 , adminState=enabled, portMac=08:00:00:00:00:10, portName=ALPHe3d1cf57-1
  port=17, state=disabled, type=fiber, speed=0 , adminState=enabled, portMac=08:00:00:00:00:11, portName=ALPHe3d1cf57-2
  port=18, state=disabled, type=fiber, speed=0 , adminState=enabled, portMac=08:00:00:00:00:12, portName=ALPHe3d1cf57-3
  port=19, state=disabled, type=fiber, speed=0 , adminState=enabled, portMac=08:00:00:00:00:13, portName=ALPHe3d1cf57-4
  port=20, state=disabled, type=fiber, speed=0 , adminState=enabled, portMac=08:00:00:00:00:14, portName=ALPHe3d1cf57-5
  port=1048576, state=enabled, type=fiber, speed=0 , adminState=enabled, portMac=a8:2b:b5:36:78:ae, portName=nni-1048576

EAPoL may take up to 30 seconds to complete.

karaf@root > aaa-users

of:0000a82bb53678ae/16: AUTHORIZED_STATE, last-changed=4m22s ago, mac=94:CC:B9:DA:AB:D1, subid=PON 1/1/3/1:2.1.1, username=94:CC:B9:DA:AB:D1

Provision subscriber flows

karaf@root > volt-add-subscriber-access of:0000a82bb53678ae 16

karaf@root > volt-programmed-subscribers

location=of:0000a82bb53678ae/16 tagInformation=UniTagInformation{uniTagMatch=0, ponCTag=20, ponSTag=11, usPonCTagPriority=-1, usPonSTagPriority=-1, dsPonCTagPriority=-1, dsPonSTagPriority=-1, technologyProfileId=64, enableMacLearning=false, upstreamBandwidthProfile='Default', downstreamBandwidthProfile='Default', serviceName='', configuredMacAddress='A4:23:05:00:00:00', isDhcpRequired=true, isIgmpRequired=false}

After about 30 seconds the RG should attempt DHCP which should be visible in onos. At this point the RG should be able to pass database traffic via the ONU/OLT.

karaf@root > dhcpl2relay-allocations

SubscriberId=ALPHe3d1cf57-1,ConnectPoint=of:0000a82bb53678ae/16,State=DHCPREQUEST,MAC=94:CC:B9:DA:AB:D1,CircuitId=PON 1/1/3/1:2.1.1,IP Allocated=,Allocation Timestamp=2020-02-17T15:34:31.572746Z

BBSIM Simulated OLT/ONU Testing Control Plane Traffic

If you do not have physical OLT/ONU hardware you can start VOLTHA containers and the bbsim olt/onu hardware simulator using a different docker-compose yaml file. Verify containers are running as above with the addition of the bbsim and radius server containers.

export DOCKER_TAG=latest

cd ~/source/voltha-go
docker-compose -f compose/system-test-bbsim.yml up -d

Create/Preprovision and enable similarly to the physical OLT above, providing the local bbsim IP and listening port

voltctl device create -t openolt -H

voltctl device enable ece94c86e93c6e06dd0a544b

Proceed with the verification and ONOS provisioning commands similar to the physical OLT described above.