Fix README references
[multicloud/k8s.git] / vagrant / installer.sh
1 #!/bin/bash
2 # SPDX-license-identifier: Apache-2.0
3 ##############################################################################
4 # Copyright (c) 2018
5 # All rights reserved. This program and the accompanying materials
6 # are made available under the terms of the Apache License, Version 2.0
7 # which accompanies this distribution, and is available at
8 # http://www.apache.org/licenses/LICENSE-2.0
9 ##############################################################################
10
11 set -o errexit
12 set -o nounset
13 set -o pipefail
14
15 # usage() - Prints the usage of the program
16 function usage {
17     cat <<EOF
18 usage: $0 [-a addons] [-p] [-v] [-w dir ]
19 Optional Argument:
20     -a List of Kubernetes AddOns to be installed ( e.g. "ovn-kubernetes virtlet multus")
21     -p Installation of ONAP MultiCloud Kubernetes plugin
22     -v Enable verbosity
23     -w Working directory
24     -t Running healthchecks
25 EOF
26 }
27
28 # _install_go() - Install GoLang package
29 function _install_go {
30     version=$(grep "go_version" ${krd_playbooks}/krd-vars.yml | awk -F ': ' '{print $2}')
31     local tarball=go$version.linux-amd64.tar.gz
32
33     if $(go version &>/dev/null); then
34         return
35     fi
36
37     wget https://dl.google.com/go/$tarball
38     tar -C /usr/local -xzf $tarball
39     rm $tarball
40
41     export PATH=$PATH:/usr/local/go/bin
42     sed -i "s|^PATH=.*|PATH=\"$PATH\"|" /etc/environment
43     export INSTALL_DIRECTORY=/usr/local/bin
44     curl https://raw.githubusercontent.com/golang/dep/master/install.sh | sh
45 }
46
47 # _install_pip() - Install Python Package Manager
48 function _install_pip {
49     if $(pip --version &>/dev/null); then
50         return
51     fi
52     apt-get install -y python-dev
53     curl -sL https://bootstrap.pypa.io/get-pip.py | python
54     pip install --upgrade pip
55 }
56
57 # _install_ansible() - Install and Configure Ansible program
58 function _install_ansible {
59     mkdir -p /etc/ansible/
60     cat <<EOL > /etc/ansible/ansible.cfg
61 [defaults]
62 host_key_checking = false
63 EOL
64     if $(ansible --version &>/dev/null); then
65         return
66     fi
67     _install_pip
68     pip install ansible
69 }
70
71 # _install_docker() - Download and install docker-engine
72 function _install_docker {
73     local max_concurrent_downloads=${1:-3}
74
75     if $(docker version &>/dev/null); then
76         return
77     fi
78     apt-get install -y software-properties-common linux-image-extra-$(uname -r) linux-image-extra-virtual apt-transport-https ca-certificates curl
79     curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
80     add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
81     apt-get update
82     apt-get install -y docker-ce
83
84     mkdir -p /etc/systemd/system/docker.service.d
85     if [ $http_proxy ]; then
86         cat <<EOL > /etc/systemd/system/docker.service.d/http-proxy.conf
87 [Service]
88 Environment="HTTP_PROXY=$http_proxy"
89 EOL
90     fi
91     if [ $https_proxy ]; then
92         cat <<EOL > /etc/systemd/system/docker.service.d/https-proxy.conf
93 [Service]
94 Environment="HTTPS_PROXY=$https_proxy"
95 EOL
96     fi
97     if [ $no_proxy ]; then
98         cat <<EOL > /etc/systemd/system/docker.service.d/no-proxy.conf
99 [Service]
100 Environment="NO_PROXY=$no_proxy"
101 EOL
102     fi
103     systemctl daemon-reload
104     echo "DOCKER_OPTS=\"-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --max-concurrent-downloads $max_concurrent_downloads \"" >> /etc/default/docker
105     usermod -aG docker $USER
106
107     systemctl restart docker
108     sleep 10
109 }
110
111 # install_k8s() - Install Kubernetes using kubespray tool
112 function install_k8s {
113     echo "Deploying kubernetes"
114     local dest_folder=/opt
115     version=$(grep "kubespray_version" ${krd_playbooks}/krd-vars.yml | awk -F ': ' '{print $2}')
116     local tarball=v$version.tar.gz
117
118     apt-get install -y sshpass
119     _install_ansible
120     wget https://github.com/kubernetes-incubator/kubespray/archive/$tarball
121     tar -C $dest_folder -xzf $tarball
122     rm $tarball
123
124     pushd $dest_folder/kubespray-$version
125         pip install -r requirements.txt
126         rm -f $krd_inventory_folder/group_vars/all.yml 2> /dev/null
127         if [[ -n "${verbose+x}" ]]; then
128             echo "kube_log_level: 5" >> $krd_inventory_folder/group_vars/all.yml
129         else
130             echo "kube_log_level: 2" >> $krd_inventory_folder/group_vars/all.yml
131         fi
132         if [[ -n "${http_proxy+x}" ]]; then
133             echo "http_proxy: \"$http_proxy\"" >> $krd_inventory_folder/group_vars/all.yml
134         fi
135         if [[ -n "${https_proxy+x}" ]]; then
136             echo "https_proxy: \"$https_proxy\"" >> $krd_inventory_folder/group_vars/all.yml
137         fi
138         ansible-playbook $verbose -i $krd_inventory cluster.yml -b | tee $log_folder/setup-kubernetes.log
139     popd
140
141     # Configure environment
142     mkdir -p $HOME/.kube
143     mv $krd_inventory_folder/artifacts/admin.conf $HOME/.kube/config
144 }
145
146 # install_addons() - Install Kubenertes AddOns
147 function install_addons {
148     echo "Installing Kubernetes AddOns"
149     apt-get install -y sshpass
150     _install_ansible
151     ansible-galaxy install -r $krd_folder/galaxy-requirements.yml --ignore-errors
152
153     ansible-playbook $verbose -i $krd_inventory $krd_playbooks/configure-krd.yml | tee $log_folder/setup-krd.log
154     for addon in $addons; do
155         echo "Deploying $addon using configure-$addon.yml playbook.."
156         ansible-playbook $verbose -i $krd_inventory $krd_playbooks/configure-${addon}.yml | tee $log_folder/setup-${addon}.log
157         if [[ -n "${testing_enabled+x}" ]]; then
158             pushd $krd_tests
159             bash ${addon}.sh
160             popd
161         fi
162     done
163 }
164
165 # install_plugin() - Install ONAP Multicloud Kubernetes plugin
166 function install_plugin {
167     echo "Installing multicloud/k8s plugin"
168     _install_go
169     _install_docker
170     pip install docker-compose
171
172     mkdir -p /opt/{kubeconfig,consul/config}
173     cp $HOME/.kube/config /opt/kubeconfig/krd
174     export KUBE_CONFIG_DIR=/opt/kubeconfig
175     echo "export KUBE_CONFIG_DIR=${KUBE_CONFIG_DIR}" >> /etc/environment
176
177     GOPATH=$(go env GOPATH)
178     pushd $GOPATH/src/k8-plugin-multicloud/deployments
179     ./build.sh
180
181     if [[ -n "${testing_enabled+x}" ]]; then
182         docker-compose up -d
183         pushd $krd_tests
184         for functional_test in plugin plugin_edgex; do
185             bash ${functional_test}.sh
186         done
187         popd
188     fi
189     popd
190 }
191
192 # _print_kubernetes_info() - Prints the login Kubernetes information
193 function _print_kubernetes_info {
194     if ! $(kubectl version &>/dev/null); then
195         return
196     fi
197     # Expose Dashboard using NodePort
198     node_port=30080
199     KUBE_EDITOR="sed -i \"s|type\: ClusterIP|type\: NodePort|g\"" kubectl -n kube-system edit service kubernetes-dashboard
200     KUBE_EDITOR="sed -i \"s|nodePort\: .*|nodePort\: $node_port|g\"" kubectl -n kube-system edit service kubernetes-dashboard
201
202     master_ip=$(kubectl cluster-info | grep "Kubernetes master" | awk -F ":" '{print $2}')
203
204     printf "Kubernetes Info\n===============\n" > $k8s_info_file
205     echo "Dashboard URL: https:$master_ip:$node_port" >> $k8s_info_file
206     echo "Admin user: kube" >> $k8s_info_file
207     echo "Admin password: secret" >> $k8s_info_file
208 }
209
210 # Configuration values
211 addons="virtlet ovn-kubernetes multus"
212 krd_folder="$(dirname "$0")"
213 verbose=""
214
215 while getopts "a:pvw:t" opt; do
216     case $opt in
217         a)
218             addons="$OPTARG"
219             ;;
220         p)
221             plugin_enabled="true"
222             ;;
223         v)
224             set -o xtrace
225             verbose="-vvv"
226             ;;
227         w)
228             krd_folder="$OPTARG"
229             ;;
230         t)
231             testing_enabled="true"
232             ;;
233         ?)
234             usage
235             exit
236             ;;
237     esac
238 done
239 log_folder=/var/log/krd
240 krd_inventory_folder=$krd_folder/inventory
241 krd_inventory=$krd_inventory_folder/hosts.ini
242 krd_playbooks=$krd_folder/playbooks
243 krd_tests=$krd_folder/tests
244 k8s_info_file=$krd_folder/k8s_info.log
245
246 mkdir -p $log_folder
247 mkdir -p /opt/csar
248 export CSAR_DIR=/opt/csar
249 echo "export CSAR_DIR=${CSAR_DIR}" >> /etc/environment
250
251 # Install dependencies
252 # Setup proxy variables
253 if [ -f $krd_folder/sources.list ]; then
254     mv /etc/apt/sources.list /etc/apt/sources.list.backup
255     cp $krd_folder/sources.list /etc/apt/sources.list
256 fi
257 apt-get update
258 install_k8s
259 install_addons
260 if [[ -n "${plugin_enabled+x}" ]]; then
261     install_plugin
262 fi
263 _print_kubernetes_info