blob: 3917a927a67e9deae376852b1fff1242e2aecf4b [file] [log] [blame]
Alanny Lopez09e18652017-04-24 15:50:33 -05001#!/bin/bash
2###############################################################################
3#
4# Script used to assist in launching Kubernetes jobs/pods. Expects to be used
Alanny Lopez0e8ad992017-06-19 15:45:23 -05005# as an supplemental script to the scripts that want to launch their containers
6# on a Kubernetes cluster.
Alanny Lopez09e18652017-04-24 15:50:33 -05007#
8###############################################################################
9#
10# Requirements:
11# - Docker login credentials defined inside ~/.docker/config.json
12# - Kubectl installed and configured on machine running the script
13# - Access to a Kubernetes Cluster using v1.5.2 or newer
14# - NFS directories for OpenBMC repo cache, BitBake shared state cache, and
15# shared Jenkins home directory that holds workspaces.
16# - All NFS directories should have RWX permissions for user being used to run
17# the build-setup.sh script
18# - Persistent Volume and Claims created and mounted to NFS directories
19# - Image pull secret exists for image pulls in Kubernetes cluster namespace
20#
21###############################################################################
Alanny Lopeze08e8702018-02-24 18:07:13 -060022# Script Variables:
23# build_scripts_dir The path for the openbmc-build-scripts directory.
24# Default: The parent directory containing this script
25#
26# Kubernetes Variables:
27# imgplsec The image pull secret used to access registry if needed
28# Default: "regkey"
29# imgrepo The registry to use to pull and push images
30# Default: "master.cfc:8500/openbmc/""
31# jobtimeout The amount of time in seconds that the build will wait for
32# the job to be created in the api of the cluster.
33# Default: "60"
34# namespace The namespace to be used within the Kubernetes cluster
35# Default: "openbmc"
36# podtimeout The amount of time in seconds that the build will wait for
37# the pod to start running on the cluster.
38# Default: "600"
39#
40# YAML File Variables (No Defaults):
41# imgname The name the image that will be passed to the kubernetes
42# api to build the containers. The image with the tag
43# imgname will be built in the invoker script. This script
44# will then tag it to include the registry in the name, push
45# it, and update the imgname to be what was pushed to the
46# registry. Users should not include the registry in the
47# original imgname.
48# podname The name of the pod, needed to trace down the logs.
49#
50# Deployment Option Variables (No Defaults):
51# invoker Name of what this script is being called by or for, used
52# to determine the template to use for YAML file.
53# launch Used to determine the template used for the YAML file,
54# normally carried in by sourcing this script in another
55# script that has declared it.
56# log If set to true the script will tail the container logs
57# as part of the bash script.
58# purge If set to true it will delete the created object once this
59# script ends.
60# workaround Used to enable the logging workaround, when set will
61# launch a modified template that waits for a command. In
62# most cases it will be waiting to have a script run via
63# kubectl exec. Required when using a version of Kubernetes
64# that has known issues that impact the retrieval of
65# container logs when using kubectl. Defaulting to be true
66# whenever logging is enabled until ICP upgrades their
67# Kubernetes version to a version that doesn't need this.
Alanny Lopez09e18652017-04-24 15:50:33 -050068#
69###############################################################################
Alanny Lopeze08e8702018-02-24 18:07:13 -060070build_scripts_dir=${build_scripts_dir:-"$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )/.."}
Alanny Lopez09e18652017-04-24 15:50:33 -050071
72# Kubernetes Variables
73namespace=${namespace:-openbmc}
Alanny Lopez09e18652017-04-24 15:50:33 -050074imgrepo=${imgrepo:-master.cfc:8500/openbmc/}
75imgplsec=${imgplsec:-regkey}
Alanny Lopez26b2bc52017-09-29 16:46:00 -050076jobtimeout=${jobtimeout:-60}
77podtimeout=${podtimeout:-600}
Alanny Lopez09e18652017-04-24 15:50:33 -050078
Alanny Lopez0e8ad992017-06-19 15:45:23 -050079# Options which decide script behavior
80invoker=${invoker:-${1}}
81log=${log:-${2}}
82purge=${purge:-${3}}
83launch=${launch:-${4}}
Alanny Lopezd1bb5b32017-09-20 11:32:40 -050084workaround=${workaround:-${log}}
Alanny Lopez0e8ad992017-06-19 15:45:23 -050085
86# Set the variables for the specific invoker to fill in the YAML template
Alanny Lopez26b2bc52017-09-29 16:46:00 -050087# Other variables in the template not declared here are declared by invoker
Alanny Lopez0e8ad992017-06-19 15:45:23 -050088case ${invoker} in
89 OpenBMC-build)
Alanny Lopeza6b7d4b2017-10-19 09:58:25 -050090 wclaim=${wclaim:-jenkins-slave-space}
Alanny Lopez0e8ad992017-06-19 15:45:23 -050091 sclaim=${sclaim:-shared-state-cache}
92 oclaim=${oclaim:-openbmc-reference-repo}
Alanny Lopez51186882017-08-01 16:14:41 -050093 newimgname=${newimgname:-${imgrepo}${distro}:${imgtag}-${ARCH}}
Alanny Lopez0e8ad992017-06-19 15:45:23 -050094 podname=${podname:-openbmc${BUILD_ID}-${target}-builder}
95 ;;
96 QEMU-build)
Alanny Lopez634ce362017-06-23 12:57:05 -050097 podname=${podname:-qemubuild${BUILD_ID}}
Alanny Lopeza6b7d4b2017-10-19 09:58:25 -050098 wclaim=${wclaim:-jenkins-slave-space}
Alanny Lopez634ce362017-06-23 12:57:05 -050099 qclaim=${qclaim:-qemu-repo}
Alanny Lopez51186882017-08-01 16:14:41 -0500100 newimgname="${imgrepo}${imgname}"
Alanny Lopez0e8ad992017-06-19 15:45:23 -0500101 ;;
102 QEMU-launch)
Alanny Lopez07b4d5b2017-08-01 16:24:07 -0500103 deployname=${deployname:-qemu-launch-deployment}
104 podname=${podname:-qemu-instance}
105 replicas=${replicas:-5}
Alanny Lopeza6b7d4b2017-10-19 09:58:25 -0500106 wclaim=${wclaim:-jenkins-slave-space}
107 jenkins_subpath=${jenkins_subpath:-Openbmc-Build/openbmc/build}
Alanny Lopezeba5ad42017-08-18 14:48:37 -0500108 newimgname="${imgrepo}qemu-instance"
Alanny Lopez0e8ad992017-06-19 15:45:23 -0500109 ;;
110 XCAT-launch)
111 ;;
112 generic)
113 ;;
114 *)
115 exit 1
116 ;;
117esac
118
Alanny Lopez26b2bc52017-09-29 16:46:00 -0500119# Tag the image created by the invoker with a name that includes the imgrepo
Alanny Lopez51186882017-08-01 16:14:41 -0500120docker tag ${imgname} ${newimgname}
121imgname=${newimgname}
Alanny Lopez09e18652017-04-24 15:50:33 -0500122
123# Push the image that was built to the image repository
124docker push ${imgname}
125
Alanny Lopezeba5ad42017-08-18 14:48:37 -0500126if [[ "$ARCH" == x86_64 ]]; then
127 ARCH=amd64
128fi
Alanny Lopez26b2bc52017-09-29 16:46:00 -0500129
Alanny Lopezd1bb5b32017-09-20 11:32:40 -0500130extras=""
131if [[ "${workaround}" == "true" ]]; then
132 extras+="-v2"
133fi
134
Alanny Lopeze08e8702018-02-24 18:07:13 -0600135yamlfile=$(eval "echo \"$(<${build_scripts_dir}/kubernetes/Templates/${invoker}-${launch}${extras}.yaml)\"")
Alanny Lopez09e18652017-04-24 15:50:33 -0500136kubectl create -f - <<< "${yamlfile}"
137
Alanny Lopez26b2bc52017-09-29 16:46:00 -0500138# If launch is a job we have to find the podname with identifiers
139if [[ "${launch}" == "job" ]]; then
140 while [ -z ${replace} ]
141 do
142 if [ ${jobtimeout} -lt 0 ]; then
143 kubectl delete -f - <<< "${yamlfile}"
Gunnar Mills5f811802017-10-25 16:10:27 -0500144 echo "Timeout occurred before job was present in the API"
Alanny Lopez26b2bc52017-09-29 16:46:00 -0500145 exit 1
146 else
147 sleep 1
148 let jobtimeout-=1
149 fi
150 replace=$(kubectl get pods -n ${namespaces} | grep ${podname} | awk 'print $1')
151 done
152 podname=${replace}
153fi
154
155
Alanny Lopez09e18652017-04-24 15:50:33 -0500156# Once pod is running track logs
Alanny Lopez0e8ad992017-06-19 15:45:23 -0500157if [[ "${log}" == true ]]; then
158 # Wait for Pod to be running
Alanny Lopez259185c2017-10-12 15:39:03 -0500159 checkstatus="kubectl describe pod ${podname} -n ${namespace}"
160 status=$( ${checkstatus} | grep Status: )
Alanny Lopez26b2bc52017-09-29 16:46:00 -0500161 while [ -z "$( echo ${status} | grep Running)" ]
Alanny Lopez51186882017-08-01 16:14:41 -0500162 do
Alanny Lopez26b2bc52017-09-29 16:46:00 -0500163 if [ ${podtimeout} -lt 0 ]; then
Alanny Lopez0e8ad992017-06-19 15:45:23 -0500164 kubectl delete -f - <<< "${yamlfile}"
Gunnar Mills5f811802017-10-25 16:10:27 -0500165 echo "Timeout occurred before pod was Running"
Alanny Lopez0e8ad992017-06-19 15:45:23 -0500166 exit 1
167 else
168 sleep 1
Alanny Lopez26b2bc52017-09-29 16:46:00 -0500169 let podtimeout-=1
Alanny Lopez0e8ad992017-06-19 15:45:23 -0500170 fi
Alanny Lopez259185c2017-10-12 15:39:03 -0500171 status=$( ${checkstatus} | grep Status: )
Alanny Lopez0e8ad992017-06-19 15:45:23 -0500172 done
Alanny Lopezd1bb5b32017-09-20 11:32:40 -0500173 # Tail the logs of the pod, if workaround enabled start executing build script instead.
174 if [[ "${workaround}" == "true" ]]; then
175 kubectl exec -it ${podname} -n ${namespace} ${WORKSPACE}/build.sh
176 else
177 kubectl logs -f ${podname} -n ${namespace}
178 fi
Alanny Lopez0e8ad992017-06-19 15:45:23 -0500179fi
Alanny Lopez09e18652017-04-24 15:50:33 -0500180
Alanny Lopez0e8ad992017-06-19 15:45:23 -0500181# Delete the object if purge is true
182if [[ "${purge}" == true ]]; then
183 kubectl delete -f - <<< "${yamlfile}"
184fi