| Alanny Lopez | 09e1865 | 2017-04-24 15:50:33 -0500 | [diff] [blame] | 1 | #!/bin/bash | 
|  | 2 | ############################################################################### | 
|  | 3 | # | 
|  | 4 | # Script used to assist in launching Kubernetes jobs/pods. Expects to be used | 
| Alanny Lopez | 0e8ad99 | 2017-06-19 15:45:23 -0500 | [diff] [blame] | 5 | # as an supplemental script to the scripts that want to launch their containers | 
|  | 6 | # on a Kubernetes cluster. | 
| Alanny Lopez | 09e1865 | 2017-04-24 15:50:33 -0500 | [diff] [blame] | 7 | # | 
|  | 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 Lopez | 09e1865 | 2017-04-24 15:50:33 -0500 | [diff] [blame] | 24 | #  registry     = the registry to use to pull and push images | 
|  | 25 | #  imgplsec     = the image pull secret used to access registry if needed | 
| Alanny Lopez | 26b2bc5 | 2017-09-29 16:46:00 -0500 | [diff] [blame] | 26 | #  jobtimeout   = the amount of time in seconds that the build will wait for | 
|  | 27 | #                 the job to be created in the api of the cluster. | 
|  | 28 | #  podtimeout   = the amount of time in seconds that the build will wait for | 
|  | 29 | #                 the pod to start running on the cluster. | 
| Alanny Lopez | 5118688 | 2017-08-01 16:14:41 -0500 | [diff] [blame] | 30 | #  imgname      = the name the image that will be passed to the kubernetes api | 
|  | 31 | #                 to build the containers. The image with the tag imgname will | 
|  | 32 | #                 be built in the invoker script. This script will then tag it | 
|  | 33 | #                 to include the registry in the name, push it, and update the | 
|  | 34 | #                 imgname to be what was pushed to the registry. Users should | 
|  | 35 | #                 not include the registry in the original imgname. | 
| Alanny Lopez | 09e1865 | 2017-04-24 15:50:33 -0500 | [diff] [blame] | 36 | #  podname      = the name of the pod, will be needed to trace down the logs | 
|  | 37 | # | 
|  | 38 | ############################################################################### | 
| Alanny Lopez | 0e8ad99 | 2017-06-19 15:45:23 -0500 | [diff] [blame] | 39 | # Variables that act as script options: | 
|  | 40 | #  invoker      = name of what this script is being called by or for, used to | 
|  | 41 | #                 determine the template to use for YAML file | 
|  | 42 | #  log          = set to true to make the script tail the container logs of pod | 
|  | 43 | #  purge        = set to true delete the created object once script completes | 
|  | 44 | #  launch       = used to determine the template for YAML file, Usually brought | 
|  | 45 | #                 in by sourcing from another script but can be declared | 
|  | 46 | # | 
|  | 47 | ############################################################################### | 
| Alanny Lopez | 09e1865 | 2017-04-24 15:50:33 -0500 | [diff] [blame] | 48 |  | 
|  | 49 | # Kubernetes Variables | 
|  | 50 | namespace=${namespace:-openbmc} | 
| Alanny Lopez | 09e1865 | 2017-04-24 15:50:33 -0500 | [diff] [blame] | 51 | imgrepo=${imgrepo:-master.cfc:8500/openbmc/} | 
|  | 52 | imgplsec=${imgplsec:-regkey} | 
| Alanny Lopez | 26b2bc5 | 2017-09-29 16:46:00 -0500 | [diff] [blame] | 53 | jobtimeout=${jobtimeout:-60} | 
|  | 54 | podtimeout=${podtimeout:-600} | 
| Alanny Lopez | 09e1865 | 2017-04-24 15:50:33 -0500 | [diff] [blame] | 55 |  | 
| Alanny Lopez | 0e8ad99 | 2017-06-19 15:45:23 -0500 | [diff] [blame] | 56 | # Options which decide script behavior | 
|  | 57 | invoker=${invoker:-${1}} | 
|  | 58 | log=${log:-${2}} | 
|  | 59 | purge=${purge:-${3}} | 
|  | 60 | launch=${launch:-${4}} | 
|  | 61 |  | 
|  | 62 | # Set the variables for the specific invoker to fill in the YAML template | 
| Alanny Lopez | 26b2bc5 | 2017-09-29 16:46:00 -0500 | [diff] [blame] | 63 | # Other variables in the template not declared here are declared by invoker | 
| Alanny Lopez | 0e8ad99 | 2017-06-19 15:45:23 -0500 | [diff] [blame] | 64 | case ${invoker} in | 
|  | 65 | OpenBMC-build) | 
| Alanny Lopez | eba5ad4 | 2017-08-18 14:48:37 -0500 | [diff] [blame] | 66 | hclaim=${hclaim:-jenkins-slave-space} | 
| Alanny Lopez | 0e8ad99 | 2017-06-19 15:45:23 -0500 | [diff] [blame] | 67 | sclaim=${sclaim:-shared-state-cache} | 
|  | 68 | oclaim=${oclaim:-openbmc-reference-repo} | 
| Alanny Lopez | 5118688 | 2017-08-01 16:14:41 -0500 | [diff] [blame] | 69 | newimgname=${newimgname:-${imgrepo}${distro}:${imgtag}-${ARCH}} | 
| Alanny Lopez | 0e8ad99 | 2017-06-19 15:45:23 -0500 | [diff] [blame] | 70 | podname=${podname:-openbmc${BUILD_ID}-${target}-builder} | 
|  | 71 | ;; | 
|  | 72 | QEMU-build) | 
| Alanny Lopez | 634ce36 | 2017-06-23 12:57:05 -0500 | [diff] [blame] | 73 | podname=${podname:-qemubuild${BUILD_ID}} | 
| Alanny Lopez | eba5ad4 | 2017-08-18 14:48:37 -0500 | [diff] [blame] | 74 | hclaim=${hclaim:-jenkins-slave-space} | 
| Alanny Lopez | 634ce36 | 2017-06-23 12:57:05 -0500 | [diff] [blame] | 75 | qclaim=${qclaim:-qemu-repo} | 
| Alanny Lopez | 5118688 | 2017-08-01 16:14:41 -0500 | [diff] [blame] | 76 | newimgname="${imgrepo}${imgname}" | 
| Alanny Lopez | 0e8ad99 | 2017-06-19 15:45:23 -0500 | [diff] [blame] | 77 | ;; | 
|  | 78 | QEMU-launch) | 
| Alanny Lopez | 07b4d5b | 2017-08-01 16:24:07 -0500 | [diff] [blame] | 79 | deployname=${deployname:-qemu-launch-deployment} | 
|  | 80 | podname=${podname:-qemu-instance} | 
|  | 81 | replicas=${replicas:-5} | 
| Alanny Lopez | eba5ad4 | 2017-08-18 14:48:37 -0500 | [diff] [blame] | 82 | hclaim=${hclaim:-jenkins-slave-space} | 
| Alanny Lopez | 07b4d5b | 2017-08-01 16:24:07 -0500 | [diff] [blame] | 83 | jenkins_subpath=${jenkins_subpath:-workspace/Openbmc-Build/build} | 
| Alanny Lopez | eba5ad4 | 2017-08-18 14:48:37 -0500 | [diff] [blame] | 84 | newimgname="${imgrepo}qemu-instance" | 
| Alanny Lopez | 0e8ad99 | 2017-06-19 15:45:23 -0500 | [diff] [blame] | 85 | ;; | 
|  | 86 | XCAT-launch) | 
|  | 87 | ;; | 
|  | 88 | generic) | 
|  | 89 | ;; | 
|  | 90 | *) | 
|  | 91 | exit 1 | 
|  | 92 | ;; | 
|  | 93 | esac | 
|  | 94 |  | 
| Alanny Lopez | 26b2bc5 | 2017-09-29 16:46:00 -0500 | [diff] [blame] | 95 | # Tag the image created by the invoker with a name that includes the imgrepo | 
| Alanny Lopez | 5118688 | 2017-08-01 16:14:41 -0500 | [diff] [blame] | 96 | docker tag ${imgname} ${newimgname} | 
|  | 97 | imgname=${newimgname} | 
| Alanny Lopez | 09e1865 | 2017-04-24 15:50:33 -0500 | [diff] [blame] | 98 |  | 
|  | 99 | # Push the image that was built to the image repository | 
|  | 100 | docker push ${imgname} | 
|  | 101 |  | 
| Alanny Lopez | eba5ad4 | 2017-08-18 14:48:37 -0500 | [diff] [blame] | 102 | if [[ "$ARCH" == x86_64 ]]; then | 
|  | 103 | ARCH=amd64 | 
|  | 104 | fi | 
| Alanny Lopez | 26b2bc5 | 2017-09-29 16:46:00 -0500 | [diff] [blame] | 105 |  | 
|  | 106 | yamlfile=$(eval "echo \"$(<./kubernetes/Templates/${invoker}-${launch}.yaml)\"") | 
| Alanny Lopez | 09e1865 | 2017-04-24 15:50:33 -0500 | [diff] [blame] | 107 | kubectl create -f - <<< "${yamlfile}" | 
|  | 108 |  | 
| Alanny Lopez | 26b2bc5 | 2017-09-29 16:46:00 -0500 | [diff] [blame] | 109 | # If launch is a job we have to find the podname with identifiers | 
|  | 110 | if [[ "${launch}" == "job" ]]; then | 
|  | 111 | while [ -z ${replace} ] | 
|  | 112 | do | 
|  | 113 | if [ ${jobtimeout} -lt 0 ]; then | 
|  | 114 | kubectl delete -f - <<< "${yamlfile}" | 
|  | 115 | echo "Timeout occured before job was present in the API" | 
|  | 116 | exit 1 | 
|  | 117 | else | 
|  | 118 | sleep 1 | 
|  | 119 | let jobtimeout-=1 | 
|  | 120 | fi | 
|  | 121 | replace=$(kubectl get pods -n ${namespaces} | grep ${podname} | awk 'print $1') | 
|  | 122 | done | 
|  | 123 | podname=${replace} | 
|  | 124 | fi | 
|  | 125 |  | 
|  | 126 |  | 
| Alanny Lopez | 09e1865 | 2017-04-24 15:50:33 -0500 | [diff] [blame] | 127 | # Once pod is running track logs | 
| Alanny Lopez | 0e8ad99 | 2017-06-19 15:45:23 -0500 | [diff] [blame] | 128 | if [[ "${log}" == true ]]; then | 
|  | 129 | # Wait for Pod to be running | 
| Alanny Lopez | 259185c | 2017-10-12 15:39:03 -0500 | [diff] [blame^] | 130 | checkstatus="kubectl describe pod ${podname} -n ${namespace}" | 
|  | 131 | status=$( ${checkstatus} | grep Status: ) | 
| Alanny Lopez | 26b2bc5 | 2017-09-29 16:46:00 -0500 | [diff] [blame] | 132 | while [ -z "$( echo ${status} | grep Running)" ] | 
| Alanny Lopez | 5118688 | 2017-08-01 16:14:41 -0500 | [diff] [blame] | 133 | do | 
| Alanny Lopez | 26b2bc5 | 2017-09-29 16:46:00 -0500 | [diff] [blame] | 134 | if [ ${podtimeout} -lt 0 ]; then | 
| Alanny Lopez | 0e8ad99 | 2017-06-19 15:45:23 -0500 | [diff] [blame] | 135 | kubectl delete -f - <<< "${yamlfile}" | 
| Alanny Lopez | 26b2bc5 | 2017-09-29 16:46:00 -0500 | [diff] [blame] | 136 | echo "Timeout occured before pod was Running" | 
| Alanny Lopez | 0e8ad99 | 2017-06-19 15:45:23 -0500 | [diff] [blame] | 137 | exit 1 | 
|  | 138 | else | 
|  | 139 | sleep 1 | 
| Alanny Lopez | 26b2bc5 | 2017-09-29 16:46:00 -0500 | [diff] [blame] | 140 | let podtimeout-=1 | 
| Alanny Lopez | 0e8ad99 | 2017-06-19 15:45:23 -0500 | [diff] [blame] | 141 | fi | 
| Alanny Lopez | 259185c | 2017-10-12 15:39:03 -0500 | [diff] [blame^] | 142 | status=$( ${checkstatus} | grep Status: ) | 
| Alanny Lopez | 0e8ad99 | 2017-06-19 15:45:23 -0500 | [diff] [blame] | 143 | done | 
| Alanny Lopez | 26b2bc5 | 2017-09-29 16:46:00 -0500 | [diff] [blame] | 144 | # Tail the logs of the pod | 
| Alanny Lopez | 0e8ad99 | 2017-06-19 15:45:23 -0500 | [diff] [blame] | 145 | kubectl logs -f ${podname} -n ${namespace} | 
|  | 146 | fi | 
| Alanny Lopez | 09e1865 | 2017-04-24 15:50:33 -0500 | [diff] [blame] | 147 |  | 
| Alanny Lopez | 0e8ad99 | 2017-06-19 15:45:23 -0500 | [diff] [blame] | 148 | # Delete the object if purge is true | 
|  | 149 | if [[ "${purge}" == true ]]; then | 
|  | 150 | kubectl delete -f - <<< "${yamlfile}" | 
|  | 151 | fi |