tools/import-stx
Davlet Panech 2ec13b59c9 import-stx: better check for k8s namespace
"kubectl get namespace" occasionally fails, and the build thinks the
namespace doesn't exist. Improve this call:
* try to get the namespace by name, instead of listing all namespaces and
  grep'ing the output
* don't suppress STDERR

Story: 2010055
Task: 50765

Signed-off-by: Davlet Panech <davlet.panech@windriver.com>
Change-Id: I3923d4765f9cf578f5f525a1aeac3c640a4f7b7e
2024-08-07 10:19:06 -04:00

254 lines
7.7 KiB
Plaintext

# bash
# vim:syn=sh
#
# ENVIRONMENT
# ===========
#
# These variables may be defined before sourcing this script:
#
# PROJECT (required)
# unique (within k8s) name of your prooject. Used as part of
# pod names etc.
#
# USER (required)
# usually defined by the shell; used in file names as well as
# the user that runs the build inside the builder container
#
# STX_PLATFORM
# "minikube" or "kubernetes" (for vanilla k8s)
# Default: "minikube"
#
# STX_BUILD_HOME
# root directory of all files used by this project
# Default: /localdisk/designer/$USER/$PROJECT
#
# MINIKUBE_HOME
# Minikube saves its profile information here. Must be on a local
# file system, not NFS.
# Default: $HOME
#
# MINIKUBEMEMORY
# Max amount of RAM for minikube in mebibytes (1024-based)
# Default: 16000
#
# STX_BUILD_CPUS
# How may CPU cores to allocate to PODs.
# Default: 6
#
# MINIKUBENAME
# Minikube's profile name
# Default: minikube-$USER-upstream
#
# KUBECONFIG
# Location of kubectl config file
# Default: $MINIKUBE_HOME/.kube/config or $HOME/.kube/config
# depending on $STX_PLATFORM
#
# STX_K8S_NAMESPACE (required on vanilla k8s)
# K8s namespace for builder pods & services. For vanilla k8s only.
# Minikube always uses the default namespace.
#
# STX_INSECURE_DOCKER_REGISTRIES
# Space-separated list of docker registries for which we want to disable
# SSL certificate validation. Only affects docker running in builder pods.
# Requires pod restart when changed.
#
# STX_CONTAINER_MTU
# Assume container network's MTU is this value. Currently this will be
# passed to docker-in-docker's command line. This must be <= to the k8s
# container network's MTU.
#
# STX_BUILDER_IMAGE_TAG
# Assign this tag to builder images generated or downloaded by stx-init-env,
# and reference them in builder helm charts.
# Default: $USER-$PROJECT-$DOCKER_TAG_VERSION
#
# STX_PREBUILT_BUILDER_IMAGE_TAG
# Download pre-built images with this tag. This is used by "stx-init-env"
# without the "--rebuild" flag.
# Default: master-debian-latest
#
# STX_PREBUILT_BUILDER_IMAGE_PREFIX
# Download pre-built images from this registry/prefix. This is used by "stx-init-env"
# without the "--rebuild" flag. If not empty, this must end with "/".
# Default:starlingx/
#
# STX_RM_METHOD
# stx-init-env --reset* may need to delete root-owned files. By default
# we delete them via sudo. If you set STX_RM_METHOD to "docker", we will
# delete such files via a docker container with STX_BUILD_HOME mounted inside.
#
# STX_MIRROR_URL
# StarlingX mirror URL; defaults to the value of "[repomgr]stx_mirror_url" from
# stx.conf; or https://mirror.starlingx.windriver.com/mirror. This is currently
# used when building stx-lat-sdk container.
#
notice_warn () {
local tty_on tty_off
if [[ -t 2 ]] ; then
tty_on=$'\033[1;33m'
tty_off=$'\033[0m'
fi
echo >&2 "${tty_on}$*${tty_off}"
}
number_of_users () {
local count
count=$(users | tr ' ' '\n' | sort --uniq | wc -l)
# Add in non-login users that might trigger a parallel build
# based on a timer, or other trigger.
if getent passwd jenkins >/dev/null 2>&1; then
count=$((count+1))
fi
# Always return at least one. i.e. someone is
# running this script.
if [ $count -le 0 ]; then
count=1
fi
echo $count
}
number_of_cpus () {
/usr/bin/nproc
}
sqrt () {
echo -e "sqrt($1)" | bc -q -i | head -2 | tail -1
}
if [ -z "$PROJECT" ]; then
notice_warn "\$PROJECT needs to be defined, this will be your project name."
notice_warn "It will be used on the docker image tagging to support multiusers."
return 1
fi
# Host side path, exports STX lib to user's PATH
export PRJDIR=$(pwd)
export PATH=$PRJDIR/stx/bin:$PATH
if [[ -n "$STX_BUILDER_IMAGE_TAG" ]] ; then
export DOCKER_TAG_LOCAL="$STX_BUILDER_IMAGE_TAG"
else
DOCKER_TAG_VERSION="v0.1.0"
export DOCKER_TAG_LOCAL="${USER}-${PROJECT}-${DOCKER_TAG_VERSION}"
fi
if [[ -z "$STX_PREBUILT_BUILDER_IMAGE_TAG" ]] ; then
STX_PREBUILT_BUILDER_IMAGE_TAG="master-debian-latest"
fi
export STX_PREBUILT_BUILDER_IMAGE_TAG
# Platform 'minikube' or 'kubernetes'
export STX_PLATFORM="${STX_PLATFORM:-minikube}"
# Max cpus for the build parallel jobs, replaces MINIKUBECPUS env var
export STX_BUILD_CPUS=${STX_BUILD_CPUS:-6}
STX_BUILD_HOME_DEFAULT_v1="/localdisk/$USER"
STX_BUILD_HOME_DEFAULT_v2="/localdisk/designer/$USER/$PROJECT"
if [ ! -f "stx.conf" ]; then
cp stx.conf.sample stx.conf
fi
# Platform specifics
if [ "$STX_PLATFORM" = "minikube" ]; then
# MINIKUBE Settings
if [ -z "$STX_BUILD_HOME" ]; then
# Verify default build home
if [ -d "${STX_BUILD_HOME_DEFAULT_v1}/localdisk/designer/$USER" ]; then
STX_BUILD_HOME="${STX_BUILD_HOME_DEFAULT_v1}"
else
STX_BUILD_HOME="${STX_BUILD_HOME_DEFAULT_v2}"
fi
export STX_BUILD_HOME
fi
if [ -z "$MINIKUBE_HOME" ]; then
MINIKUBE_HOME=$HOME
else
if [ ! -d "$MINIKUBE_HOME" ]; then
echo "The directory defined by \$MINIKUBE_HOME doesn't exist"
return 1
fi
fi
FSTYPE=$(stat -f -L -c %T $MINIKUBE_HOME)
if [ x"$FSTYPE" = x"nfs" ]; then
echo ""
echo "Warning: stx minikube doesn't allow \$MINIKUBE_HOME or \$HOME directory as nfs mount point!!!"
echo " Please set non-nfs MINIKUBE_HOME with the command 'export MINIKUBE_HOME=XXX/YYY'"
echo ""
unset MINIKUBE_HOME
return 1
fi
export MINIKUBEMEMORY=${MINIKUBEMEMORY:-16000}
export MINIKUBENAME=${MINIKUBENAME:-minikube-$USER-upstream}
export KUBECONFIG=$MINIKUBE_HOME/.kube/config
# Consider many users are just working with code and not actually building.
NUM_USERS=$(sqrt $(number_of_users))
ABSOLUTE_MAX_CPUS=$(($(number_of_cpus)/$NUM_USERS))
MAX_CPUS=$(number_of_cpus)
if [ "$MAX_CPUS" = "" ] || [ "$MAX_CPUS" = "0" ]; then
MAX_CPUS=1
fi
if [ $MAX_CPUS -gt $ABSOLUTE_MAX_CPUS ]; then
MAX_CPUS=$ABSOLUTE_MAX_CPUS
fi
if [ $STX_BUILD_CPUS -gt $MAX_CPUS ]; then
notice_warn "\$STX_BUILD_CPUS setting:$STX_BUILD_CPUS is more than MAX_CPUS: $MAX_CPUS."
notice_warn "Limit the minikube cluster with MAX_CPUS."
export STX_BUILD_CPUS=$MAX_CPUS
fi
MAX_MEMORY=`expr $(cat /proc/meminfo |grep MemTotal | awk '{print $2}') / 1024`
if [ "$MAX_MEMORY" = "" ] || [ "$MAX_MEMORY" = "0" ]; then
MAX_MEMORY=2048
fi
if [ $MINIKUBEMEMORY -gt $MAX_MEMORY ]; then
notice_warn "MINIKUBEMEMORY setting:$MINIKUBEMEMORY is more than system MAX_MEMORY: $MAX_MEMORY M."
notice_warn "Limit the minikube cluster with MAX_MEMORY."
export MINIKUBEMEMORY=$MAX_MEMORY
fi
elif [ "$STX_PLATFORM" = "kubernetes" ]; then
# Host side path STX_BUILD_HOME
export STX_BUILD_HOME="${STX_BUILD_HOME:-${STX_BUILD_HOME_DEFAULT_v2}}"
if [ -z "$STX_K8S_NAMESPACE" ]; then
notice_warn "\$STX_K8S_NAMESPACE needs to be defined, this will be your namespace name"
return 1
fi
if [ -z "$KUBECONFIG" ]; then
# Kubeconfig default location inside STX_BUILD_HOME
export KUBECONFIG=$STX_BUILD_HOME/.kube/config
fi
if [ ! -f "$KUBECONFIG" ]; then
notice_warn "KUBECONFIG: $KUBECONFIG not found"
notice_warn "Fix the kube config and try again."
return 1
fi
if ! kubectl get namespace "$STX_K8S_NAMESPACE" >/dev/null ; then
notice_warn "namespace $STX_K8S_NAMESPACE not found"
return 1
fi
else
notice_warn "\$STX_PLATFORM not specified, valid options are: 'minikube' or 'kubernetes'"
return 1
fi