diff --git a/openstack/python-platformclients/debian/stx-platformclients.stable_docker_image b/openstack/python-platformclients/debian/stx-platformclients.stable_docker_image index 42292ce7..37b3bbc9 100644 --- a/openstack/python-platformclients/debian/stx-platformclients.stable_docker_image +++ b/openstack/python-platformclients/debian/stx-platformclients.stable_docker_image @@ -3,10 +3,96 @@ LABEL=stx-platformclients PROJECT=infra PROJECT_REPO=nil DIST_REPOS="OS" -DIST_PACKAGES="python3-dev libffi-dev libssl-dev libcurl4-openssl-dev libfile-which-perl bash-completion helm kubernetes-1.29.2-client" +DIST_PACKAGES="python3-dev libffi-dev libssl-dev libcurl4-openssl-dev libfile-which-perl bash-completion vim helm kubernetes-1.29.2-client kubernetes-1.30.6-client kubernetes-1.31.5-client kubernetes-1.32.2-client kubernetes-1.33.0-client" PIP_PACKAGES="pycryptodomex httplib2 pyopenssl ndg-httpsclient pyasn1 \ six prettytable PyYAML python-keystoneclient python-barbicanclient \ python-openstackclient cgtsclient fmclient distributedcloud_client \ osprofiler beautifulsoup4 oidcauthtools mechanize html5lib webencodings \ nfv-client software-client tsconfig" -CUSTOMIZATION="ln -s /usr/local/kubernetes/1.29.2/stage1/usr/bin/kubectl /usr/bin/" +CUSTOMIZATION="echo '$(base64 -w0 <<'EOL' +#!/bin/bash + +# +# Copyright (c) 2025 Wind River Systems, Inc. +# +# SPDX-License-Identifier: Apache-2.0 +# +# All Rights Reserved. +# + +# Function to print warnings +warn() { + echo -e "\e[1;33m[WARN]\e[0m $1" >&2 +} + +# Function to compare versions +version_gt() { [ "$(printf '%s\n' "$1" "$2" | sort -V | head -n 1)" = "$2" ]; } + +# Function to get the expected k8s client version +get_client_version() { + local VERSION="${MIN_KUBE_VERSION}" + local SUPPORTED="false" + if [[ -n "${KUBE_SERVER_VERSION}" && ( "${KUBE_AVAILABLE_VERSIONS}" == *"${KUBE_SERVER_VERSION}"* ) ]]; then + VERSION="${KUBE_SERVER_VERSION}" + local SUPPORTED="true" + elif version_gt "${KUBE_SERVER_VERSION}" "${MAX_KUBE_VERSION}"; then + VERSION="${MAX_KUBE_VERSION}" + fi + echo "${VERSION} ${SUPPORTED}" +} + +# Function to get the k8s server version +get_server_version() { + local VERSION=$(echo "${KUBE_SERVER_VERSION}" || echo "") + + # Get the last time that the server version file have been updated. + local TIME_DIFF=0 + if [[ -f "${KUBE_SERVER_VERSION_FILE}" ]]; then + local FILE_MOD_TIME=$(stat -c %Y "${KUBE_SERVER_VERSION_FILE}") + local CURRENT_TIME=$(date +%s) + TIME_DIFF=$((CURRENT_TIME - FILE_MOD_TIME)) + fi + + # If the k8s server version is empty or + # the k8s server version file was updated more than 30min, + # get the version from the k8s server version file + if [[ -z "${VERSION}" || "${TIME_DIFF}" -gt 1800 ]]; then + local KUBE_CLIENT_BIN_PATH=$(find "${KUBE_BASE_PATH}${KUBE_CLIENT_VERSION}"/*/usr/bin/ -name "kubectl") + VERSION=$(${KUBE_CLIENT_BIN_PATH} version -o json 2>/dev/null | awk '/serverVersion/ {found=1} found && /gitVersion/ {gsub(/.*"v/, ""); gsub(/".*/, ""); print; exit}') + [[ -z "${VERSION}" || ( ! "${VERSION}" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ) ]] && VERSION="${KUBE_CLIENT_VERSION}" + echo "${VERSION}" > "${KUBE_SERVER_VERSION_FILE}" + fi + + echo "${VERSION}" +} + +BASE_VOLUME="/wd" +KUBE_BASE_PATH="/usr/local/kubernetes/" + +KUBE_SERVER_VERSION_FILE="${BASE_VOLUME}"/.kube_server_version + +KUBE_AVAILABLE_VERSIONS=$(ls "${KUBE_BASE_PATH}" | sort -V) + +MIN_KUBE_VERSION=$(echo "${KUBE_AVAILABLE_VERSIONS}" | head -n1) +MAX_KUBE_VERSION=$(echo "${KUBE_AVAILABLE_VERSIONS}" | tail -n1) + +KUBE_CLIENT_VERSION="${MIN_KUBE_VERSION}" +KUBE_SERVER_VERSION=$(cat "${KUBE_SERVER_VERSION_FILE}" 2> /dev/null) + +if [[ "${KUBE_SERVER_VERSION}" == "${MAX_KUBE_VERSION}" ]]; then + KUBE_CLIENT_VERSION="${KUBE_SERVER_VERSION}" +else + KUBE_SERVER_VERSION=$(get_server_version) + read KUBE_CLIENT_VERSION KUBE_SERVER_VERSION_IS_SUPPORTED <<< $(get_client_version) + + if [[ "${KUBE_SERVER_VERSION_IS_SUPPORTED}" == "false" ]]; then + warn "Detected a mismatch between Kubernetes client and server versions." + warn "Continuing with client version v${KUBE_CLIENT_VERSION} and server version v${KUBE_SERVER_VERSION}." + fi +fi + +KUBE_BIN_PATH=$(find "${KUBE_BASE_PATH}${KUBE_CLIENT_VERSION}"/*/usr/bin/ -name "kubectl") + +exec "${KUBE_BIN_PATH}" "$@" +EOL +)' | base64 -d > /usr/local/bin/kubectl && chmod +x /usr/local/bin/kubectl"