Merge "fixed typo"
diff --git a/SUMMARY.md b/SUMMARY.md
index 6c31ff3..99f6b55 100644
--- a/SUMMARY.md
+++ b/SUMMARY.md
@@ -110,7 +110,6 @@
* [Base OpenStack](charts/base-openstack.md)
* [OpenStack](prereqs/openstack-helm.md)
* [VTN Setup](prereqs/vtn-setup.md)
- * [R-CORD](charts/rcord.md)
* [M-CORD](charts/mcord.md)
* [XOSSH](charts/xossh.md)
* [Logging and Monitoring](charts/logging-monitoring.md)
@@ -119,4 +118,3 @@
* [PONNET](charts/ponnet.md)
* [PONSIM v2](charts/ponsimv2.md)
* [PONSIM Pod](charts/ponsim-pod.md)
-
diff --git a/charts/base-kubernetes.md b/charts/base-kubernetes.md
index efe12f9..b1baf59 100644
--- a/charts/base-kubernetes.md
+++ b/charts/base-kubernetes.md
@@ -2,9 +2,10 @@
This chart contains all the XOS services that interacts with Kubernetes.
-You can install it using:
+{% include "../partials/helm/add-cord-repo.md" %}
-```bash
-helm dep update xos-profiles/base-kubernetes
-helm install -n base-kubernetes xos-profiles/base-kubernetes/
-```
\ No newline at end of file
+You can then install it using:
+
+```shell
+helm install -n base-kubernetes cord/base-kubernetes
+```
diff --git a/charts/base-openstack.md b/charts/base-openstack.md
index b48eb96..b8e4d27 100644
--- a/charts/base-openstack.md
+++ b/charts/base-openstack.md
@@ -14,13 +14,12 @@
## Single-Node Configuration
-Here is an example of deploying the `xos-profiles/base-openstack` chart
-on a single-node OpenStack server set up by the
-`automation-tools/openstack-helm/openstack-helm-dev-setup.sh` script:
+Here is an example of deploying the *base-openstack* chart on a single-node OpenStack server set up by the *automation-tools/openstack-helm/openstack-helm-dev-setup.sh* script:
-```bash
-helm dep update xos-profiles/base-openstack
-helm install -n base-openstack xos-profiles/base-openstack \
+{% include "../partials/helm/add-cord-repo.md" %}
+
+```shell
+helm install -n base-openstack cord/base-openstack \
--set computeNodes.master.name=`hostname` \
--set vtn-service.sshUser=`whoami`
```
diff --git a/charts/bbsim.md b/charts/bbsim.md
index 74b75fa..07c6c69 100644
--- a/charts/bbsim.md
+++ b/charts/bbsim.md
@@ -1,10 +1,13 @@
# BBSim Helm Chart
This chart let you install the broadband simulator.
-Note that this chart depends on [kafka](kafka.md)
+
+>**Note:** this chart depends on [kafka](kafka.md).
+
+{% include "../partials/helm/add-cord-repo.md" %}
```shell
-helm install -n bbsim bbsim
+helm install -n bbsim cord/bbsim
```
## Set a different number of ONUs
@@ -12,7 +15,7 @@
You can configure the number of ONUs through a parameter in the installation:
```shell
-helm install -n bbsim bbsim --set onus_per_pon_port={number_of_onus}
+helm install -n bbsim cord/bbsim --set onus_per_pon_port={number_of_onus}
```
## Set a different mode
@@ -23,14 +26,14 @@
You can change the behaviour via:
```shell
-helm install -n bbsim bbsim --set emulation_mode="{both|aaa|default}"
+helm install -n bbsim cord/bbsim --set emulation_mode="{both|aaa|default}"
```
Where:
-- `both` stands for authentication and DHCP
-- `aaa` stands for authentication only
-- `default` will just activate the devices
+- *both* stands for authentication and DHCP
+- *aaa* stands for authentication only
+- *default* will just activate the devices
## Start BBSim without Kafka
@@ -41,7 +44,7 @@
with:
```shell
-helm install -n bbsim bbsim --set kafka_broker=""
+helm install -n bbsim cord/bbsim --set kafka_broker=""
```
## Provision the BBSim OLT in NEM
diff --git a/charts/kafka.md b/charts/kafka.md
index 26d4645..30d43ea 100644
--- a/charts/kafka.md
+++ b/charts/kafka.md
@@ -1,14 +1,14 @@
# Kafka Helm chart
-The `kafka` helm chart is not maintained by CORD,
-but it is available online at: <https://github.com/kubernetes/charts/tree/master/incubator/kafka>
+The *kafka* helm chart is not maintained by CORD, but it is available online at: <https://github.com/kubernetes/charts/tree/master/incubator/kafka>
-To install kafka using the `cord-kafka` name, run the following commands:
+To install kafka using the *cord-kafka* name, run the following commands:
```shell
helm repo add incubator http://storage.googleapis.com/kubernetes-charts-incubator
helm install -f examples/kafka-single.yaml --version 0.8.8 -n cord-kafka incubator/kafka
```
+
> NOTE: Historically there were two kafka busses deployed (another one named
> `voltha-kafka`) but these have been consolidated.
@@ -35,22 +35,24 @@
A few examples:
- List available topics:
- ```shell
- kafkacat -b cord-kafka -L
- ```
+
+```shell
+kafkacat -b cord-kafka -L
+```
- Listen for events on a particular topic:
- ```shell
- kafkacat -b cord-kafka -C -t <kafka-topic>
- ```
+
+```shell
+kafkacat -b cord-kafka -C -t <kafka-topic>
+```
- Some example topics to listen on:
- ```shell
- kafkacat -b cord-kafka -C -t xos.log.core
- kafkacat -b cord-kafka -C -t xos.gui_events
- kafkacat -b cord-kafka -C -t voltha.events
- kafkacat -b cord-kafka -C -t onu.events
- kafkacat -b cord-kafka -C -t authentication.events
- kafkacat -b cord-kafka -C -t dhcp.events
- ```
+```shell
+kafkacat -b cord-kafka -C -t xos.log.core
+kafkacat -b cord-kafka -C -t xos.gui_events
+kafkacat -b cord-kafka -C -t voltha.events
+kafkacat -b cord-kafka -C -t onu.events
+kafkacat -b cord-kafka -C -t authentication.events
+kafkacat -b cord-kafka -C -t dhcp.events
+```
diff --git a/charts/logging-monitoring.md b/charts/logging-monitoring.md
index 01dcfcb..a051500 100644
--- a/charts/logging-monitoring.md
+++ b/charts/logging-monitoring.md
@@ -7,12 +7,14 @@
functionality, `nem-monitoring` and `logging`. Both of these charts depend on
having [kafka](kafka.md) instances running in order to pass messages.
+## Add the cord repository
-## `nem-monitoring` charts
+{% include "../partials/helm/add-cord-repo.md" %}
+
+## nem-monitoring charts
```shell
-helm dep update nem-monitoring
-helm install -n nem-monitoring nem-monitoring
+helm install -n nem-monitoring cord/nem-monitoring
```
> NOTE: In order to display `voltha` kpis you need to have `voltha`
@@ -22,18 +24,17 @@
This chart exposes two dashboards:
-- [Grafana](http://docs.grafana.org/) on port `31300`
-- [Prometheus](https://prometheus.io/docs/) on port `31301`
+- [Grafana](http://docs.grafana.org/) on port *31300*
+- [Prometheus](https://prometheus.io/docs/) on port *31301*
-## `logging` charts
+## logging charts
```shell
-helm dep up logging
-helm install -n logging logging
+helm install -n logging cord/logging
```
For smaller developer/test environments without persistent storage, please use
-the `examples/logging-single.yaml` file to run the logging chart, which doesn't
+the *examples/logging-single.yaml* file to run the logging chart, which doesn't
create PVC's.
### Logging Dashboard
diff --git a/charts/mcord.md b/charts/mcord.md
index b7e6730..cec9fa6 100644
--- a/charts/mcord.md
+++ b/charts/mcord.md
@@ -1,12 +1,12 @@
# Deploy M-CORD Profile
-To deploy the M-CORD profile, run the following:
+{% include "../partials/helm/add-cord-repo.md" %}
+
+Then, to deploy the M-CORD profile, run the following:
```shell
-helm dep update xos-profiles/mcord
-helm install -n mcord xos-profiles/mcord --set proxySshUser=ubuntu
+helm install -n mcord cord/mcord --set proxySshUser=ubuntu
```
-The value of `proxySshUser` should be set to the user account corresponding
-to the public key added to the node when
-[prepping the nodes for VTN](../prereqs/vtn-setup.md).
+The value of *proxySshUser* should be set to the user account corresponding
+to the public key added to the node when [prepping the nodes for VTN](../prereqs/vtn-setup.md).
diff --git a/charts/onos.md b/charts/onos.md
index a398039..7d7c27c 100644
--- a/charts/onos.md
+++ b/charts/onos.md
@@ -1,9 +1,11 @@
-# Deploy ONOS
+# ONOS
-To install ONOS run:
+{% include "../partials/helm/add-cord-repo.md" %}
+
+Then, to install ONOS run:
```shell
-helm install -n onos
+helm install -n cord/onos
```
**Nodeports exposed**
@@ -26,7 +28,7 @@
## ONOS logging
-### `onos-log-agent` Sidecar container
+### onos-log-agent sidecar container
By default, the onos helm chart will run a sidecar container to ship logs using
[Filebeat](https://www.elastic.co/guide/en/beats/filebeat/current/index.html)
@@ -38,11 +40,15 @@
specify which container you want to interact with. For example, to view the
ONOS logs via kubectl, you would use:
- kubectl logs onos-7bbc9555bf-2754p -c onos
+```shell
+kubectl logs onos-7bbc9555bf-2754p -c onos
+```
and to view the filebeat logs:
- kubectl logs onos-7bbc9555bf-2754p -c onos-log-agent
+```shell
+kubectl logs onos-7bbc9555bf-2754p -c onos-log-agent
+```
If this the sidecar isn't required, it can be disabled when installing the
chart by passing `--set log_agent.enabled=false` or by using a values file.
@@ -63,4 +69,4 @@
```shell
helm install -n onos -f configs/onos-debug.yaml onos
-```
\ No newline at end of file
+```
diff --git a/charts/ponnet.md b/charts/ponnet.md
index 1c2831e..b40f402 100644
--- a/charts/ponnet.md
+++ b/charts/ponnet.md
@@ -6,13 +6,12 @@
RG and components upstream of the PONSIM OLT. Note that the bridges
are not actually created until [PONSIM](ponsimv2.md) is installed.
-You can install the chart using:
+{% include "../partials/helm/add-cord-repo.md" %}
+
+You can then install the chart using:
```bash
-helm install -n ponnet ponnet
+helm install -n ponnet cord/ponnet
```
-The chart modifies the underlying Kubernetes setup by installing the `bridge`
-CNI and adding configuration files to create the two bridges. Kubernetes must
-be configured with CNI enabled. Note that this chart does not seem to work
-on `minikube`.
+The chart modifies the underlying Kubernetes setup by installing the *bridge* CNI and adding configuration files to create the two bridges. Kubernetes must be configured with CNI enabled. Note that this chart does not seem to work on *minikube*.
diff --git a/charts/ponsim-pod.md b/charts/ponsim-pod.md
index b84fea3..a8329f8 100644
--- a/charts/ponsim-pod.md
+++ b/charts/ponsim-pod.md
@@ -1,10 +1,11 @@
# PONSIM Pod
-This chart just loads TOSCA for adding a PONSIM OLT and Mininet
-AGG Switch to XOS. It is used by [SiaB](../profiles/seba/siab.md).
+This chart just loads TOSCA for adding a PONSIM OLT and Mininet AGG Switch to XOS. It is used by [SiaB](../profiles/seba/siab.md).
-You can install it using:
+{% include "../partials/helm/add-cord-repo.md" %}
-```bash
-helm install -n ponsim-pod xos-profiles/ponsim-pod/
+You can then install it using:
+
+```shell
+helm install -n ponsim-pod cord/ponsim-pod
```
diff --git a/charts/ponsimv2.md b/charts/ponsimv2.md
index a50c74d..599740e 100644
--- a/charts/ponsimv2.md
+++ b/charts/ponsimv2.md
@@ -1,16 +1,18 @@
# PONSIM v2 Helm Chart
-The `ponsimv2` chart deploys the PON Simulator (PONSIM) containers
-(a virtual OLT, ONU, and RG) in the context of VOLTHA.
+The `ponsimv2` chart deploys the PON Simulator (PONSIM) containers (a virtual OLT, ONU, and RG) in the context of VOLTHA.
This chart is used by [SiaB](../profiles/seba/siab.md).
-More details about PONSIM can be found in
-[its README](https://github.com/opencord/voltha/blob/master/ponsim/v2/README.md).
+More details about PONSIM can be found in [its README](https://github.com/opencord/voltha/blob/master/ponsim/v2/README.md).
You must install the [PONNET](ponnet.md) chart before installing this one.
-At that point you can install PONSIM using:
+At that point you can install PONSIM.
-```bash
-helm install -n ponsimv2 ponsimv2
+{% include "../partials/helm/add-cord-repo.md" %}
+
+Then, install ponsim doing:
+
+```shell
+helm install -n ponsimv2 cord/ponsimv2
```
After a successful install you will see containers like these running in the
diff --git a/charts/rcord.md b/charts/rcord.md
deleted file mode 100644
index 789d8a7..0000000
--- a/charts/rcord.md
+++ /dev/null
@@ -1,2 +0,0 @@
-# R-CORD
-
diff --git a/charts/seba-services.md b/charts/seba-services.md
index 3145bdc..a28dc97 100644
--- a/charts/seba-services.md
+++ b/charts/seba-services.md
@@ -2,9 +2,10 @@
This chart contains all the XOS services needed to install SEBA.
-You can install it using:
+{% include "../partials/helm/add-cord-repo.md" %}
-```bash
-helm dep update xos-profiles/seba-services
-helm install -n seba-service xos-profiles/seba-services/
-```
\ No newline at end of file
+You can then install it using:
+
+```shell
+helm install -n seba-service cord/seba-services
+```
diff --git a/charts/storage.md b/charts/storage.md
index 7f8fb11..cca25fc 100644
--- a/charts/storage.md
+++ b/charts/storage.md
@@ -174,7 +174,6 @@
into the `rook-ceph-system` namespace:
```shell
-cd helm-charts/storage
helm repo add rook-beta https://charts.rook.io/beta
helm dep update rook-operator
helm install --namespace rook-ceph-system -n rook-operator rook-operator
@@ -338,8 +337,10 @@
First, configure your nodes to deploy the [local-directory](#local-directory)
chart, then run:
+{% include "../partials/helm/add-cord-repo.md" %}
+
```shell
-helm install -f examples/xos-db-local-dir.yaml -n xos-core xos-core
+helm install -f examples/xos-db-local-dir.yaml -n xos-core cord/xos-core
```
### Example: XOS Database on a Ceph RBD volume
@@ -352,7 +353,7 @@
then load the XOS core charts with:
```shell
-helm install -f examples/xos-db-ceph-rbd.yaml -n xos-core xos-core
+helm install -f examples/xos-db-ceph-rbd.yaml -n xos-core cord/xos-core
```
### Example: Docker Registry on CephFS shared filesystem
diff --git a/charts/voltha.md b/charts/voltha.md
index 05e748c..2e0cc65 100644
--- a/charts/voltha.md
+++ b/charts/voltha.md
@@ -1,18 +1,8 @@
# Deploy VOLTHA
-VOLTHA depends on having a [kafka message bus](kafka.md) deployed with a name
-of `cord-kafka`, so deploy that with helm before deploying the voltha chart.
-
-
## First Time Installation
-Download the helm charts `incubator` repository:
-
-```shell
-helm repo add incubator https://kubernetes-charts-incubator.storage.googleapis.com/
-```
-
-Install the etcd-operator helm chart. This chart provides a convenient way of creating and managing etcd clusters. When voltha installs it will attempt to use etcd-operator to create its etcd cluster. Once installed etcd-operator can be left running.
+Install the etcd-operator helm chart first. This chart provides a convenient way of creating and managing etcd clusters. When VOLTHA installs it will attempt to use etcd-operator to create its etcd cluster. Once installed etcd-operator can be left running.
```shell
helm install -n etcd-operator stable/etcd-operator --version 0.8.0
@@ -24,21 +14,15 @@
kubectl get crd | grep etcd
```
+{% include "../partials/helm/add-cord-repo.md" %}
-
-Update dependencies within the voltha chart:
+Then, install the VOLTHA helm chart. This will create the VOLTHA pods and will create the etcd-cluster pods.
```shell
-helm dep up voltha
+helm install -n voltha cord/voltha
```
-Install the voltha helm chart. This will create the voltha pods and additionally create the etcd-cluster pods
-
-```shell
-helm install -n voltha voltha
-```
-
-Allow enough time for the 3 etcd-cluster pods to start before using the voltha pods.
+Allow enough time for the 3 etcd-cluster pods to start before using the VOLTHA pods.
## Standard Uninstall
@@ -49,7 +33,7 @@
## Standard Install
```shell
-helm install -n voltha voltha
+helm install -n voltha cord/voltha
```
## Nodeports Exposed
@@ -70,25 +54,23 @@
ssh voltha@<pod-ip> -p 30110
```
-The default VOLTHA password is `admin`.
+The default VOLTHA password is *admin*.
## Building and using development images
-In some cases you want to build custom images to try out development code.
-The suggested way to do that is:
+In some cases you may want to build custom images to try out development code. In order to do that, from the CORD repository, do:
```shell
-cd ~/cord/incubator/voltha
+cd incubator/voltha
REPOSITORY=voltha/ TAG=dev VOLTHA_BUILD=docker make build
cd ~/cord/automation-tools/developer
bash tag_and_push.sh -t dev -r 192.168.99.100:30500
```
-_This set of commands will build the VOLTHA containers and push them to a local
-[docker registry](../partials/push-images-to-registry.md) using a TAG called *dev*.
+This set of commands builds the VOLTHA containers and pushes them to a local
+[docker registry](../partials/push-images-to-registry.md) using a tag called *dev*.
-Once the images are pushed to a docker registry on the POD,
-you can use a values file like the following one:
+Once the images are pushed to a docker registry on the POD, you can create a values file like the following one, to override the default chart values, so use your images:
```yaml
# voltha-values.yaml
@@ -120,8 +102,8 @@
```
-and you can install VOLTHA using:
+Then, install VOLTHA using:
```shell
-helm install -n voltha voltha -f voltha-values.yaml
+helm install -n voltha -f voltha-values.yaml cord/voltha
```
diff --git a/charts/xos-core.md b/charts/xos-core.md
index 3d31434..487b23a 100644
--- a/charts/xos-core.md
+++ b/charts/xos-core.md
@@ -2,9 +2,10 @@
To deploy the XOS core and affiliated containers, run the following:
+{% include "../partials/helm/add-cord-repo.md" %}
+
```shell
-helm dep update xos-core
-helm install -n xos-core xos-core
+helm install -n xos-core cord/xos-core
```
**Nodeports exposed**
@@ -14,11 +15,10 @@
## Customizing security information
-We strongly recommend you to override the default values of `xosAdminUser` and
-`xosAdminPassword` with custom values.
+We strongly recommend you to override the default values of *xosAdminUser* and
+*xosAdminPassword* with custom values.
-You can do it using a [`values.yaml`](https://docs.helm.sh/chart_template_guide/#values-files)
-file like this one:
+You can do it using a [`values.yaml`](https://docs.helm.sh/chart_template_guide/#values-files) file like this one:
```yaml
# custom-security.yaml
@@ -29,14 +29,17 @@
and add it to the install command:
```shell
-helm install -n xos-core xos-core -f custom-security.yaml
+helm install -f custom-security.yaml -n xos-core cord/xos-core
```
or you can override the values from the CLI
```shell
-helm install -n xos-core xos-core --set xosAdminUser=MyUser --set xosAdminPassword=MySuperSecurePassword
+helm install -n xos-core cord/xos-core \
+ --set xosAdminUser=MyUser \
+ --set xosAdminPassword=MySuperSecurePassword
```
+
> **Important!**
> If you override security values in the `xos-core` chart, you'll need to pass
> these values, either via a file or cli arguments, to all the xos related charts
diff --git a/charts/xossh.md b/charts/xossh.md
index 675a23e..65d6b56 100644
--- a/charts/xossh.md
+++ b/charts/xossh.md
@@ -1,7 +1,9 @@
# Deploy XOSSH
-To deploy the XOS-Shell, run the following:
+{% include "../partials/helm/add-cord-repo.md" %}
+
+Then, to deploy the XOS-Shell run the following:
```shell
-helm install xos-tools/xossh -n xossh
+helm install -n xossh cord/xossh
```
diff --git a/partials/helm/add-cord-repo.md b/partials/helm/add-cord-repo.md
new file mode 100644
index 0000000..386498f
--- /dev/null
+++ b/partials/helm/add-cord-repo.md
@@ -0,0 +1,6 @@
+If you haven't done it yet, add the CORD repository to the list of your local repositories and update the repo index:
+
+```shell
+helm repo add cord https://gerrit.opencord.org
+helm repo update
+```
diff --git a/profiles/seba/troubleshoot/no-dhcp.md b/profiles/seba/troubleshoot/no-dhcp.md
index e2b9eea..9d4248c 100644
--- a/profiles/seba/troubleshoot/no-dhcp.md
+++ b/profiles/seba/troubleshoot/no-dhcp.md
@@ -12,12 +12,13 @@
Next it is important to understand that there are two ways the ONOS DHCP L2 Relay app
can operate. DHCP packets received from the RG can be relayed to the server using
-either the OLT's uplink port (that connects to the AGG switch), or they can be
-relayed directly to the AGG switch's uplink port (that connects to the BNG/DHCP-server).
-By default, a SEBA pod uses the latter mechanism.
+the OLT's uplink port (that connects to the AGG switch), as shown below.
![OLT Uplink for DHCP](./screenshots/olt-uplink.png "OLT Uplink for DHCP")
+Or they can be relayed directly to the AGG switch's uplink port (that connects
+to the BNG/DHCP-server). By default, a SEBA pod uses the latter mechanism.
+
![Switch Uplink for DHCP](./screenshots/switch-uplink.png "Switch Uplink for DHCP")
The configuration for the DHCP relay app can be seen in the XOS GUI
diff --git a/profiles/seba/troubleshoot/no-ping.md b/profiles/seba/troubleshoot/no-ping.md
index 152bd5d..e04a017 100644
--- a/profiles/seba/troubleshoot/no-ping.md
+++ b/profiles/seba/troubleshoot/no-ping.md
@@ -1 +1,197 @@
# I can't ping
+
+A successful ping is all about the flows in the hardware. In a SEBA pod, dataplane
+traffic does not leave the hardware. But in order to get to this point, the RG
+should have successfully authenticated, and it should have received an IP address
+from the DHCP server.
+
+In the future, we will add troubleshooting probes to understand where the datapath
+may be broken. For now, it is instructive to understand the flows in the dataplane
+and what they represent.
+
+## Flows in the PON
+
+Lets look at what the flows look like in ONOS for the PON.
+
+### ONOS flows
+
+Connect to the [ONOS CLI](../../../charts/onos.md#accessing-the-onos-cli)
+and check the flows on the device that represents the PON.
+
+```shell
+onos> flows -s any of:000000000a5a007a
+deviceId=of:000000000a5a007a, flowRuleCount=11
+-snip-
+ ADDED, bytes=0, packets=0, table=0, priority=1000, selector=[IN_PORT:65536, METADATA:de00007810, VLAN_VID:222], treatment=[immediate=[VLAN_POP], transition=TABLE:1]
+ ADDED, bytes=0, packets=0, table=1, priority=1000, selector=[IN_PORT:65536, VLAN_VID:222], treatment=[immediate=[VLAN_POP, OUTPUT:30736]]
+ ADDED, bytes=0, packets=0, table=0, priority=1000, selector=[IN_PORT:30736, VLAN_VID:0], treatment=[immediate=[VLAN_ID:222], transition=TABLE:1]
+ ADDED, bytes=0, packets=0, table=1, priority=1000, selector=[IN_PORT:30736, VLAN_VID:222], treatment=[immediate=[VLAN_PUSH:vlan, VLAN_ID:222, OUTPUT:65536]]
+```
+
+The first two flows above represent the downstream traffic from `IN_PORT` 65536 (the NNI port)
+for S-VLAN tag 222, which gets popped and transitioned to table 1, where the inner VLAN (also
+222 in this example) is popped and sent to UNI port 30736.
+
+The last two flows represent the upstream traffic, where the reverse happens. In table 0,
+untagged traffic input from UNI port 30736, has C-VLAN 222 pushed on and transitioned
+to table 2 where the outer S-VLAN tag is pushed on and then sent out of NNI port 65536.
+
+### VOLTHA flows
+
+Now lets see what those flows look like in the logical device representing the PON in VOLTHA.
+Connect to the [VOLTHA CLI](../../../charts/voltha.md#accessing-the-voltha-cli)
+
+```shell
+(voltha) logical_device 000100000a5a007a
+(logical device 000100000a5a007a) flows
+Logical Device 000100000a5a007a (type: n/a)
+Flows (12):
++----------+----------+-----------+---------+----------+----------+----------+---------+---------+--------------+--------------+----------+-----------+------------+------------+
+| table_id | priority | cookie | in_port | vlan_vid | eth_type | ip_proto | udp_src | udp_dst | metadata | set_vlan_vid | pop_vlan | push_vlan | output | goto-table |
++----------+----------+-----------+---------+----------+----------+----------+---------+---------+--------------+--------------+----------+-----------+------------+------------+
+-snip-
+| 0 | 1000 | ~6a971a41 | 30736 | 0 | | | | | | 222 | | | | 1 |
+| 1 | 1000 | ~fd1c22e3 | 30736 | 222 | | | | | | 222 | | 8100 | 65536 | |
++----------+----------+-----------+---------+----------+----------+----------+---------+---------+--------------+--------------+----------+-----------+------------+------------+
+| 0 | 1000 | ~569b8514 | 65536 | 222 | | | | | 953482770448 | | Yes | | | 1 |
+| 1 | 1000 | ~c587bdac | 65536 | 222 | | | | | | | Yes | | 30736 | |
++----------+----------+-----------+---------+----------+----------+----------+---------+---------+--------------+--------------+----------+-----------+------------+------------+
+```
+
+We see the same patterns are repeated in the logical device, where the first two
+flows above are for upstream traffic, and the bottom two are for downstream traffic.
+
+These flows from the logical device get decomposed into flows that are meant for
+the OLT as well as for the ONU.
+
+Now if we look at the device object representing the OLT below, we see there is
+one flow each for downstream and upstream in the OLT device object.
+
+```shell
+(voltha) device 0001a82d21249c28
+(device 0001a82d21249c28) flows
+Device 0001a82d21249c28 (type: openolt)
+Flows (16):
++----------+----------+-----------+------------+----------+----------+----------+---------+---------+--------------+--------------+----------+-----------+------------+------------+
+| table_id | priority | cookie | in_port | vlan_vid | eth_type | ip_proto | udp_src | udp_dst | metadata | set_vlan_vid | pop_vlan | push_vlan | output | goto-table |
++----------+----------+-----------+------------+----------+----------+----------+---------+---------+--------------+--------------+----------+-----------+------------+------------+
+-snip-
+| 1 | 1000 | ~829ee130 | 30736 | 222 | | | | | | 222 | | 8100 | 65536 | |
+| 0 | 1000 | ~c4babfb5 | 65536 | 222 | | | | | 953482770448 | | Yes | | | 1 |
++----------+----------+-----------+------------+----------+----------+----------+---------+---------+--------------+--------------+----------+-----------+------------+------------+
+```
+
+The first flow above represents upstream traffic, and the second one represents
+downstream traffic.
+The upstream flow appears to come from a UNI port `30736`, which is not a port
+on the OLT device (it's a port on the ONU). But this information is necessary
+to figure out the PON port on the OLT, from which the traffic ingresses the OLT.
+
+The downstream flow appears to not have an output port but actually
+the output is encoded in the metadata (which also includes the C-VLAN id).
+
+Ignore the `table_id` and `goto-table` fields in this table - they are meaningless.
+
+If these flows look good, lets check the flows in the device object representing the ONU:
+
+```shell
+(voltha) device 000175a511654437
+(device 000175a511654437) flows
+Device 000175a511654437 (type: brcm_openomci_onu)
+Flows (5):
++----------+----------+-----------+---------+----------+--------------+----------+-----------+--------+
+| table_id | priority | cookie | in_port | vlan_vid | set_vlan_vid | pop_vlan | push_vlan | output |
++----------+----------+-----------+---------+----------+--------------+----------+-----------+--------+
+-snip-
+| 0 | 1000 | ~c587bdac | 100 | 222 | | Yes | | 30736 |
+| 0 | 1000 | ~6a971a41 | 30736 | 0 | 222 | | | 100 |
++----------+----------+-----------+---------+----------+--------------+----------+-----------+--------+
+```
+
+Again, there is only 1 upstream flow and 1 downstream flow for this subscriber. The
+first flow shown above represents the downstream direction from the ANI port on the
+ONU (designated as port number 100) that matches on the VLAN tag 222, and pops it off
+before sending the packet out of the UNI port 30736.
+
+The 2nd flow represents the upstream direction, receiving untagged packets from the
+UNI port 30736, and pushing on the C-VLAN tag 222, before sending the packet out
+of the ANI port 100 towards the OLT.
+
+## Flows in the AGG switch
+
+If all the flows in the PON appear to be correct, then the problem may lie in the
+AGG switch.
+
+From the ONOS CLI
+
+```shell
+onos> flows -s any of:0000000000000002
+deviceId=of:0000000000000002, flowRuleCount=33
+-snip-
+ ADDED, bytes=0, packets=0, table=10, priority=32768, selector=[IN_PORT:1, VLAN_VID:222], treatment=[transition=TABLE:20]
+ ADDED, bytes=0, packets=0, table=10, priority=32768, selector=[IN_PORT:32, VLAN_VID:222], treatment=[transition=TABLE:20]
+-snip-
+ ADDED, bytes=0, packets=0, table=50, priority=1000, selector=[VLAN_VID:222], treatment=[deferred=[GROUP:0x40de0000], transition=TABLE:60]
+-snip-
+ ADDED, bytes=1948, packets=22, table=60, priority=60000, selector=[VLAN_VID:222], treatment=[immediate=[NOACTION]]
+-snip-
+```
+
+There are a number of default flows in the AGG switch for features that are not
+currently used in SEBA. We have highlighted only the meaningful flows above. In SEBA,
+for the AT&T workflow, packets are forwarded only on the basis of the S-tag.
+
+In `table=10`, packets with S-VLAN tag 222 are allowed into the the switch from
+`IN_PORT:1` (connected to the OLT) and `IN_PORT:32` (connected to the BNG).
+In `table=50` packets in the S-VLAN 222 are bridged together in the `GROUP:0x40de0000`
+In `table=60` we add an ACL flow for S-VLAN 222 to ensure that none of the other
+ACL flows (not shown above) get triggered for packets on this VLAN.
+
+Below we show details of the flooding group `GROUP:0x40de0000` which points to
+two other groups which in turn represent the two ports 1 and 32, which have been
+cross-connected together on this vlan (222).
+
+```shell
+onos> groups
+deviceId=of:0000000000000002, groupCount=3
+ id=0xde0001, state=ADDED, type=INDIRECT, bytes=0, packets=0, appId=org.onosproject.xconnect, referenceCount=1
+ id=0xde0001, bucket=1, bytes=0, packets=0, actions=[OUTPUT:1]
+ id=0xde0020, state=ADDED, type=INDIRECT, bytes=0, packets=0, appId=org.onosproject.xconnect, referenceCount=1
+ id=0xde0020, bucket=1, bytes=0, packets=0, actions=[OUTPUT:32]
+ id=0x40de0000, state=ADDED, type=ALL, bytes=0, packets=0, appId=org.onosproject.xconnect, referenceCount=1
+ id=0x40de0000, bucket=1, bytes=0, packets=0, actions=[GROUP:0xde0020]
+ id=0x40de0000, bucket=2, bytes=0, packets=0, actions=[GROUP:0xde0001]
+```
+
+You should also verify the output of the command below which should show the cross-connected ports on the VLAN.
+
+```shell
+onos> sr-xconnect
+XconnectDesc{key=XconnectKey{deviceId=of:0000000000000002, vlanId=222}, ports=[32, 1]}
+```
+
+## Using Port Statistics
+
+You can check the port stats on the AGG switch to see if the port counters
+on the switch are increasing or not. For example, with a live ping in progress, try
+
+```shell
+onos> watch portstats -nz -d of:0000000000000002
+deviceId=of:0000000000000002
+ port=1, pktRx=36, pktTx=36, bytesRx=3866, bytesTx=3842, rateRx=Infinity, rateTx=Infinity, pktRxDrp=4, pktTxDrp=0, interval=0.000
+ port=32, pktRx=31, pktTx=35, bytesRx=3364, bytesTx=3744, rateRx=Infinity, rateTx=Infinity, pktRxDrp=0, pktTxDrp=0, interval=0.000
+```
+
+Note that the port counters are increasing on both ports 1 and 32 for both
+transmitted (`pktTx`) and received packets (`pktRx`).
+
+We recommend a fast ping (with option -i 0.2) to increase the number of ping packets
+sent out per second. This will cause a significant change in the port counters.
+
+The -nz option in the command above displays only ports that have non-zero port counters.
+The -d option automatically displays the delta of the port counters from the previous collection
+point. Stats collection intervals are 5 secs by default.
+
+These stats are not currently exported to the CORD monitoring stack by ONOS. However portstats
+from the OLT are exported to Kafka by VOLTHA, and can be displayed in Grafana. Portstats
+from the ONU can similarly be exported, but is currently work-in-progress.