Merge "add developer documentation"
diff --git a/developer/images/rocgui.png b/developer/images/rocgui.png
new file mode 100644
index 0000000..c2b388f
--- /dev/null
+++ b/developer/images/rocgui.png
Binary files differ
diff --git a/developer/roc.rst b/developer/roc.rst
new file mode 100644
index 0000000..a3b2f9b
--- /dev/null
+++ b/developer/roc.rst
@@ -0,0 +1,231 @@
+.. vim: syntax=rst
+
+Aether ROC Developer Guide
+==========================
+
+Background / Development Environment
+------------------------------------
+
+This document assumes familiarity with Kubernetes and Helm, and that a Kubernetes/Helm development
+environment has already been deployed in the developer’s work environment.
+This development environment can use any of a number of potential mechanisms -- including KinD, Kubeadm, etc.
+The Aether-in-a-Box script is one potential way to setup a development environment, but not the only way.
+As an alternative to the developer’s local machine, a remote environment can be set up, for example on
+cloud infrastructure such as cloudlab.
+
+Installing Prerequisites
+------------------------
+
+Atomix and onos-operator must be installed::
+
+   # create necessary namespaces
+   kubectl create namespace micro-onos
+
+   # install atomix
+   helm -n kube-system install atomix-controller atomix/atomix-controller
+   helm -n kube-system install atomix-raft-storage atomix/atomix-raft-storage
+
+   # install the onos operator
+   helm install -n kube-system onos-operator onosproject/onos-operator
+
+
+Verify that these services were installed properly.
+You should see pods for *atomix-controller*, *atomix-raft-storage-controller*,
+*onos-operator-config*, and *onos-operator-topo*.
+Execute these commands::
+
+   kubectl -n kube-system get pods | grep -i atomix
+   kubectl -n kube-system get pods | grep -i onos
+
+
+Create a values-override.yaml
+-----------------------------
+
+You’ll want to override several of the defaults in the ROC helm charts::
+
+   cat > values-override.yaml <<EOF
+   import:
+   onos-gui:
+      enabled: true
+
+   onos-gui:
+   ingress:
+      enabled: false
+
+   sdcore-adapter-v3:
+   prometheusEnabled: false
+
+   sdcore-exporter:
+   prometheusEnabled: false
+
+   onos-exporter:
+   prometheusEnabled: false
+
+   aether-roc-gui-v3:
+   ingress:
+      enabled: false
+   EOF
+
+Installing the Aether-Roc-Umbrella Helm chart
+---------------------------------------------
+
+Add the necessary helm repositories::
+
+   # obtain username and password from Michelle and/or ONF infra team
+   export repo_user=<username>
+   export repo_password=<password>
+   helm repo add sdran --username "$repo_user" --password "$repo_password" https://sdrancharts.onosproject.org
+
+Aether-Roc-Umbrella will bring up the ROC and its services::
+
+   helm -n micro-onos install aether-roc-umbrella sdran/aether-roc-umbrella -f values-override.yaml
+
+   kubectl wait pod -n micro-onos --for=condition=Ready -l type=config --timeout=300s
+
+
+Posting the mega-patch
+----------------------
+
+The ROC usually comes up in a blank state -- there are no Enterprises, UEs, or other artifacts present in it.
+The mega-patch is an example patch that populates the ROC with some sample enterprises, UEs, slices, etc.
+Execute the following::
+
+   # launch a port-forward for the API
+   # this will continue to run in the background
+   kubectl -n micro-onos port-forward service/aether-roc-api   --address 0.0.0.0 8181:8181 &
+
+   git clone https://github.com/onosproject/aether-roc-api.git
+
+   # execute the mega-patch (it will post via CURL to localhost:8181)
+   bash ~/path/to/aether-roc-api/examples/MEGA_Patch.curl
+
+
+You may wish to customize the mega patch.
+For example, by default the patch configures the sdcore-adapter to push to sdcore-test-dummy.
+You could configure it to push to a live aether-in-a-box core by doing something like this::
+
+   sed -i 's^http://aether-roc-umbrella-sdcore-test-dummy/v1/config/5g^http://webui.omec.svc.cluster.local:9089/config^g' MEGA_Patch.curl
+
+   #apply the patch
+   ./MEGA_Patch.curl
+
+(Note that if your Aether-in-a-Box was installed on a different machine that port-forwarding may be necessary)
+
+
+Expected CURL output from a successful mega-patch post will be a UUID.
+You can also verify that the mega-patch was successful by going into the aether-roc-gui in a browser
+(see the section on useful port-forwards below). The GUI may open to a dashboard that is unpopulated -- you
+can use the dropdown menu (upper-right hand corner of the screen) to select an object such as VCS and you
+will see a list of VCS.
+
+   |ROCGUI|
+
+Uninstalling the Aether-Roc-Umbrella Helm chart
+-----------------------------------------------
+
+To tear things back down, usually as part of a developer loop prior to redeploying again, do the following::
+
+   helm -n micro-onos del aether-roc-umbrella
+
+If the uninstall hangs or if a subsequent reinstall hangs, it could be an issue with some of the CRDs
+not getting cleaned up. The following may be useful::
+
+   # fix stuck finalizers in operator CRDs
+
+   kubectl -n micro-onos patch entities connectivity-service-v2 --type json --patch='[ { "op": "remove", "path": "/metadata/finalizers" } ]'
+
+   kubectl -n micro-onos patch entities connectivity-service-v3 --type json --patch='[ { "op": "remove", "path": "/metadata/finalizers" } ]'
+
+   kubectl -n micro-onos patch kind aether --type json --patch='[ { "op": "remove", "path": "/metadata/finalizers" } ]'
+
+Useful port forwards
+--------------------
+
+Port forwarding is often necessary to allow access to ports inside of Kubernetes pods that use ClusterIP addressing.
+Note that you typically need to leave a port-forward running (you can put it in the background).
+Also, If you redeploy the ROC and/or if a pod crashes then you might have to restart a port-forward.
+The following port-forwards may be useful::
+
+   # aether-roc-api
+
+   kubectl -n micro-onos port-forward service/aether-roc-api --address 0.0.0.0 8181:8181
+
+   # aether-roc-gui
+
+   kubectl -n micro-onos port-forward service/aether-roc-gui --address 0.0.0.0 8183:80
+
+   # grafana
+
+   kubectl -n micro-onos port-forward service/aether-roc-umbrella-grafana --address 0.0.0.0 8187:80
+
+   # onos gui
+
+   kubectl -n micro-onos port-forward service/onos-gui --address 0.0.0.0 8182:80
+
+Aether-roc-api and aether-roc-gui are in our experience the most useful two port-forwards.
+Aether-roc-api is useful to be able to POST REST API requests.
+Aether-roc-gui is useful to be able to interactively browse the current configuration.
+
+Deploying using custom images
+-----------------------------
+
+Custom images may be used by editing the values-override.yaml file.
+For example, to deploy a custom sdcore-adapter::
+
+   sdcore-adapter-v3:
+
+   prometheusEnabled: false
+
+   image:
+
+   repository: my-private-repo/sdcore-adapter
+
+   tag: my-tag
+
+   pullPolicy: Always
+
+The above example assumes you have published a docker images at my-private-repo/sdcore-adapter:my-tag.
+My particular workflow is to deploy a local-docker registry and push my images to that.
+Please do not publish ONF images to a public repository unless the image is intended to be public.
+Several ONF repositories are private, and therefore their docker artifacts should also be private.
+
+There are alternatives to using a private docker repository.
+For example, if you are using kubadm, then you may be able to simply tag the image locally.
+If you’re using KinD, then you can push a local image to into the kind cluster::
+
+   kind load docker-image sdcore-adapter:my-tag
+
+Inspecting logs
+---------------
+
+Most of the relevant Kubernetes pods are in the micro-onos namespace.
+The names may change from deployment to deployment, so start by getting a list of pods::
+
+   kubectl -n micro-onos get pods
+
+Then you can inspect a specific pod/container::
+
+   kubectl -n micro-onos logs sdcore-adapter-v3-7468cc58dc-ktctz sdcore-adapter-v3
+
+Some exercises to get familiar
+------------------------------
+
+1) Deploy the ROC and POST the mega-patch, go into the aether-roc-GUI and click through the VCS, DeviceGroup, and
+other objects to see that they were created as expected.
+
+2) Examine the log of the sdcore-adapter-v3 container.
+It should be attempting to push the mega-patch’s changes.
+If you don’t have a core available, it may be failing the push, but you should see the attempts.
+
+3) Change an object in the GUI.
+Watch the sdcore-adapter-v3 log file and see that the adapter attempts to push the change.
+
+4) Try POSTing a change via the API.
+Observe the sdcore-adapter-v3 log file and see that the adapter attempts to push the change.
+
+5) Deploy a 5G Aether-in-a-Box (See sd-core developer guide), modify the mega-patch to specify the URL for the
+Aether-in-a-Box webui container, POST the mega-patch, and observe that the changes were correctly pushed via the
+sdcore-adapter-v3 into the sd-core’s webui container (webui container log will show configuration as it is
+received)
+
+.. |ROCGUI| image:: images/rocgui.png
diff --git a/developer/sdcore.rst b/developer/sdcore.rst
new file mode 100644
index 0000000..385f131
--- /dev/null
+++ b/developer/sdcore.rst
@@ -0,0 +1,87 @@
+.. vim: syntax=rst
+
+Aether SD-Core Developer Guide
+==============================
+
+Clone Repositories
+------------------
+
+Clone the following repositories, using your gerrit ids as necessary::
+
+    mkdir -p ~/cord    #need to clone below 2 repos in this directory
+    git clone "ssh://<username>@gerrit.opencord.org:29418/helm-charts"
+    git clone "ssh://<username>@gerrit.opencord.org:29418/aether-helm-charts"
+
+    cd ~  #go back to home directory
+    git clone "ssh://<username>@gerrit.opencord.org:29418/aether-in-a-box"
+
+Start the 4G Core
+-----------------
+
+Deploy Aether-in-a-Box and start the 4G core::
+
+    cd aether-in-a-box
+
+    #create K8s cluster for you and also start 4G network functions and carry out 1 ping test
+    make test
+
+Apply the necessary pull secrets
+--------------------------------
+
+The deployment may fail and leave pods in ImagePullBackoff status if the
+necessary secrets are not applied.
+Obtain the secret from ONF, and then execute the following::
+
+    cat > ~/registry-secret.json
+         ... paste the secret here ...
+    kubectl apply -f ~/registry-secret.json
+
+
+
+Transition from 4G Core to 5G Core
+----------------------------------
+
+Before starting the 5G core, the 4G Core must be stopped::
+
+    make reset-test  #this does not destroy K8s cluster.
+
+Now, start the 5G Core::
+
+    make 5gc  #this will start all 5G network functions with default images.
+
+    kubectl get pods -n omec #verify that all 5g pods are started.
+
+Sample output::
+
+    NAME                       READY   STATUS      RESTARTS   AGE
+    amf-7d6f649b4f-jzd9r       1/1     Running     0          41s
+    ausf-8dd5d7465-xrjdl       1/1     Running     0          41s
+    gnbsim-0                   1/1     Running     0          25s
+    mongodb-55555bc884-wqcrh   1/1     Running     0          41s
+    nrf-ddd7d8d5b-vjv84        1/1     Running     0          41s
+    nssf-7978bb74cc-zct9v      1/1     Running     0          41s
+    pcf-5bbbff96d6-l54f6       1/1     Running     0          41s
+    smf-86b6fd5674-tq8h9       1/1     Running     0          41s
+    udm-5fdf9cf56d-76hlt       1/1     Running     0          41s
+    udr-d8f855c6b-jj8lw        1/1     Running     0          41s
+    ue-setup-if-mftrm          0/1     Completed   0          23d
+    ue-teardown-if-whbvm       0/1     Completed   0          23d
+    upf-0                      4/4     Running     0          55s
+    webui-79c8b7dfc7-wn6st     1/1     Running     0          41s
+
+Developer Loop
+--------------
+
+Deploy custom images by editing `~/aether-in-a-box/aether-in-a-box-values.yaml`::
+
+    images:
+        tags:
+            webui: registry.aetherproject.org/omecproject/5gc-webui:onf-release3.0.5-roc-935305f
+        pullPolicy: IfNotPresent
+        pullSecrets:
+            - name: "aether.registry"
+
+Stop the 5G Core and start it again::
+
+    make reset-5g-test
+    make 5gc
diff --git a/index.rst b/index.rst
index 73d5499..a0d2324 100644
--- a/index.rst
+++ b/index.rst
@@ -56,6 +56,15 @@
    testing/acceptance_specification
 
 .. toctree::
+   :maxdepth: 3
+   :caption: Aether Developer Notes
+   :hidden:
+   :glob:
+
+   developer/sdcore
+   developer/roc
+
+.. toctree::
    :maxdepth: 1
    :caption: Meta
    :hidden: