[SEBA-700] SiaB based development workflow for containers and ONOS Apps

Change-Id: Ieebdba96d25a4e42416ca5e46b219355bfb3e911
diff --git a/SUMMARY.md b/SUMMARY.md
index a7e8fa2..9801480 100644
--- a/SUMMARY.md
+++ b/SUMMARY.md
@@ -40,9 +40,11 @@
     * [Getting the Source Code](developer/getting_the_code.md)
         * [Contribute to the documentation](developer/contribute_to_the_docs.md)
     * [Modeling Services](developer/xos-intro.md)
-    * [Developer Workflows](developer/workflows.md)
+    * Developer Workflows
         * [Service Migrations](xos/dev/xosmigrate.md)
-    * [Building Docker Images](developer/imagebuilder.md)
+        * [Local Development](developer/workflows/local.md)
+        * [SiaB Development](developer/workflows/siab.md)
+            * [ONOS Apps Development](developer/workflows/onos-apps.md)
     * [GUI Development](xos-gui/developer/README.md)
         * [Quickstart](xos-gui/developer/quickstart.md)
         * [GUI Extensions](xos-gui/developer/gui_extensions.md)
@@ -126,3 +128,4 @@
     * [VOLTHA](charts/voltha.md)
     * [XOS-CORE](charts/xos-core.md)
     * [XOSSH](charts/xossh.md)
+
diff --git a/charts/helm.md b/charts/helm.md
index addf574..dd2e1a2 100644
--- a/charts/helm.md
+++ b/charts/helm.md
@@ -141,7 +141,7 @@
 image in a chart.
 
 To handle building and pushing images to a registry, see the [development
-documentation](../developer/workflows.md#pushing-changes-to-a-remote-registry).
+documentation](../developer/workflows/local.md#pushing-changes-to-a-remote-registry).
 
 If you want to change only the registry for one specific image, the easiest way
 is to modify the `repository` setting - for example:
diff --git a/developer/contribute_to_the_docs.md b/developer/contribute_to_the_docs.md
index a3caf02..8318116 100644
--- a/developer/contribute_to_the_docs.md
+++ b/developer/contribute_to_the_docs.md
@@ -79,7 +79,7 @@
 * [Development Guide](developer/developer.md)
     * [Getting the Source Code](developer/getting_the_code.md)
     * [Modeling Services](developer/xos-intro.md)
-    * [Developer Workflows](developer/workflows.md)
+    * [Developer Workflows](local.md)
         * [Service Migrations](xos/dev/xosmigrate.md)
     * [Building Docker Images](developer/imagebuilder.md)
     * [GUI Development](xos-gui/developer/README.md)
diff --git a/developer/imagebuilder.md b/developer/imagebuilder.md
deleted file mode 100644
index 6dc23bc..0000000
--- a/developer/imagebuilder.md
+++ /dev/null
@@ -1,218 +0,0 @@
-# Building Docker Images with imagebuilder
-
-CORD consists of many interrelated Docker images.
-Making sure that the images used in a deployment are consistent with
-the source tree is a challenge we address with a tool called `imagebuilder`.
-`imagebuilder` is currently used to build the XOS, ONOS, and the `mavenrepo`
-(source of ONOS Apps used in CORD) images.
-
-While `imagebuilder` pulls down required images from DockerHub and
-builds/tags images, it does not push those images or delete obsolete
-ones. These tasks are left to other software (Ansible, Jenkins), which
-should take in YAML output from `imagebuilder` and then perform the
-appropriate actions.
-
-## Obtaining and Rebuilding Images
-
-For the normal build process, you won't need to manually download
-images as the `docker-images` make target that runs `imagebuilder`
-will automatically be run as a part of the build process.
-
-If you do need to rebuild images, there is a `make clean-images` target that
-forces `imagebuilder` to be run again and images to be moved into place.
-
-## Adding a new Docker Image to CORD
-
-There are several cases where an Image might need to be added to CORD.
-
-### Adding an Image Developed Outside of CORD
-
-There are cases where a 3rd party image developed outside of CORD may be
-needed. This is the case with ONOS, Redis, and a few other pieces of software
-that are already containerized, and we deploy as-is (or with minor
-modifications).
-
-To do this, add the full name of the image, including a version tag, to the
-`pull_only_images` list in the `docker_images.yml` file.   As frequently only a
-subset of this list is needed for a specific helm chart, you can create a YAML
-file with a `docker_image_whitelist` list - see
-`cord/helm-charts/examples/*-images.yaml` for examples.
-
-These images are retagged with a `candidate` tag after being pulled.
-
-### Adding a Synchronizer Image
-
-Adding a synchronizer image is usually as simple as adding it to the
-`buildable_images` list in the `automation-tools/developer/docker_images.yml`
-file.
-
-If you are adding a new service that is not in the repo manifest yet, you may
-have to add your service's directory to the `.repo/manifest.xml` file and then
-list it in `build/docker_images.yml`, so it can build the synchronizer image
-locally.
-
-### Adding Other CORD Images
-
-If you want `imagebuilder` to build an image from a Dockerfile somewhere in the
-CORD source tree, you need to add it to the `buildable_images` list in the
-`docker_images.yml` file (see that file for the specific format), then making
-sure the image name is listed in the `docker_image_whitelist` list.
-
-Note that you don't need to add external parent images to the
-`pull_only_images` in this manner - those are determined by the `FROM` line in
-`Dockerfile`
-
-## Debugging imagebuilder
-
-If you get a different error or  think that `imagebuilder` isn't working
-correctly, please rerun it with the `-vv` ("very verbose") option, read through
-the output carefully, and then post about the issue on the mailing list or
-Slack.
-
-If an image is not found on Dockerhub (for example, if you have local
-modifications to the `Dockerfile` or context, or are have a patchset checked
-out), you may see a 404 error like the following in the logs. If this happens,
-imagebuilder will attempt to build the image from scratch rather than pulling
-it:
-
-```python
-NotFound: 404 Client Error: Not Found ("{"message":"manifest for xosproject/xos-gui-extension-builder:<hash> not found"}")
-```
-
-Run `imagebuilder.py -h` for a list of other supported arguments.
-
-## How imagebuilder Works
-
-The `imagebuilder` program performs the following steps when run:
-
-1. Reads the [repo manifest file](https://github.com/opencord/manifest/blob/master/default.xml)
-   (checked out as `.repo/manifest`) to get a list of the CORD git repositories.
-
-2. Reads the `automation-tools/developer/docker_images.yml` file and optionally
-   a filter file with a `docker_image_whitelist` list.
-
-3. For every container that is needed, reads the Dockerfile and determines if
-   any parent images are needed, and creates a tree to order image building.
-
-4. Determines which images need to be rebuilt based on:
-
-    * Whether the image exists and has current tags on it. If an image is
-      tagged with the `candidate` tag, but shouldn't be this tag is removed.
-    * If the Docker build context is *dirty* or differs (is on a different
-      branch) from the git tag specified in the repo manifest
-    * If the image's parent (or grandparent, etc.) needs to be rebuilt
-
-5. Using this information downloads (pulls) or builds images as needed in a
-   way that is consistent with the CORD source that is on disk.  If an image
-   build is needed, the Docker output of that build is saved to
-   `build/image_logs` on the system where Imagebuilder executes (the
-   `buildhost` in inventory).
-
-6. Tags the image with the `candidate` and (if clean) git hash tags.
-
-7. Creates a YAML output file that describes the work it performed, for later
-   use (pushing images, retagging, etc.), and optional a graphviz `.dot` graph
-   file showing the relationships between images.
-
-## Image Tagging
-
-CORD container images frequently have multiple tags. The two most
-common tags are:
-
-* The string `candidate`, which says that the container is ready to be deployed
-  on a CORD POD
-* The git commit hash, which is either pulled from DockerHub, or applied when a
-  container is built from an untouched (according to git) source tree.  Images
-  built from a modified source tree will not be tagged in this way.
-
-`imagebuilder` use this git hash tag as well as labels on the image of the git
-repos of parent images to determine whether an image is correctly built from
-the checked out source tree.
-
-## Image Labels
-
-`imagebuilder` uses a Docker label scheme to determine whether an
-image needs to be rebuilt, which is added to the image when it is
-built. Docker images used in CORD must apply labels in their
-Dockerfiles which are specified by
-[label-schema.org](http://label-schema.org); look there for examples,
-and below for a few notes that clear up the ambiguity within that spec.
-
-Required labels for every CORD image:
-
-* `org.label-schema.version`
-* `org.label-schema.name`
-* `org.label-schema.vcs-url`
-* `org.label-schema.build-date`
-
-Required for clean builds:
-
-* `org.label-schema.version` : *git branch name, ex: `opencord/master`,
-  `opencord/cord-4.0`, , etc.*
-* `org.label-schema.vcs-ref` : *the full 40 character SHA-1 git commit hash,
-  not shortened*
-
-Required for dirty builds:
-
-* `org.label-schema.version` : *set to the string `dirty` if there is any
-  differences from the master commit to the build context (either on a
-  different branch, or untracked/changed files in context)*
-* `org.label-schema.vcs-ref` - *set to a commit hash if build context is clean
-  (ie, on another unnamed branch/patchset), or the empty string if the build
-  context contains untracked/changed files.*
-
-For images that use components from another repo (like chameleon being
-integrated with the XOS containers, or maven repo which contains artifacts from
-multiple onos-apps repos), the following labels should be set for every
-sub-component, with the repo name (same as org.label-schema.name) replacing
-`<reponame>`, and the value being the same value as the label-schema
-one would be:
-
-* `org.opencord.component.<reponame>.version`
-* `org.opencord.component.<reponame>.vcs-ref`
-* `org.opencord.component.<reponame>.vcs-url`
-
-These labels are applied by using the `ARG` and `LABEL` option in the
-Dockerfile. The following is an example set of labels for an image that uses
-files from the chameleon and XOS repositories as components:
-
-```dockerfile
-# Label image
-ARG org_label_schema_schema_version=1.0
-ARG org_label_schema_name=openstack-synchronizer
-ARG org_label_schema_version=unknown
-ARG org_label_schema_vcs_url=unknown
-ARG org_label_schema_vcs_ref=unknown
-ARG org_label_schema_build_date=unknown
-ARG org_opencord_vcs_commit_date=unknown
-ARG org_opencord_component_chameleon_version=unknown
-ARG org_opencord_component_chameleon_vcs_url=unknown
-ARG org_opencord_component_chameleon_vcs_ref=unknown
-ARG org_opencord_component_xos_version=unknown
-ARG org_opencord_component_xos_vcs_url=unknown
-ARG org_opencord_component_xos_vcs_ref=unknown
-
-LABEL org.label-schema.schema-version=$org_label_schema_schema_version \
-      org.label-schema.name=$org_label_schema_name \
-      org.label-schema.version=$org_label_schema_version \
-      org.label-schema.vcs-url=$org_label_schema_vcs_url \
-      org.label-schema.vcs-ref=$org_label_schema_vcs_ref \
-      org.label-schema.build-date=$org_label_schema_build_date \
-      org.opencord.vcs-commit-date=$org_opencord_vcs_commit_date \
-      org.opencord.component.chameleon.version=$org_opencord_component_chameleon_version \
-      org.opencord.component.chameleon.vcs-url=$org_opencord_component_chameleon_vcs_url \
-      org.opencord.component.chameleon.vcs-ref=$org_opencord_component_chameleon_vcs_ref \
-      org.opencord.component.xos.version=$org_opencord_component_xos_version \
-      org.opencord.component.xos.vcs-url=$org_opencord_component_xos_vcs_url \
-      org.opencord.component.xos.vcs-ref=$org_opencord_component_xos_vcs_ref
-```
-
-Labels on a built image can be seen by running `docker inspect <image name or id>`
-
-## Automating Image Builds
-
-There is a [Jenkinsfile.imagebuilder](https://github.com/opencord/cord/blob/{{
-book.branch }}/Jenkinsfile.imagebuilder) that can be run in a Jenkins
-instance and will build and push images to DockerHub. This is how the CORD
-team pre-builds and publishes images for public use.
-
diff --git a/developer/workflows.md b/developer/workflows/local.md
similarity index 81%
rename from developer/workflows.md
rename to developer/workflows/local.md
index ba1fb7a..b3afe5d 100644
--- a/developer/workflows.md
+++ b/developer/workflows/local.md
@@ -1,4 +1,4 @@
-# Developer Workflows
+# Local Development
 
 This section describes a typical workflow for developing the CORD
 control plane. This workflow does not include any data plane
@@ -9,7 +9,7 @@
 It is straightforward to set up a local Kubernetes environment on your laptop.
 The recommended way to do this is to use Minikube. This guide assumes
 you have done that. See the
-[Single-Node](../prereqs/k8s-single-node.md) case in the
+[Single-Node](../../prereqs/k8s-single-node.md) case in the
 Installation Guide for more information, or you can go directly
 to the documentation for Minikube:
 <https://kubernetes.io/docs/getting-started-guides/minikube/#installation>
@@ -32,15 +32,15 @@
 
 In this folder you can choose from the different charts which one to
 deploy. For example to deploy SEBA you can follow
-[these instructions](../profiles/seba/install.md). Alternatively, if
+[these instructions](../../profiles/seba/install.md). Alternatively, if
 you are working on a new profile or a new service that is not part of
 any existing profile, you can install just the
-[CORD Platform](../installation/platform.md).
+[CORD Platform](../../installation/platform.md).
 
 ## Making and Deploying Changes
 
 Assuming you have
-[downloaded the CORD source code](getting_the_code.md) and the entire
+[downloaded the CORD source code](../getting_the_code.md) and the entire
 source tree for CORD is under `~/cord`, you can edit and re-deploy the
 code as follows.
 
@@ -56,19 +56,18 @@
 eval $(minikube docker-env)
 ```
 
-You will then need to build the containers from source:
+You will then need to build the containers from source, so enter the repo you modified:
 
 ```shell
-cd ~/cord/automation-tools/developer
-python imagebuilder.py -f ../../helm-charts/examples/filter-images.yaml -x
+cd ~/cord/orchestration/xos-services/rcord
+DOCKER_REPOSITORY=xosproject/ DOCKER_TAG=candidate make docker-build
 ```
 
 At this point, the images containing your changes will be available
 in the Docker environment used by Minikube.
 
-> **Note:** In some cases you can rebuild a single docker image to make the process
-> faster, but this assume that you have a good knowledge of the system and you
-> know what you’re doing.
+> **Note:** In some cases the command to build the docker image may vary. 
+> Please check the Makefile within the repo for more informations. 
 
 All that is left is to teardown and re-deploy the containers.
 
@@ -94,6 +93,6 @@
 
 The way we recommend doing this is via a private docker registry.
 You can find more information about what a docker registry is in the
-[offline installation section](../installation/offline-install.md).
+[offline installation section](../../installation/offline-install.md).
 
 {% include "/partials/push-images-to-registry.md" %}
diff --git a/developer/workflows/onos-apps.md b/developer/workflows/onos-apps.md
new file mode 100644
index 0000000..105276a
--- /dev/null
+++ b/developer/workflows/onos-apps.md
@@ -0,0 +1,132 @@
+# Developing ONOS Applications with SEBA in a Box
+
+This tutorial will guide you through the development workflow for ONOS applications in SEBA.
+The `aaa` application will be used as an example, but the same workflow is valid for any
+ONOS application.
+
+### Requirements
+
+In order to follow this tutorial you need to:
+
+- have a remote machine to run [SEBA-in-a-Box](../../profiles/seba/siab.md)
+- have the Java SDK installed on your development machine
+- have the CORD code (we suggest to download the code using [this guide](../getting_the_code.md#download-cord-repositories))
+
+{% include "/partials/siab-short.md" %}
+
+## Test applications on a running setup
+
+We assume you already have done changes to your application code and that you need to build it and push it
+to a running ONOS.
+
+To build the application, just enter the appropriate folder and invoke the `maven` target:
+
+```bash
+cd ~/cord/onos-apps/apps/aaa/
+mvn clean install
+```
+
+Once the application is built, you can push it to ONOS using the `onos-app` command:
+
+```bash
+onos-app -P 30120 -u karaf -p karaf <myregistrydomain.com> reinstall! org.opencord.aaa app/target/aaa-app-1.10.0-SNAPSHOT.oar
+```
+
+where `myregistrydomain.com` is the public `ip` of your `SiaB` machine.
+
+If the commands succeed you should see an output similar to:
+
+```bash
+{"name":"org.opencord.aaa","id":173,"version":"1.10.0.SNAPSHOT","category":"Traffic Steering","description":"802.","readme":"802.1x authentication service.","origin":"ON.Lab","url":"http://onosproject.org","featuresRepo":"mvn:org.opencord/aaa-app/1.10.0-SNAPSHOT/xml/features","state":"ACTIVE","features":["aaa-app"],"permissions":[],"requiredApps":["org.opencord.sadis"]}
+```
+
+**Important!!**
+
+Please remember that the application `.oar` can be generated in a different
+location depending on the application structure and that the version included in the SNAPSHOT file name can differ.
+
+> You can get the `onos-app` command you can get it [here](https://github.com/opennetworkinglab/onos/blob/onos-1.13/tools/package/runtime/bin/onos-app)
+> and add it to your `$PATH`
+
+## Deploy SiaB using development applications
+
+In certain cases you want to deploy SEBA-in-a-box automatically including your development applications,
+for example to verify that the end to end flow is correctly working.
+
+In order to do that you need to:
+
+- make your applications available somewhere for ONOS to download them
+- customize the ONOS applications URL in the helm charts
+
+We suggest to create a `nginx` container and deploy it on top of the kubernetes cluster, but if have a company
+web-server that is reachable by ONOS that can be a viable option.
+
+### Build the mavenrepo container
+
+A `Dockerfile` to build a `nginx` web-server containing development `.oar`s is provided with the code.
+You can build such container by:
+
+```bash
+cd ~/cord/onos-apps
+docker build -t opencord/mavenrepo:candidate -f Dockerfile.apps .
+...
+Successfully built fda11faac37f
+Successfully tagged opencord/mavenrepo:candidate
+```
+
+#### Deploy the mavenrepo container on top of your cluster
+
+> NOTE that this step requires a `docker-registry` to be installed in the cluster.
+> If you don't have it, you can follow [these instructions](./siab.md#deploy-a-docker-registry).
+
+Once the container is build, you can push it to the remote `docker-registry` using these commands:
+
+```bash
+docker tag opencord/mavenrepo:candidate myregistrydomain.com:30500/opencord/mavenrepo:candidate
+docker push myregistrydomain.com:30500/opencord/mavenrepo:candidate
+The push refers to repository [myregistrydomain.com:30500/opencord/mavenrepo]
+2781364a4526: Pushed
+8a32ae098140: Pushed
+7c9c7be9dce0: Pushed
+9a6bd1609bff: Pushed
+77e23640b533: Pushed
+757d7bb101da: Pushed
+3358360aedad: Pushed
+candidate: digest: sha256:38788909e84ffb955a41fd14eea9c19f4596bb9b3b7f3181a1332499b7709b94 size: 1786
+```
+
+where `myregistrydomain.com` is the public `ip` of your `SiaB` machine.
+
+Once the container is loaded in the `docker-registry` you can you `helm` to deploy it from the SiaB host machine:
+
+```bash
+cd ~/cord/helm-charts
+helm install -n mavenrepo cord/mavenrepo --set image.tag=candidate \
+--set image.repository=myregistrydomain.com:30500/opencord/mavenrepo
+```
+
+#### Customize the ONOS applications URL in the helm charts
+
+In order to install custom versions of the application during the installation process, you need to create
+a value file called `~/custom.yaml` (on the SiaB host machine) with the following values:
+
+
+>If you already have a value file to specify other container images you can simply extend that one
+
+
+```yaml
+aaaAppUrl: "myregistrydomain.com:30160/repository/aaa-app-1.10.0-SNAPSHOT.oar"
+aaaAppVersion: "1.10.0.SNAPSHOT"
+```
+
+where `myregistrydomain.com` is the public `ip` of your `SiaB` machine.
+
+You can then install SEBA-in-a-box with:
+
+```bash
+SEBAVALUES=~/custom.yaml make
+```
+
+> You can find a full list of the application names and URLs here:
+> - https://github.com/opencord/helm-charts/blob/master/xos-profiles/seba-services/values.yaml#L43-L53 
+> - https://github.com/opencord/helm-charts/blob/master/workflows/att-workflow/values.yaml#L40-L41
\ No newline at end of file
diff --git a/developer/workflows/siab.md b/developer/workflows/siab.md
new file mode 100644
index 0000000..a56d5d6
--- /dev/null
+++ b/developer/workflows/siab.md
@@ -0,0 +1,257 @@
+# SEBA in a Box for development
+
+This tutorial will guide you through the development workflow for a SEBA component using
+the environment provided by SEBA in a Box.
+
+The tutorial will use the `rcord` service as an example, but the same workflow can be used
+for each docker-based component in SEBA. 
+
+If you are working on ONOS applications, you want to take a look at this [tutorial](./onos-apps.md).
+
+> NOTE that the same workflow can be adapted for:
+> - different emulated environment (eg: `MCORD in a Box`)
+> - physical setups
+
+### Requirements
+
+In order to follow this tutorial you need to:
+
+- have a remote machine to run [SEBA-in-a-Box](../../profiles/seba/siab.md)
+- have Docker installed on your development machine (Install docker on [Mac](https://docs.docker.com/docker-for-mac/install/), [Ubuntu](https://docs.docker.com/install/linux/docker-ce/ubuntu/) or [Windows](https://docs.docker.com/docker-for-windows/install/))
+- have the CORD code (we suggest to download the code using [this guide](../getting_the_code.md#download-cord-repositories)) 
+
+{% include "/partials/siab-short.md" %}
+
+## Deploy a docker registry
+
+In order to move Docker images from your laptop to the SEBA in a Box environment you need
+a Docker registry. You can install one using `helm`:
+
+```bash
+helm install stable/docker-registry --set service.nodePort=30500,service.type=NodePort -n docker-registry
+```
+
+### Configure docker to push to an insecure registry
+
+The registry deployed via `helm` is by default an insecure registry (it uses `http` instead of `https`)
+thus `docker` requires that you explicitly authorize that registry.
+
+You can find more informations about insecure registries on the [docker documentation](https://docs.docker.com/registry/insecure/).
+
+#### MacOS
+
+To open the `Docker` preferences click on the icon in the status bar (top right of the screen)
+and select `preferences`.
+
+Navigate to the `Daemon` tab and under `Insecure registries` add the `ip` and `port` of the one
+running on your `SiaB` machine:
+
+![docker-registrie-mac-os-x](../../images/docker_config_mac_os.png)
+
+> NOTE that the docker-registry endpoint should be `myregistrydomain.com:30500`
+> where `myregistrydomain.com` is the public `ip` of your `SiaB` machine.
+
+Click on `Apply and Restart` to apply your changes.
+
+#### Linux
+
+> This needs to be done on the SiaB machine (and on you machine if it's a Linux based machine)
+
+Edit the `/etc/docker/daemon.json` file and add:
+
+```json
+{
+  "insecure-registries" : ["myregistrydomain.com:30500"]
+}
+```
+
+where `myregistrydomain.com` is the public `ip` of your `SiaB` machine.
+
+Then restart the docker daemon with: `sudo service docker restart`
+
+## Make changes and publish the image
+
+Once you make the appropriate changes to the code, you can buid it with:
+
+```bash
+cd ~/cord/orchestration/xos-services/rcord
+DOCKER_REGISTRY=myregistrydomain.com:30500/ DOCKER_REPOSITORY=xosproject/ DOCKER_TAG=candidate make docker-build
+...
+Successfully built 14a4ec8f2906
+Successfully tagged myregistrydomain.com/xosproject/rcord-synchronizer:candidate
+```
+where `myregistrydomain.com` is the public `ip` of your `SiaB` machine.
+
+> **Note:** In some cases the command to build the docker image may vary. 
+> Please check the Makefile within the repo for more informations.
+
+To push the newly built image to your docker registry use this command:
+
+```bash
+cd ~/cord/orchestration/xos-services/rcord
+DOCKER_REGISTRY=myregistrydomain.com:30500/ DOCKER_REPOSITORY=xosproject/ DOCKER_TAG=candidate make docker-push
+docker push myregistrydomain.com:30500/xosproject/rcord-synchronizer:candidate
+The push refers to repository [myregistrydomain.com:30500/xosproject/rcord-synchronizer]
+43b4d40e8ced: Layer already exists
+70019539cd35: Layer already exists
+56585fbf0fe2: Layer already exists
+4929606216d8: Layer already exists
+343eab13e1e3: Layer already exists
+ea7c8d4e60dc: Layer already exists
+7d63eb9a32c4: Layer already exists
+bcf2f368fe23: Layer already exists
+candidate: digest: sha256:f5ecac2ba76c2a81a6f8b82b09e07c53f9ca2f3d272c8861ed7f5ed1ac290ac8 size: 1993
+```
+
+where `myregistrydomain.com` is the public `ip` of your `SiaB` machine.
+
+## Customizing the installation
+
+When `SiaB` is installed with the `make latest` command, a [`values.yaml`](https://github.com/opencord/helm-charts/blob/master/configs/seba-ponsim-latest.yaml) file is applied
+to all the `helm install` commands.
+
+> To know more about `values` files, please check the official [helm documentation](https://helm.sh/docs/chart_template_guide/#values-files)
+
+To customize the installation, download the default `seba-ponsim-latest.yaml` so that you can customize it:
+
+```bash
+curl https://raw.githubusercontent.com/opencord/helm-charts/master/configs/seba-ponsim-latest.yaml -o ~/custom.yaml
+```
+
+### Update the helm chart
+
+To deploy the new container you need to update the helm-chart, but first you need to customize the
+value file.
+
+Open the file you downloaded in `~/custom.yaml` and change the `rcord` section so that it looks like:
+
+```yaml
+rcord:
+  image:
+    repository: "myregistrydomain.com:30500/xosproject/rcord-synchronizer"
+    tag: 'candidate'
+```
+
+The `rcord` service is installed by the `seba-services` helm chart, so you need to upgrade it to
+the new version:
+
+```bash
+cd ~/cord/helm-charts
+helm upgrade --install seba-services xos-profiles/seba-services -f ~/custom.yaml
+```
+
+> NOTE it's important that you upgrade the chart defining the component you are developing.
+> For more informations about the helm charts visit the [Helm reference](../../charts/helm.md) section in the guide.
+
+### Reinstall from scratch
+
+In some cases you want to restart from a clean environment using your images.
+If you do that it is important not to run the `make reset-kubeadm` command as that will
+completely teardown kubernetes, deleting the docker registry.
+
+To remove all the installed containers you can instead use the `make teardown-charts` commands.
+
+Once all the containers have been removed, you can reinstall everything using your value file with:
+
+```bash
+SEBAVALUES=~/custom.yaml make
+```
+
+> NOTE that the `latest` target is not needed as we are specifying a custom value file through the `SEBAVALUES` variable.
+
+## Troubleshooting
+
+If you are facing issues with this development workflow, please report your problem on the [SEBA-dev](https://groups.google.com/a/opennetworking.org/forum/#!forum/seba-dev)
+or [CORD-dev](https://groups.google.com/a/opencord.org/forum/#!forum/cord-dev) mailing lists, or contact `@teone` on slack.
+
+## FAQs
+
+### I want to update an image that comes from a different chart, how do I know the value file structure?
+
+If you're not familiar with how value files work we suggest to read the [official documentation](https://helm.sh/docs/chart_template_guide/#values-files)
+but to make it short you can look for the `values.yaml` file in the helm chart you are working with.
+
+> If the helm chart is installed as a requirement of another chart also look for the requirement name
+> in the parent chart. For example the `rcord` chart is installed as part of [`seba-services`](https://github.com/opencord/helm-charts/blob/master/xos-profiles/seba-services/requirements.yaml#L17-L19)
+> and that's why we nest the customization under `rcord`.
+
+### Why do I need a remote docker-registry?
+
+We have a talk about this topic during ONF Connect 2018, you can find the recording [here](https://vimeo.com/307548812/cf9c31e226)
+and the slides [here](https://www.opennetworking.org/wp-content/uploads/2018/12/How-the-New-Platform-Will-Make-Your-Life-Better.pdf).
+
+To explain that in few words, you need a way to move the docker image from the "build" machine to the "host" machine,
+as described in the picture below.
+
+![docker registry](../../images/docker-registry.png)
+
+#### I don't want to use a private docker-registry, can I use Docker Hub?
+
+If you don't want to deploy a docker-registry on the POD, you can use any docker registry.
+The `docker-build/docker-push` commands are flexible enough to accomodate that,
+for example you can build and push the container with these commands:
+
+```bash
+DOCKER_REPOSITORY=matteoscandolo/ DOCKER_TAG=candidate make docker-build
+DOCKER_REPOSITORY=matteoscandolo/ DOCKER_TAG=candidate make docker-push
+```
+
+And customize your value file to fetch that image:
+
+```yaml
+rcord:
+  image:
+    repository: "matteoscandolo/rcord-synchronizer"
+    tag: 'candidate'
+```
+
+#### Can I build images on the SiaB machine and use those?
+
+Yes, you can build the docker containers directly on the SiaB host machine, just be aware that this workflow won't
+transfer to a multi-node cluster.
+
+If you build the `rcord-synchronizer` docker image on the SiaB machine with:
+
+```bash
+DOCKER_REPOSITORY=xosproject/ DOCKER_TAG=candidate make docker-build
+```
+ 
+you can change the `custom.yaml` value file in this way to use it:
+
+```yaml
+rcord:
+  image:
+    tag: 'candidate'
+    pullPolicy: 'IfNotPresent'
+``` 
+
+> For more information about this workflow we suggest to take a look at the talk mentioned in the [Why do I need a remote docker-registry?](./siab.md#why-do-i-need-a-remote-docker-registry) section. 
+
+### Can use the same workflow to test VOLTHA images?
+
+Yes, the workflow to test VOLTHA images is absolutely the same, but some of the commands are different.
+
+On your local machine you can build VOLTHA images with:
+
+```bash
+cd ~/cord/incubator/voltha
+REPOSITORY=voltha/ TAG=candidate VOLTHA_BUILD=docker make build
+```
+
+Then you need to tag and push the images you want to upload with:
+
+```bash
+docker tag voltha/voltha-voltha:candidate myregistrydomain.com:30500/voltha/voltha-voltha:candidate
+docker push myregistrydomain.com:30500/voltha/voltha-voltha:candidate
+```
+
+where `myregistrydomain.com` is the public `ip` of your `SiaB` machine.
+
+And update you `custom.yaml` value file on the SiaB machine with:
+
+```yaml
+images:
+  vcore:
+    repository: "myregistrydomain.com:30500/voltha/voltha-voltha"
+    tag: 'candidate'
+```
\ No newline at end of file
diff --git a/images/docker-registry.png b/images/docker-registry.png
new file mode 100644
index 0000000..2096aab
--- /dev/null
+++ b/images/docker-registry.png
Binary files differ
diff --git a/images/docker_config_mac_os.png b/images/docker_config_mac_os.png
new file mode 100644
index 0000000..742ac49
--- /dev/null
+++ b/images/docker_config_mac_os.png
Binary files differ
diff --git a/partials/siab-short.md b/partials/siab-short.md
new file mode 100644
index 0000000..81bdcc4
--- /dev/null
+++ b/partials/siab-short.md
@@ -0,0 +1,15 @@
+## Preparing SEBA in a Box
+
+We suggest to refer to [this](../../profiles/seba/siab.md) guide to deploy SEBA in a Box, but for simplicity
+the commands are replicated here:
+
+```bash
+mkdir -p ~/cord
+cd ~/cord
+git clone https://gerrit.opencord.org/automation-tools
+cd automation-tools/seba-in-a-box
+make latest
+``` 
+
+> NOTE that for development we suggest do use the `latest` available version of all the components,
+> but in certain cases (eg: bugfixes) you may want to use `make stable`
\ No newline at end of file
diff --git a/styles/website.css b/styles/website.css
index 42ecd82..44e4555 100644
--- a/styles/website.css
+++ b/styles/website.css
@@ -18,4 +18,5 @@
     border: 1px solid rgba(0, 0, 0, 0.07);
     border-radius: 3px;
     padding: 0 20px !important;
+    margin-top: 150px;
 }
\ No newline at end of file