blob: f90f4be06eafae33fc95e4f27c4cc91d0b6b0359 [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###############################################################################
22# Variables used to create Kubernetes Job:
23# namespace = the namespace to be used within the Kubernetes cluster
Alanny Lopez09e18652017-04-24 15:50:33 -050024# registry = the registry to use to pull and push images
25# imgplsec = the image pull secret used to access registry if needed
26# timeout = the amount of time in seconds that the build will wait for
27# the pod to start running on the cluster
Alanny Lopez51186882017-08-01 16:14:41 -050028# imgname = the name the image that will be passed to the kubernetes api
29# to build the containers. The image with the tag imgname will
30# be built in the invoker script. This script will then tag it
31# to include the registry in the name, push it, and update the
32# imgname to be what was pushed to the registry. Users should
33# not include the registry in the original imgname.
Alanny Lopez09e18652017-04-24 15:50:33 -050034# podname = the name of the pod, will be needed to trace down the logs
35#
36###############################################################################
Alanny Lopez0e8ad992017-06-19 15:45:23 -050037# Variables that act as script options:
38# invoker = name of what this script is being called by or for, used to
39# determine the template to use for YAML file
40# log = set to true to make the script tail the container logs of pod
41# purge = set to true delete the created object once script completes
42# launch = used to determine the template for YAML file, Usually brought
43# in by sourcing from another script but can be declared
44#
45###############################################################################
Alanny Lopez09e18652017-04-24 15:50:33 -050046
47# Kubernetes Variables
48namespace=${namespace:-openbmc}
Alanny Lopez09e18652017-04-24 15:50:33 -050049imgrepo=${imgrepo:-master.cfc:8500/openbmc/}
50imgplsec=${imgplsec:-regkey}
51timeout=${timeout:-60}
52
Alanny Lopez0e8ad992017-06-19 15:45:23 -050053# Options which decide script behavior
54invoker=${invoker:-${1}}
55log=${log:-${2}}
56purge=${purge:-${3}}
57launch=${launch:-${4}}
58
59# Set the variables for the specific invoker to fill in the YAML template
60# Other variables in the template not declared here are expected to be declared by invoker.
61case ${invoker} in
62 OpenBMC-build)
Alanny Lopezeba5ad42017-08-18 14:48:37 -050063 hclaim=${hclaim:-jenkins-slave-space}
Alanny Lopez0e8ad992017-06-19 15:45:23 -050064 sclaim=${sclaim:-shared-state-cache}
65 oclaim=${oclaim:-openbmc-reference-repo}
Alanny Lopez51186882017-08-01 16:14:41 -050066 newimgname=${newimgname:-${imgrepo}${distro}:${imgtag}-${ARCH}}
Alanny Lopez0e8ad992017-06-19 15:45:23 -050067 podname=${podname:-openbmc${BUILD_ID}-${target}-builder}
68 ;;
69 QEMU-build)
Alanny Lopez634ce362017-06-23 12:57:05 -050070 podname=${podname:-qemubuild${BUILD_ID}}
Alanny Lopezeba5ad42017-08-18 14:48:37 -050071 hclaim=${hclaim:-jenkins-slave-space}
Alanny Lopez634ce362017-06-23 12:57:05 -050072 qclaim=${qclaim:-qemu-repo}
Alanny Lopez51186882017-08-01 16:14:41 -050073 newimgname="${imgrepo}${imgname}"
Alanny Lopez0e8ad992017-06-19 15:45:23 -050074 ;;
75 QEMU-launch)
Alanny Lopez07b4d5b2017-08-01 16:24:07 -050076 deployname=${deployname:-qemu-launch-deployment}
77 podname=${podname:-qemu-instance}
78 replicas=${replicas:-5}
Alanny Lopezeba5ad42017-08-18 14:48:37 -050079 hclaim=${hclaim:-jenkins-slave-space}
Alanny Lopez07b4d5b2017-08-01 16:24:07 -050080 jenkins_subpath=${jenkins_subpath:-workspace/Openbmc-Build/build}
Alanny Lopezeba5ad42017-08-18 14:48:37 -050081 newimgname="${imgrepo}qemu-instance"
Alanny Lopez0e8ad992017-06-19 15:45:23 -050082 ;;
83 XCAT-launch)
84 ;;
85 generic)
86 ;;
87 *)
88 exit 1
89 ;;
90esac
91
Alanny Lopez09e18652017-04-24 15:50:33 -050092
Alanny Lopez51186882017-08-01 16:14:41 -050093# Tag the image created by the invoker with the new image name that includes the imgrepo
94docker tag ${imgname} ${newimgname}
95imgname=${newimgname}
Alanny Lopez09e18652017-04-24 15:50:33 -050096
97# Push the image that was built to the image repository
98docker push ${imgname}
99
Alanny Lopezeba5ad42017-08-18 14:48:37 -0500100if [[ "$ARCH" == x86_64 ]]; then
101 ARCH=amd64
102fi
Alanny Lopez634ce362017-06-23 12:57:05 -0500103yamlfile=$(eval "echo \"$(<./kubernetes/Templates/${invoker}-${launch}.yaml)\"" )
Alanny Lopez09e18652017-04-24 15:50:33 -0500104kubectl create -f - <<< "${yamlfile}"
105
Alanny Lopez09e18652017-04-24 15:50:33 -0500106# Once pod is running track logs
Alanny Lopez0e8ad992017-06-19 15:45:23 -0500107if [[ "${log}" == true ]]; then
108 # Wait for Pod to be running
Alanny Lopez51186882017-08-01 16:14:41 -0500109 while [ -z "$(kubectl describe pod ${podname} -n ${namespace} | grep Status: | grep Running)" ]
110 do
Alanny Lopez0e8ad992017-06-19 15:45:23 -0500111 if [ ${timeout} -lt 0 ];then
112 kubectl delete -f - <<< "${yamlfile}"
113 echo "Timeout Occured: Job failed to start running in time"
114 exit 1
115 else
116 sleep 1
117 let timeout-=1
118 fi
119 done
120 kubectl logs -f ${podname} -n ${namespace}
121fi
Alanny Lopez09e18652017-04-24 15:50:33 -0500122
Alanny Lopez0e8ad992017-06-19 15:45:23 -0500123# Delete the object if purge is true
124if [[ "${purge}" == true ]]; then
125 kubectl delete -f - <<< "${yamlfile}"
126fi