Add new CLI option to set venv file.
Example:
lf-activate-venv --venv-file /tmp/.robot_venv \
robotframework
Modify lf-activate-venv() to allow creation of a venv file and re-use
the venv to improve job performance. When a dependency is already
installed, pip skips the package therefore reduces the time it takes
to create venv in every script.
Precedence for venv file.
a. Re-use an existing venv file if one exists.
1. Use venv file path from --venv-file
2. Use default venv file path "/tmp/.os_lf_venv"
b. Create new venv when 1. and 2. is absent
Note: The default file "/tmp/.os_lf_venv" is created by a pre-build
script (../shell/python-tools-install.sh).
In the situation where a fresh venv is required remove
"/tmp/.os_lf_venv" before calling lf-activate-venv().
Update all the required scripts that call lf-activate-venv().
Issue-ID: RELENG-4403
Change-Id: I559f759a8dba7eca0a62f8b73a360dc627699ed2
Signed-off-by: Anil Belur <abelur@linuxfoundation.org>
################################################################################
#
# NAME
-# lf-activate-venv [-p|--python python] [--no-path]
+# lf-activate-venv [-p|--python python] [-v|--venv-file] [--no-path]
# [--system-site-packages] [package]...
#
# SYNOPSIS
# or
# lf-activate-venv --python python3.8 git-review
#
+# lf-activate-venv --python python3.8 --venv-file /tmp/.myvenv git-review
+#
# DESCRIPTION
# This function will create a new Python Virtual Environment (venv) and
# install the specified packages in the new venv. The venv will be installed
# to the PATH.
#
# The 'lf_venv' variable will be set so you can directly execute commands
-# in the venv with: $lf_venv/bin/command. Beware that subsequent calls to
-# lf-activate-venv() will overwrite 'lf_venv'.
+# in the venv with: $lf_venv/bin/command. lf-activate-venv() will check for
+# existing file '/tmp/.os_lf_venv' and set 'lf_venv' if the file exists.
+#
+# The function provides a --venv-file path for saving the value of the 'lf_env'
+# that can re-used later. By default '/tmp/.os_lf_venv' venv file is created
+# when the --venv-file option is not specified.
+#
+# Subsequent calls to lf-activate-venv() will re-use the existing venv
+# throught and will NOT overwrite 'lf_venv', if the '/tmp/.os_lf_venv'
+# already exists.
+#
+# If a new venv is required delete the file '/tmp/.os_lf_venv' before
+# calling lf-activate-venv() will create a fresh venv.
#
# By default all packages are installed with '--upgrade-strategy eager'.
# The venv will always contain pip & virtualenv.
lf-activate-venv () {
lf_venv=$(mktemp -d /tmp/venv-XXXX)
+ local venv_file="/tmp/.os_lf_venv"
local python=python3
local options
local set_path=true
local install_args=""
- options=$(getopt -o 'n:p:' -l 'no-path,python:,system-site-packages' \
+ # set -x
+ options=$(getopt -o 'np:v:' -l 'no-path,system-site-packages,python:,venv-file:' \
-n "${FUNCNAME[0]}" -- "$@" )
eval set -- "$options"
while true; do
case $1 in
-n|--no-path) set_path=false ; shift ;;
- -p|--python) python=$2 ; shift 2 ;;
+ -p|--python) python="$2" ; shift 2 ;;
+ -v|--venv-file) venv_file="$2" ; shift 2 ;;
--system-site-packages) install_args="--system-site-packages" ;
shift ;;
--) shift; break ;;
esac
done
- echo "${FUNCNAME[0]}(): INFO: Creating $python venv at $lf_venv"
-
case $python in
python2*)
local pkg_list="$*"
local pkg_list=""
# Use pyenv for selecting the python version
if [[ -d "/opt/pyenv" ]]; then
- # set_python_version = pyver "${python//[a-zA-Z]/}"
echo "Setup pyenv:"
export PYENV_ROOT="/opt/pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
pyenv local $(lf-pyver "${python}")
fi
fi
+
# Add version specifier for some packages
for arg in "$@"; do
case $arg in
*) pkg_list+="$arg " ;;
esac
done
- $python -m venv "$install_args" "$lf_venv" || return 1
+
+ # Precedence:
+ # - Re-use venv:
+ # 1. --venv-file <path/to/file> as lf_venv
+ # 2. default: "/tmp/.os_lf_venv"
+ # - Create new venv when 1. and 2. is absent
+ if [ -f "$venv_file" ]; then
+ lf_venv=$(cat "$venv_file")
+ echo "${FUNCNAME[0]}(): INFO: Reuse venv:$lf_venv from" \
+ "file:$venv_file"
+ elif [ ! -f "$venv_file" ]; then
+ $python -m venv "$install_args" "$lf_venv" || return 1
+ echo "${FUNCNAME[0]}(): INFO: Creating $python venv at $lf_venv"
+ echo "$lf_venv" > "$venv_file"
+ echo "${FUNCNAME[0]}(): INFO: Save venv in file: $venv_file"
+ fi
+
"$lf_venv/bin/pip" install --upgrade --quiet pip virtualenv || return 1
if [[ -z $pkg_list ]]; then
echo "${FUNCNAME[0]}(): WARNING: No packages to install"
--- /dev/null
+---
+features:
+ - |
+ Add support for a new option to set venv file.
+
+ lf-activate-venv --venv-file /tmp/.robot_venv robotframework
+
+ Modify lf-activate-venv() to allow creation of a venv file and re-use the
+ venv to improve job performance. When a dependency is already installed, pip
+ skips the package therefore reduces the time it takes to create
+ venv in every script.
+
+ Precedence for venv file.
+ a. Re-use an existing venv file if one exists.
+ 1. Use venv file path from --venv-file
+ 2. Use default venv file path "/tmp/.os_lf_venv"
+ b. Create new venv when 1. and 2. is absent
+
+ Note: The default file "/tmp/.os_lf_venv" is created by a pre-build
+ script (../shell/python-tools-install.sh).
+
+ In the situation where a fresh venv is required remove "/tmp/.os_lf_venv"
+ before calling lf-activate-venv().
+
+ Update all the required scripts that call lf-activate-venv().
+fixes:
+ - |
+ Clean up conditions introduce in the shell scripts, while these checks
+ are performed within lf-activate-venv().
set -e -o pipefail
set +u
+# shellcheck disable=SC1090
+. ~/lf-env.sh
+
+lf-activate-venv --python python3 lftools
+
export MAVEN_OPTIONS
export MAVEN_PARAMS
echo ")"
}
+# shellcheck disable=SC1090
+. ~/lf-env.sh
+
+lf-activate-venv --python python3 lftools
mapfile -t clouds < <(ls -d1 "$OS_CLOUD_DIR"/*/)
set -eu -o pipefail
+# shellcheck disable=SC1090
+. ~/lf-env.sh
+
+lf-activate-venv --python python3 lftools
+
for silo in $silos; do
if [ ! -f "$WORKSPACE/jenkins-config/global-vars-$silo.sh" ]; then
echo "WARN: jenkins-config/global-vars-$silo.sh does not exist. Skipping cloud management..."
set -euf -o pipefail
# shellcheck disable=SC1090
-source ~/lf-env.sh
+. ~/lf-env.sh
-lf-activate-venv jenkins-job-builder
+lf-activate-venv --python python3 --venv-file /tmp/.jjb_venv jenkins-job-builder
# jenkins-jobs does not always open 'stdin' which may cause 'yes' to fail
(yes || true) | jenkins-jobs -s sandbox delete-all
source ~/lf-env.sh
# Version controlled by JJB_VERSION
-lf-activate-venv jenkins-job-builder
+lf-activate-venv --python python3 --venv-file /tmp/.jjb_venv jenkins-job-builder
# Fetch patch if gerrit project matches the jjb-deploy project
if [ "${GERRIT_PROJECT}" == "${PROJECT}" ]; then
lf-git-validate-jira-urls
lf-jjb-check-ascii
-lf-activate-venv jenkins-job-builder
+lf-activate-venv --python python3 --venv-file /tmp/.jjb_venv jenkins-job-builder
jenkins-jobs test --recursive -o archives/job-configs --config-xml jjb/
# Ensure we fail the job if any steps fail.
set -eux -o pipefail
+# shellcheck disable=SC1090
+. ~/lf-env.sh
+
+lf-activate-venv --python python3 lftools
+
MC_TMP_FILE="$(mktemp)"
echo "Staging in OSSRH for Maven Central"
lftools deploy nexus-stage "https://oss.sonatype.org" "$profile_id" "$WORKSPACE/m2repo" | tee "$MC_TMP_FILE"
echo "-----> Install lftools"
# shellcheck disable=SC1090
-source ~/lf-env.sh
-lf-activate-venv lftools
+. ~/lf-env.sh
+
+lf-activate-venv --python python3 lftools
echo "-----> Upload files to Nexus"
lftools deploy nexus -s "$nexus_repo_url" "$m2repo_dir"
set -e -o pipefail
set +u
+# shellcheck disable=SC1090
+. ~/lf-env.sh
+
+lf-activate-venv --python python3 lftools
+
JAVADOC_DIR="$WORKSPACE/archives/javadoc"
pushd "$JAVADOC_DIR"
# Ensure we fail the job if any steps fail.
set -xeu -o pipefail
+# shellcheck disable=SC1090
+. ~/lf-env.sh
+
+lf-activate-venv --python python3 lftools
+
TMP_FILE="$(mktemp)"
lftools deploy nexus-stage "$NEXUS_URL" "$STAGING_PROFILE_ID" "$WORKSPACE/m2repo" | tee "$TMP_FILE"
staging_repo=$(sed -n -e 's/Staging repository \(.*\) created\./\1/p' "$TMP_FILE")
# shellcheck disable=SC1090
source ~/lf-env.sh
-set -x
-# Check if openstack venv was previously created
-if [ -f "/tmp/.os_lf_venv" ]; then
- os_lf_venv=$(cat "/tmp/.os_lf_venv")
-fi
-
-if [ -d "${os_lf_venv}" ] && [ -f "${os_lf_venv}/bin/openstack" ]; then
- echo "Re-use existing venv: ${os_lf_venv}"
- PATH=$os_lf_venv/bin:$PATH
-else
- lf-activate-venv --python python3 "cryptography<3.4" \
- "lftools[openstack]" \
- kubernetes \
- "niet~=1.4.2" \
- python-heatclient \
- python-openstackclient \
- python-magnumclient \
- setuptools \
- "openstacksdk<0.99" \
- yq
-fi
+# TODO: "openstacksdk<0.99" AttributeError: 'Image' object has no
+# attribute 'protected'
+lf-activate-venv --python python3 "lftools[openstack]" \
+ kubernetes \
+ niet \
+ "openstacksdk<0.99" \
+ python-heatclient \
+ python-openstackclient \
+ python-magnumclient \
+ yq
os_cloud="${OS_CLOUD:-vex}"
os_image_cleanup_age="${OS_IMAGE_CLEANUP_AGE:-30}"
# shellcheck disable=SC1090
source ~/lf-env.sh
-# Check if openstack venv was previously created
-if [ -f "/tmp/.os_lf_venv" ]; then
- os_lf_venv=$(cat "/tmp/.os_lf_venv")
-fi
-if [ -d "${os_lf_venv}" ] && [ -f "${os_lf_venv}/bin/openstack" ]; then
- echo "Re-use existing venv: ${os_lf_venv}"
- PATH=$os_lf_venv/bin:$PATH
-else
- lf-activate-venv --python python3 \
- kubernetes \
- python-heatclient \
- python-openstackclient \
- python-magnumclient
-fi
+lf-activate-venv --python python3 \
+ kubernetes \
+ python-heatclient \
+ python-openstackclient \
+ python-magnumclient
#########################
## FETCH ACTIVE BUILDS ##
os_cloud="${OS_CLOUD:-vex}"
-# Check if openstack venv was previously created
-if [ -f "/tmp/.os_lf_venv" ]; then
- os_lf_venv=$(cat "/tmp/.os_lf_venv")
-fi
-
-if [ -d "${os_lf_venv}" ] && [ -f "${os_lf_venv}/bin/openstack" ]; then
- echo "Re-use existing venv: ${os_lf_venv}"
- PATH=$os_lf_venv/bin:$PATH
-else
- lf-activate-venv --python python3 \
- python-heatclient \
- python-openstackclient
-fi
+lf-activate-venv --python python3 \
+ python-heatclient \
+ python-openstackclient
set -eux -o pipefail
# shellcheck disable=SC1090
source ~/lf-env.sh
-# Check if openstack venv was previously created
-if [ -f "/tmp/.os_lf_venv" ]; then
- os_lf_venv=$(cat "/tmp/.os_lf_venv")
-fi
-
-if [ -d "${os_lf_venv}" ] && [ -f "${os_lf_venv}/bin/openstack" ]; then
- echo "Re-use existing venv: ${os_lf_venv}"
- PATH=$os_lf_venv/bin:$PATH
-else
- lf-activate-venv --python python3 "cryptography<3.4" \
- "lftools[openstack]" \
- kubernetes \
- "niet~=1.4.2" \
- python-heatclient \
- python-openstackclient \
- python-magnumclient \
- setuptools \
- "openstacksdk<0.99" \
- yq
-fi
+lf-activate-venv --python python3 "lftools[openstack]" \
+ kubernetes \
+ niet \
+ python-heatclient \
+ python-openstackclient \
+ python-magnumclient \
+ yq
+
##########################
## FETCH ACTIVE MINIONS ##
##########################
# shellcheck disable=SC1090
source ~/lf-env.sh
-# Check if openstack venv was previously created
-if [ -f "/tmp/.os_lf_venv" ]; then
- os_lf_venv=$(cat "/tmp/.os_lf_venv")
-fi
-
-if [ -d "${os_lf_venv}" ] && [ -f "${os_lf_venv}/bin/openstack" ]; then
- echo "Re-use existing venv: ${os_lf_venv}"
- PATH=$os_lf_venv/bin:$PATH
-else
- lf-activate-venv --python python3 "cryptography<3.4" \
- "lftools[openstack]" \
- kubernetes \
- "niet~=1.4.2" \
- python-heatclient \
- python-openstackclient \
- python-magnumclient \
- setuptools \
- "openstacksdk<0.99" \
- yq
-fi
+lf-activate-venv --python python3 "lftools[openstack]" \
+ kubernetes \
+ niet \
+ python-heatclient \
+ python-openstackclient \
+ python-magnumclient \
+ yq
set -x
#########################
# shellcheck disable=SC1090
source ~/lf-env.sh
-# Check if openstack venv was previously created
-if [ -f "/tmp/.os_lf_venv" ]; then
- os_lf_venv=$(cat "/tmp/.os_lf_venv")
-fi
-if [ -d "${os_lf_venv}" ] && [ -f "${os_lf_venv}/bin/openstack" ]; then
- echo "Re-use existing venv: ${os_lf_venv}"
- PATH=$os_lf_venv/bin:$PATH
-else
- lf-activate-venv --python python3 "cryptography<3.4" \
- "lftools[openstack]" \
- kubernetes \
- "niet~=1.4.2" \
- python-heatclient \
- python-openstackclient \
- python-magnumclient \
- setuptools \
- "openstacksdk<0.99" \
- yq
-fi
+lf-activate-venv --python python3 "lftools[openstack]" \
+ kubernetes \
+ niet \
+ python-heatclient \
+ python-openstackclient \
+ python-magnumclient \
+ yq
+
mapfile -t os_volumes < <(openstack --os-cloud "$os_cloud" volume list -f value -c ID --status Available)
if [ ${#os_volumes[@]} -eq 0 ]; then
# shellcheck disable=SC1090
source ~/lf-env.sh
-# Check if openstack venv was previously created
-if [ -f "/tmp/.os_lf_venv" ]; then
- os_lf_venv=$(cat "/tmp/.os_lf_venv")
-fi
-
-if [ -d "${os_lf_venv}" ] && [ -f "${os_lf_venv}/bin/openstack" ]; then
- echo "Re-use existing venv: ${os_lf_venv}"
- PATH=$os_lf_venv/bin:$PATH
-else
- lf-activate-venv --python python3 "cryptography<3.4" \
- "lftools[openstack]" \
- kubernetes \
- "niet~=1.4.2" \
- python-heatclient \
- python-openstackclient \
- python-magnumclient \
- setuptools \
- "openstacksdk<0.99" \
- yq
-fi
+lf-activate-venv --python python3 "lftools[openstack]" \
+ kubernetes \
+ niet \
+ python-heatclient \
+ python-openstackclient \
+ python-magnumclient \
+ yq
os_cloud="${OS_CLOUD:-vex}"
fixed_network="${FIXED_NETWORK}"
# shellcheck disable=SC1090
source ~/lf-env.sh
-# Check if openstack venv was previously created
-if [ -f "/tmp/.os_lf_venv" ]; then
- os_lf_venv=$(cat "/tmp/.os_lf_venv")
-fi
-
-if [ -d "${os_lf_venv}" ] && [ -f "${os_lf_venv}/bin/openstack" ]; then
- echo "Re-use existing venv: ${os_lf_venv}"
- PATH=$os_lf_venv/bin:$PATH
-else
- lf-activate-venv --python python3 \
- python-heatclient \
- python-openstackclient
-fi
+lf-activate-venv --python python3 "lftools[openstack]" \
+ kubernetes \
+ python-heatclient \
+ python-openstackclient
images=()
while read -r -d $'\n' ; do
# shellcheck disable=SC1090
source ~/lf-env.sh
-# Check if openstack venv was previously created
-if [ -f "/tmp/.os_lf_venv" ]; then
- os_lf_venv=$(cat "/tmp/.os_lf_venv")
-fi
-
-if [ -d "${os_lf_venv}" ] && [ -f "${os_lf_venv}/bin/openstack" ]; then
- echo "Re-use existing venv: ${os_lf_venv}"
- PATH=$os_lf_venv/bin:$PATH
-else
- lf-activate-venv --python python3 \
- python-heatclient \
- python-openstackclient
-fi
+lf-activate-venv --python python3 "lftools[openstack]" \
+ kubernetes \
+ python-heatclient \
+ python-openstackclient
# IP Addresses are returned as a space separated list so word splitting is ok
# shellcheck disable=SC2207
# shellcheck disable=SC1090
source ~/lf-env.sh
-# Check if openstack venv was previously created
-if [ -f "/tmp/.os_lf_venv" ]; then
- os_lf_venv=$(cat "/tmp/.os_lf_venv")
-fi
+lf-activate-venv --python python3 "lftools[openstack]" \
+ kubernetes \
+ niet \
+ python-heatclient \
+ python-openstackclient \
+ python-magnumclient \
+ yq
-if [ -d "${os_lf_venv}" ] && [ -f "${os_lf_venv}/bin/openstack" ]; then
- echo "Re-use existing venv: ${os_lf_venv}"
- PATH=$os_lf_venv/bin:$PATH
-else
- lf-activate-venv --python python3 "cryptography<3.4" \
- "lftools[openstack]" \
- kubernetes \
- "niet~=1.4.2" \
- python-heatclient \
- python-openstackclient \
- python-magnumclient \
- setuptools \
- "openstacksdk<0.99" \
- yq
-fi
openstack --os-cloud "$os_cloud" limits show --absolute
pushd "$stack_template_dir" || exit 1
# shellcheck disable=SC1090
source ~/lf-env.sh
-# Check if openstack venv was previously created
-if [ -f "/tmp/.os_lf_venv" ]; then
- os_lf_venv=$(cat "/tmp/.os_lf_venv")
-fi
-
-if [ -d "${os_lf_venv}" ] && [ -f "${os_lf_venv}/bin/openstack" ]; then
- echo "Re-use existing venv: ${os_lf_venv}"
- PATH=$os_lf_venv/bin:$PATH
-else
- lf-activate-venv --python python3 lftools[openstack] \
- python-heatclient \
- python-openstackclient
-fi
+lf-activate-venv --python python3 "lftools[openstack]" \
+ kubernetes \
+ python-heatclient \
+ python-openstackclient
echo "INFO: Retrieving stack cost for: $OS_STACK_NAME"
if ! lftools openstack --os-cloud "$OS_CLOUD" stack cost "$OS_STACK_NAME" > stack-cost; then
echo "---> rtdv3.sh"
set -euo pipefail
+# shellcheck disable=SC1090
+. ~/lf-env.sh
+
+lf-activate-venv --python python3 lftools
+
watchbuild(){
echo "INFO: Running build against branch $1"
local buildid
# Ensure we fail the job if any steps fail.
set -e -o pipefail
+# shellcheck disable=SC1090
+. ~/lf-env.sh
+
+lf-activate-venv --python python3 lftools
+
OS=$(facter operatingsystem | tr '[:upper:]' '[:lower:]')
OS_RELEASE=$(facter lsbdistrelease | tr '[:upper:]' '[:lower:]')
if [[ "$OS_RELEASE" == "8" && "$OS" == 'centos' ]]; then