Merge "[CORD-3197] Document how to attach containers to external NICs"
diff --git a/Makefile b/Makefile
index 8d596b8..7e572d9 100644
--- a/Makefile
+++ b/Makefile
@@ -13,7 +13,7 @@
 
 # Other repos with documentation that's included in the gitbook
 # edit the `git_refs` file with the commit/tag/branch that you want to use
-OTHER_REPO_DOCS ?= cord-tester fabric hippie-oss kubernetes-service olt-service onos-service openolt openstack rcord simpleexampleservice vrouter xos xos-gui xos-tosca
+OTHER_REPO_DOCS ?= cord-tester fabric hippie-oss kubernetes-service olt-service onos-service openolt openstack rcord simpleexampleservice exampleservice vrouter xos xos-gui xos-tosca
 GENERATED_DOCS  ?= # should be 'swagger', but currently broken
 ALL_DOCS        ?= $(OTHER_REPO_DOCS) $(GENERATED_DOCS)
 
@@ -49,7 +49,7 @@
 	mdl -s $(LINT_STYLE) `find -L . ! -path "./partials/*" ! -path "./_book/*" ! -path "./repos/*"  ! -path "./node_modules/*" ! -path "./cord-tester/modules/*" -name "*.md"`
 
 linkcheck: $(ALL_DOCS) _book
-	linkchecker -a _book/
+	linkchecker -a --check-extern _book/
 
 # Host holding the git server
 REPO_HOST   ?= https://gerrit.opencord.org
@@ -87,3 +87,13 @@
 swagger: xos
 	pushd repos/xos/docs; make swagger_docs; popd;
 
+# generate a list of git checksums suitable for updating git_refs
+freeze: repos
+	@for repo in $(OTHER_REPO_DOCS) ; do \
+	  GIT_SUBDIR=`grep "^$$repo " git_refs | awk '{print $$2}'` ;\
+	  cd "repos/$$repo" > /dev/null ;\
+	    HEAD_SHA=`git rev-parse HEAD` ;\
+	    printf "%-21s %-8s %-40s\n" $$repo $$GIT_SUBDIR $$HEAD_SHA ;\
+	  cd ../.. ;\
+	done
+
diff --git a/SUMMARY.md b/SUMMARY.md
index c465006..ba8f447 100644
--- a/SUMMARY.md
+++ b/SUMMARY.md
@@ -65,17 +65,17 @@
             * [Synchronizer Reference](xos/dev/sync_reference.md)
         * [Core Models](xos/core_models.md)
         * [Security Policies](xos/security_policies.md)
+        * [Tutorial](xos/tutorials/basic_synchronizer.md)
     * [Developer Workflows](developer/workflows.md)
         * [Working on R-CORD Without an OLT/ONU](developer/configuration_rcord.md)
     * [Building Docker Images](developer/imagebuilder.md)
-    * Tutorials
-        * [Synchronizer Hello World](developer/tutorials/basic-synchronizer/intro.md)
     * [Platform Services](developer/platform.md)
         * [Kubernetes](kubernetes-service/kubernetes-service.md)
         * [OpenStack](openstack/openstack-service.md)
         * [VTN and Service Composition](xos/xos_vtn.md)
     * [Example Services](examples/examples.md)
         * [SimpleExampleService](simpleexampleservice/simple-example-service.md)
+        * [ExampleService](exampleservice/example-service.md)
     * [GUI Development](xos-gui/developer/README.md)
         * [Quickstart](xos-gui/developer/quickstart.md)
         * [GUI Extensions](xos-gui/developer/gui_extensions.md)
diff --git a/book.json b/book.json
index fd3f609..1317bf7 100644
--- a/book.json
+++ b/book.json
@@ -21,6 +21,10 @@
           "text": "Master (Devel)"
         },
         {
+          "value": "/cord-6.0",
+          "text": "6.0 (Stable)"
+        },
+        {
           "value": "/cord-5.0",
           "text": "5.0 (Stable)"
         },
@@ -29,10 +33,6 @@
           "text": "4.1 (Stable)"
         },
         {
-          "value": "/cord-4.0",
-          "text": "4.0 (Stable)"
-        },
-        {
           "value": "https://wiki.opencord.org/display/CORD/Building+and+Installing+CORD",
           "text": "3.0 and previous (wiki)"
         }
diff --git a/charts/kafka.md b/charts/kafka.md
index 051754d..464dfe5 100644
--- a/charts/kafka.md
+++ b/charts/kafka.md
@@ -7,7 +7,12 @@
 
 ```shell
 helm repo add incubator http://storage.googleapis.com/kubernetes-charts-incubator
-helm install --name cord-kafka incubator/kafka
+helm install --name cord-kafka \
+--set replicas=1 \
+--set persistence.enabled=false \
+--set zookeeper.servers=1 \
+--set zookeeper.persistence.enabled=false \
+incubator/kafka
 ```
 
 If you are experierencing problems with a multi instance installation of kafka,
diff --git a/fabric-setup.md b/fabric-setup.md
index d0de4c2..4fb19b6 100644
--- a/fabric-setup.md
+++ b/fabric-setup.md
@@ -45,6 +45,7 @@
 Three OFDPA drivers are available:
 
 * [EdgeCore 5712-54X / 5812-54X / 6712-32X](https://github.com/onfsdn/atrium-docs/blob/master/16A/ONOS/builds/ofdpa_3.0.5.5%2Baccton1.7-1_amd64.deb?raw=true) - *checksum: sha256:db228b6e79fb15f77497b59689235606b60abc157e72fc3356071bcc8dc4c01f*
+* [EdgeCore 7712-32X](https://github.com/onfsdn/atrium-docs/blob/master/16A/ONOS/builds/ofdpa_3.0.5.5%2Baccton1.7-1_amd64.deb) - *checksum: sha256:4f78e8f43976dc86ab1cdc2f98afa743ce2e0cc5923e429c91f96b0edc3ddf4b*
 * [QuantaMesh T3048-LY8](https://github.com/onfsdn/atrium-docs/blob/master/16A/ONOS/builds/ofdpa-ly8_0.3.0.5.0-EA5-qct-01.01_amd64.deb?raw=true) - *checksum: sha256:f8201530b1452145c1a0956ea1d3c0402c3568d090553d0d7b3c91a79137da9e*
 * [QuantaMesh BMS T7032-IX1/IX1B](https://github.com/onfsdn/atrium-docs/blob/master/16A/ONOS/builds/ofdpa-ix1_0.3.0.5.0-EA5-qct-01.00_amd64.deb?raw=true) *checksum: sha256:278b8ffed8a8fc705a1b60d16f8e70377e78342a27a11568a1d80b1efd706a46*
 
diff --git a/git_refs b/git_refs
index fcadce1..7faa57f 100644
--- a/git_refs
+++ b/git_refs
@@ -21,6 +21,7 @@
 openstack             /docs    master
 rcord                 /docs    master
 simpleexampleservice  /docs    master
+exampleservice        /docs    master
 vrouter               /docs    master
 xos-gui               /docs    master
 xos-tosca             /docs    master
diff --git a/mdl_relaxed.rb b/mdl_relaxed.rb
index bebc671..478ea9e 100644
--- a/mdl_relaxed.rb
+++ b/mdl_relaxed.rb
@@ -51,3 +51,7 @@
 
 # Gitbook won't care about multiple blank lines
 exclude_rule 'MD012'
+
+# Causes failures within code block when MD031 is also excluded
+exclude_rule 'MD046'
+
diff --git a/operating_cord/rest_apis.md b/operating_cord/rest_apis.md
index 7b29be0..692aaa0 100644
--- a/operating_cord/rest_apis.md
+++ b/operating_cord/rest_apis.md
@@ -1,18 +1,11 @@
 # RESTful APIs
 
 A RESTful interface is available for configuring and controlling CORD. It is
-auto-generated from the set of [models](/xos/README.md) configured
-into the POD manifest, and includes both core and service-specific models.
+auto-generated from the set of [models](/xos/intro.md) configured
+into a POD, and includes both core and service-specific models. Click
+[here](https://guide.opencord.org/master/api/xos/) to see API defined
+for the full set of services checked into [Gerrit](https://gerrit.opencord.org).
 
-* [Core](https://guide.opencord.org/{{ book.branch }}/api/xos/#/core)
-* [Address Manager](https://guide.opencord.org/{{ book.branch }}/api/xos/#/addressmanager)
-* [vTR](https://guide.opencord.org/{{ book.branch }}/api/xos/#/vtr)
-* [vSG](https://guide.opencord.org/{{ book.branch }}/api/xos/#/vsg)
-* [vNoD Local](https://guide.opencord.org/{{ book.branch }}/api/xos/#/vnodlocal)
-* [vRouter](https://guide.opencord.org/{{ book.branch }}/api/xos/#/vrouter)
-* [ONOS Service](https://guide.opencord.org/{{ book.branch }}/api/xos/#/onos)
-* [Fabric Service](https://guide.opencord.org/{{ book.branch }}/api/xos/#/fabric)
-* [Example Service](https://guide.opencord.org/{{ book.branch }}/api/xos/#/exampleservice)
-* [vEE](https://guide.opencord.org/{{ book.branch }}/api/xos/#/vee)
-* [vEG](https://guide.opencord.org/{{ book.branch }}/api/xos/#/veg)
-* [vnaas](https://guide.opencord.org/{{ book.branch }}/api/xos/#/vnaas)
+You can access the REST API specification on a running POD by going to
+the `/apidocs/` URL on the Chameleon REST endpoint (exposed at
+port 30006 by default): `http://pod-ip-or-dns-address:30006/apidocs/`.
diff --git a/prereqs/hardware.md b/prereqs/hardware.md
index 20eb576..820ff9a 100644
--- a/prereqs/hardware.md
+++ b/prereqs/hardware.md
@@ -72,14 +72,22 @@
         copper cable, 3m length - S/N: QSFP-40G-03C
 
 * **R-CORD Access Devices and Optics**
+    * **GPON**
+        * **OLT**: Celestica CLS Ruby S1010 (experimental, only top-down provisioning is supported - through manual customizations)
+            * Compatible **OLT optics**
+                * OptoWiz LSP4343-CKSA-R GPON SFP OLT Transceiver
+        * **ONUs**:
+            * Celestica Tellion GP-1204
+            * Movistar ONU (with CPE included) (manifactured by Telefonica: <http://www.movistar.es/particulares/movil/moviles/hgu>)
     * **XGS-PON**
         * **OLT**: EdgeCore ASFVOLT16 (for more info <bartek_raszczyk@edge-core.com>)
-        * Compatible **OLT optics**
-            * Hisense/Ligent: LTH7226-PC, LTH7226-PC+
-            ** Source Photonics: XPP-XG2-N1-CDFA
-        * **ONU**: AlphaNetworks PON-34000B (for more info <ed-y_chen@alphanetworks.com>)
-        * Compatible **ONU optics**
-            * Hisense/Ligent: LTF7225-BC, LTF7225-BH+
+            * Compatible **OLT optics**
+                * Hisense/Ligent: LTH7226-PC, LTH7226-PC+
+                * Source Photonics: XPP-XG2-N1-CDFA
+        * **ONUs**:
+            * AlphaNetworks PON-34000B (for more info <ed-y_chen@alphanetworks.com>)
+                * Compatible **ONU optics**
+                    * Hisense/Ligent: LTF7225-BC, LTF7225-BH+
 
 * **M-CORD Specific Requirements**
     * **Servers**: Some components of CORD require at least a Intel XEON CPU with Haswell microarchitecture or better.
diff --git a/prereqs/openstack-helm.md b/prereqs/openstack-helm.md
index d60f9a8..7627a45 100644
--- a/prereqs/openstack-helm.md
+++ b/prereqs/openstack-helm.md
@@ -61,6 +61,15 @@
 ```
 
 ```bash
+cat <<EOF > /tmp/libvirt-cord.yaml
+---
+network:
+  backend: []
+EOF
+export OSH_EXTRA_HELM_ARGS_LIBVIRT="-f /tmp/libvirt-cord.yaml"
+```
+
+```bash
 cat <<EOF > /tmp/nova-cord.yaml
 ---
 labels:
diff --git a/profiles/rcord/configuration.md b/profiles/rcord/configuration.md
index 7c865c8..d2cff9a 100644
--- a/profiles/rcord/configuration.md
+++ b/profiles/rcord/configuration.md
@@ -304,3 +304,126 @@
 
 For instructions on how to push TOSCA into a CORD POD, please
 refer to this [guide](../../xos-tosca/README.md).
+
+### Know issues
+
+There is a set of issue that we have seen from time to time.
+They are currently undergoing a deeper investigation, but here is how to identify
+and correct them.
+
+#### OLTDevices are not pushed to VOLTHA
+
+If you have configured OLTDevices in XOS and you are not seeing them in VOLTHA,
+you should check the vOLT-synchronizer logs:
+
+```shell
+kubectl logs -f $(kubectl get pods | grep volt- | awk '{print $1}')
+```
+
+If the logs are not moving, restart the synchronizer:
+
+```shell
+kubectl delete pod $(kubectl get pods | grep volt- | awk '{print $1}')
+```
+
+#### ONU Activate events are not received by XOS
+
+Once OLTs have been activated, XOS should receive events and create
+`HippieOssServiceInstance` models for each event.
+
+To check if XOS has been received from XOS you can use this command:
+
+```shell
+kubectl logs -f $(kubectl get pods | grep volt- | awk '{print $1}') | grep "onu.event"
+```
+
+If the events have been received you should see something like:
+
+```shell
+Processing event               msg=ConsumerRecord(topic=u'onu.events', partition=0, offset=42, timestamp=1530296353275, timestamp_type=0, key=None, value='{"timestamp":1530296353275,"status":"activated","serial_number":"ALPHe3d1cfde","uni_port_id":48,"of_dpid":"of:000000000a5a0097"}', checksum=100437027, serialized_key_size=-1, serialized_value_size=128) step=ONUEventStep
+onu.events: received event     value={u'status': u'activated', u'timestamp': 1530296353275, u'uni_port_id': 48, u'of_dpid': u'of:000000000a5a0097', u'serial_number': u'ALPHe3d1cfde'}
+onu.events: activate onu       value={u'status': u'activated', u'timestamp': 1530296353275, u'uni_port_id': 48, u'of_dpid': u'of:000000000a5a0097', u'serial_number': u'ALPHe3d1cfde'}
+onu.events: Calling OSS for ONUDevice with serial_number ALPHe3d1cfde
+```
+
+If you don't see that, you can force ONOS-VOLTHA to send the events again.
+
+Connect to the ONOS-VOLTHA CLI:
+
+```shell
+ssh karaf@<pod-ip> -p $(kubectl get svc -n voltha | grep -i onos-voltha-ssh |  awk '{print substr($5,6,5)}')
+```
+Remove the device:
+
+```shell
+onos> device-remove <device-ofid>
+```
+
+The device will be automatically discovered again, and events are sent.
+
+##### Check if the events appears in Kafka
+
+If you are still not seeing the events in XOS, you can check if they appear into Kafka.
+
+To do that `exec` into any synchronizer container:
+
+```shell
+kubectl exec -it $(kubectl get pods | grep volt- | awk '{print $1}') bash
+apt-get update
+apt-get install kafkacat -y
+kafkacat -b cord-kafka.default.svc.cluster.local:9092 -t onu.events
+```
+
+If the events have reached `kafka` you should see this message:
+
+```shell
+{"timestamp":1530301582776,"status":"activated","serial_number":"ALPHe3d1cfde","uni_port_id":48,"of_dpid":"of:000000000a5a0097"}
+```
+
+If they have not you are probably missing the correct configuration in ONOS-VOLTHA,
+to verify that, ssh into ONOS-VOLTHA:
+
+```shell
+ssh karaf@<pod-ip> -p $(kubectl get svc -n voltha | grep -i onos-voltha-ssh |  awk '{print substr($5,6,5)}')
+```
+
+and check if there is any configuration for the `org.opencord.olt` app:
+
+```shell
+onos> netcfg apps org.opencord.olt
+{
+  "kafka" : {
+    "bootstrapServers" : "cord-kafka.default.svc.cluster.local:9092"
+  }
+}
+```
+
+If you don't have that configuration, you can resubmit it by going into the XOS-GUI,
+search for `ServiceInstanceAttributes` and save the configuration again.
+
+#### Subscribers are not created as a result of an ONU Activate event
+
+If you see `HippieOssServiceInstances` but you don't see any `Subscriber` in XOS,
+you should check if the model policies for the `HippieOssServiceInstances` have been executed:
+
+```shell
+kubectl logs -f $(kubectl get pods | grep hippie- | awk '{print $1}') | grep -i "model_policy"
+```
+
+I this is the only line you are seeing:
+
+```shell
+Loaded model policies          policies=[<class 'model_policy_hippieossserviceinstance.OSSServiceInstancePolicy'>]
+```
+
+Go to the XOS-GUI, search for `HippieOssServiceInstances` and save them again.
+You should see the above command print more logs and `Subscriber`s beeing created.
+
+#### ONU Ports are down
+
+If everything is correctly configured across the POD, but you can't ping
+the gateway from your client, it's possible that the ports on the ONU are not up.
+
+Assuming that your client is connected to the OLT via the interface `eth1`,
+you can check if the client sees the port as up or not. If the port is not up,
+reboot the ONU.