VOL-3014 - configure multiple ofagent controllers

Also added
- an option to untaint the control nodes
- a "clean" command to wipe any port-forwards

Change-Id: I130eac14087bf865139c5daf4d2f9c3123fe5054
diff --git a/README.md b/README.md
index 143c2e1..a59b713 100644
--- a/README.md
+++ b/README.md
@@ -83,6 +83,7 @@
 | `NAME`                                  | TYPE                                                  | Name of the KinD Cluster to be created |
 | `DEPLOY_K8S`                            | yes                                                   | Should the KinD Kubernetes cluster be deployed? |
 | `JUST_K8S`                              | no                                                    | Should just the KinD Kubernetes cluster be depoyed? (i.e. no VOLTHA) |
+| `SCHEDULE_ON_CONTROL_NODES`             | no                                                    | Untaint the control plane (master) K8s nodes so that PODs may be scheduled on them |
 | `VOLTHA_NS`                             | `voltha`                                              | K8s namespace into which to deploy voltha PODs |
 | `INFRA_NS`                              | `default`                                             | K8s namespace into which to deploy infrastructure PODs |
 | `BBSIM_NS`                              | `voltha`                                              | K8s namespace into which to deploy BBSIM PODs |
diff --git a/scripts/monitor.sh b/scripts/monitor.sh
index 24a5319..76f9650 100755
--- a/scripts/monitor.sh
+++ b/scripts/monitor.sh
@@ -23,6 +23,6 @@
 fi
 
 kubectl get --all-namespaces pods,svc && echo "" \
-    &&  kubectl  describe --all-namespaces  pods | grep Image: | grep voltha | sed -e "s/^ *//g" -e "s/: */: /g"  && echo "" \
+    &&  kubectl  describe --all-namespaces  pods | grep Image: | grep '\(voltha\|bbsim\)' | sed -e "s/^ *//g" -e "s/: */: /g"  && echo "" \
     && echo "DB SIZE: $($SCRIPTPATH/etcd-db-size.sh)" && echo "" \
     && echo "RSS SIZE: $(ps -eo rss,pid,$CMD_KEY | grep /usr/local/bin/etcd | grep -v grep | cut -d\  -f1 | numfmt --to=iec | tr '\n' ' ' )"
diff --git a/voltha b/voltha
index b070229..c11912a 100755
--- a/voltha
+++ b/voltha
@@ -88,6 +88,7 @@
 WITH_ETCD=${WITH_ETCD:-yes}
 WITH_PPROF=${WITH_PPROF:-no}
 ONLY_ONE=${ONLY_ONE:-yes}
+SCHEDULE_ON_CONTROL_NODES=${SCHEDULE_ON_CONTROL_NODES:-no}
 CONFIG_SADIS=${CONFIG_SADIS:-no} # yes | no | file | bbsim | external | URL
 SADIS_SUBSCRIBERS=${SADIS_SUBSCRIBERS:-http://bbsim.$VOLTHA_NS.svc:50074/v2/subscribers/%s}
 SADIS_BANDWIDTH_PROFILES=${SADIS_BANDWIDTH_PROFILES:-http://bbsim.$VOLTHA_NS.svc:50074/v2/bandwidthprofiles/%s}
@@ -276,6 +277,7 @@
     ONLY_ONE \
     VOLTHA_DOWN_ON_TIMEOUT \
     LEGACY_BBSIM_INDEX \
+    SCHEDULE_ON_CONTROL_NODES \
     "
 
 OPT_YES_NO="\
@@ -591,7 +593,7 @@
     exit
 fi
 
-if [ $# -ne 1 ] || ! is_in "$1" "up,down,dump"; then
+if [ $# -ne 1 ] || ! is_in "$1" "up,down,dump,clean"; then
     >&2 echo "What wouild you like to do today:"
     >&2 echo "  up   - bring up voltha"
     >&2 echo "  down - tear down voltha"
@@ -818,7 +820,10 @@
 
 kill_port_forward() {
     local TAG P_IDS PARENTS KIDS UNKNOWN PP_ID
-    TAG="$1-$NAME"
+    TAG=
+    if [ "$1" != "__ALL__" ]; then
+        TAG="$1-$NAME"
+    fi
     # shellcheck disable=SC2009
     P_IDS="$(ps e -ww -A | grep "_TAG=$TAG" | grep -v grep | awk '{print $1}')"
     if [ -n "$P_IDS" ]; then
@@ -834,7 +839,7 @@
                 UNKNOWN="$UNKNOWN $P_ID"
             fi
         done
-        (set -x; kill -9 "$PARENTS" "$KIDS" "$UNKNOWN" >>"$LOG" 2>&1) >>"$LOG" 2>&1
+        (set -x; eval "kill -9 $PARENTS $KIDS $UNKNOWN" >>"$LOG" 2>&1) >>"$LOG" 2>&1
     fi
 }
 
@@ -1054,6 +1059,14 @@
     fi
 done
 
+# Force remove any existing k8s port-forward processes. This will
+# remove them for all kind clusters.
+# DKB
+if [ "$1" == "clean" ]; then
+    kill_port_forward __ALL__
+    exit
+fi
+
 helm_values() {
     local NAMESPACE=$1; shift
     local INAME=$1; shift
@@ -1379,6 +1392,15 @@
     printtime $((NOW - STIME))
 fi
 
+if [ "$SCHEDULE_ON_CONTROL_NODES" == "yes" ]; then
+    bspin "Untaint control nodes to allow scheduling $LOCK"
+    for MNODE in $(kubectl get node --selector='node-role.kubernetes.io/master' -o json | jq -r '.items[].metadata.name'); do
+        (set -x; kubectl taint node "$MNODE" node-role.kubernetes.io/master:NoSchedule- >>"$LOG" 2>&1) >>"$LOG" 2>&1
+        sspin
+    done
+    espin "$VERIFIED"
+fi
+
 STIME="$(date +%s)"
 COUNT="$(count_pods "kube-system" ":Running:" "$NO_LABEL" "tiller-deploy-.*")"
 bspin "Verify Helm"
@@ -1945,7 +1967,9 @@
 compare_versions "$RESOLVED_VOLTHA_CHART_VERSION" 2.4.2
 if [ "$?" == "1" ]; then
     # voltha chart > 2.4.2 uses list of controllers
-    INTERNAL_EXTRA_HELM_INSTALL_ARGS+=" --set services.controller[0].service=$_HOST --set services.controller[0].port=$_PORT"
+    for NUM in $(seq 0 $((NUM_OF_ONOS-1))); do
+        INTERNAL_EXTRA_HELM_INSTALL_ARGS+=" --set services.controller[$NUM].service=onos-onos-classic-$NUM.onos-onos-classic-hs.$INFRA_NS.svc.cluster.local --set services.controller[$NUM].port=6653"
+    done
 else
     # voltha chart <= 2.4.2 uses single controller
     INTERNAL_EXTRA_HELM_INSTALL_ARGS+=" --set services.controller.service=$_HOST --set services.controller.port=$_PORT"