From 6c5e82e0966d5752560aa152bc12d68669231527 Mon Sep 17 00:00:00 2001
From: Pete Birley <pete@port.direct>
Date: Fri, 2 Jun 2017 16:57:40 -0500
Subject: [PATCH] Multinode-check: 2 Node via kubeadm with NFS

This PS introduces a 2 node check in zuul, it uses the KubeADM-AIO
container to stand up a master and worker node, before deploying
OpenStack-Helm using NFS as a PV backend. This check is a stopgap
untill a 3 node gate is deployed which will use ceph and enable
HA of all components to be tested.

Change-Id: I7bb70e6b103a483a0e1df1492fa2047d229eb86f
---
 tools/gate/provision_gate_worker_node.sh | 58 ++++++++++++++++++++++++
 tools/gate/setup_gate.sh                 | 15 ++++--
 tools/gate/setup_gate_worker_nodes.sh    | 36 +++++++++++++++
 3 files changed, 105 insertions(+), 4 deletions(-)
 create mode 100755 tools/gate/provision_gate_worker_node.sh
 create mode 100755 tools/gate/setup_gate_worker_nodes.sh

diff --git a/tools/gate/provision_gate_worker_node.sh b/tools/gate/provision_gate_worker_node.sh
new file mode 100755
index 0000000000..7bcd64c5db
--- /dev/null
+++ b/tools/gate/provision_gate_worker_node.sh
@@ -0,0 +1,58 @@
+#!/bin/bash
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+set -ex
+
+cd ${WORK_DIR}
+source /etc/os-release
+export HOST_OS=${ID}
+source ${WORK_DIR}/tools/gate/funcs/network.sh
+source ${WORK_DIR}/tools/gate/funcs/kube.sh
+
+kubeadm_aio_reqs_install
+
+# Setup shared mounts for kubelet
+sudo mkdir -p /var/lib/kubelet
+sudo mount --bind /var/lib/kubelet /var/lib/kubelet
+sudo mount --make-shared /var/lib/kubelet
+
+# Cleanup any old deployment
+sudo docker rm -f kubeadm-aio || true
+sudo docker rm -f kubelet || true
+sudo docker ps -aq | xargs -r -l1 sudo docker rm -f
+sudo rm -rfv \
+    /etc/cni/net.d \
+    /etc/kubernetes \
+    /var/lib/etcd \
+    /var/etcd \
+    /var/lib/kubelet/* \
+    /run/openvswitch || true
+
+# Launch Container
+sudo docker run \
+    -dt \
+    --name=kubeadm-aio \
+    --net=host \
+    --security-opt=seccomp:unconfined \
+    --cap-add=SYS_ADMIN \
+    --tmpfs=/run \
+    --tmpfs=/run/lock \
+    --volume=/etc/machine-id:/etc/machine-id:ro \
+    --volume=${HOME}:${HOME}:rw \
+    --volume=/etc/kubernetes:/etc/kubernetes:rw \
+    --volume=/sys/fs/cgroup:/sys/fs/cgroup:ro \
+    --volume=/var/run/docker.sock:/run/docker.sock \
+    --env KUBE_ROLE="worker" \
+    --env KUBELET_CONTAINER="${KUBEADM_IMAGE}" \
+    --env KUBEADM_JOIN_ARGS="--token=${KUBEADM_TOKEN} ${PRIMARY_NODE_IP}:6443" \
+    ${KUBEADM_IMAGE}
diff --git a/tools/gate/setup_gate.sh b/tools/gate/setup_gate.sh
index 8872964ca5..f3ae6986f1 100755
--- a/tools/gate/setup_gate.sh
+++ b/tools/gate/setup_gate.sh
@@ -38,14 +38,21 @@ fi
 net_resolv_pre_kube
 net_hosts_pre_kube
 
+# Setup helm
 helm_install
 helm_serve
 helm_lint
 
+# Setup the K8s Cluster
 if [ "x$INTEGRATION" == "xaio" ]; then
  bash ${WORK_DIR}/tools/gate/kubeadm_aio.sh
- bash ${WORK_DIR}/tools/gate/helm_dry_run.sh
- if [ "x$INTEGRATION_TYPE" == "xbasic" ]; then
-   bash ${WORK_DIR}/tools/gate/basic_launch.sh
- fi
+elif [ "x$INTEGRATION" == "xmulti" ]; then
+ bash ${WORK_DIR}/tools/gate/kubeadm_aio.sh
+ bash ${WORK_DIR}/tools/gate/setup_gate_worker_nodes.sh
+fi
+
+# Deploy OpenStack-Helm
+if [ "x$INTEGRATION_TYPE" == "xbasic" ]; then
+  bash ${WORK_DIR}/tools/gate/helm_dry_run.sh
+  bash ${WORK_DIR}/tools/gate/basic_launch.sh
 fi
diff --git a/tools/gate/setup_gate_worker_nodes.sh b/tools/gate/setup_gate_worker_nodes.sh
new file mode 100755
index 0000000000..ec3aa78832
--- /dev/null
+++ b/tools/gate/setup_gate_worker_nodes.sh
@@ -0,0 +1,36 @@
+#!/bin/bash
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+set -ex
+
+: ${SSH_PRIVATE_KEY:="/etc/nodepool/id_rsa"}
+sudo chown $(whoami) ${SSH_PRIVATE_KEY}
+sudo chmod 600 ${SSH_PRIVATE_KEY}
+
+
+PRIMARY_NODE_IP=$(cat /etc/nodepool/primary_node_private | tail -1)
+KUBEADM_TOKEN=$(sudo docker exec kubeadm-aio kubeadm token list | tail -n -1 | awk '{ print $1 }')
+
+NODE_2=$(cat /etc/nodepool/sub_nodes_private | tail -1)
+
+ssh-keyscan "${NODE_2}" >> ~/.ssh/known_hosts
+ssh -i ${SSH_PRIVATE_KEY} $(whoami)@${NODE_2} mkdir -p ${WORK_DIR%/*}
+scp -i ${SSH_PRIVATE_KEY} -r ${WORK_DIR} $(whoami)@${NODE_2}:${WORK_DIR%/*}
+ssh -i ${SSH_PRIVATE_KEY} $(whoami)@${NODE_2} "export WORK_DIR=${WORK_DIR}; export KUBEADM_TOKEN=${KUBEADM_TOKEN}; export PRIMARY_NODE_IP=${PRIMARY_NODE_IP}; export KUBEADM_IMAGE=${KUBEADM_IMAGE}; bash ${WORK_DIR}/tools/gate/provision_gate_worker_node.sh"
+
+sleep 120
+source ${WORK_DIR}/tools/gate/funcs/kube.sh
+kube_wait_for_pods kube-system 240
+kubectl get nodes --show-all
+kubectl get --all-namespaces all --show-all
+sudo docker exec kubeadm-aio openstack-helm-dev-prep