From ddf9c58293e98c6c8d3cb9912d4b41fd0d35f75c Mon Sep 17 00:00:00 2001 From: Lily Pan Date: Fri, 17 Jul 2026 11:36:27 -0700 Subject: [PATCH 1/3] fix: should install exact containerd version from components.json --- .../linux/cloud-init/artifacts/cse_install.sh | 20 ++------ .../artifacts/ubuntu/cse_install_ubuntu.sh | 48 +++++++++---------- 2 files changed, 26 insertions(+), 42 deletions(-) diff --git a/parts/linux/cloud-init/artifacts/cse_install.sh b/parts/linux/cloud-init/artifacts/cse_install.sh index 0958e3bab86..e288f501ac5 100755 --- a/parts/linux/cloud-init/artifacts/cse_install.sh +++ b/parts/linux/cloud-init/artifacts/cse_install.sh @@ -86,15 +86,7 @@ installContainerdWithComponentsJson() { last_index=$((array_size - 1)) fi packageVersion=${sortedPackageVersions[${last_index}]} - # containerd version is expected to be in the format major.minor.patch-hotfix - # e.g., 1.4.3-1. Then containerdMajorMinorPatchVersion=1.4.3 and containerdHotFixVersion=1 - containerdMajorMinorPatchVersion="$(echo "$packageVersion" | cut -d- -f1)" - containerdHotFixVersion="$(echo "$packageVersion" | cut -d- -s -f2)" - if [ -z "$containerdMajorMinorPatchVersion" ] || [ "$containerdMajorMinorPatchVersion" = "null" ] || [ "$containerdHotFixVersion" = "null" ]; then - echo "invalid containerd version: $packageVersion" - exit $ERR_CONTAINERD_VERSION_INVALID - fi - logs_to_events "AKS.CSE.installContainerRuntime.installStandaloneContainerd" "installStandaloneContainerd ${containerdMajorMinorPatchVersion} ${containerdHotFixVersion}" + logs_to_events "AKS.CSE.installContainerRuntime.installStandaloneContainerd" "installStandaloneContainerd ${packageVersion}" echo "in installContainerRuntime - CONTAINERD_VERSION = ${packageVersion}" } @@ -109,14 +101,8 @@ installContainerdWithManifestJson() { else echo "WARNING: containerd version not found in manifest, defaulting to hardcoded." fi - containerd_patch_version="$(echo "$containerd_version" | cut -d- -f1)" - containerd_revision="$(echo "$containerd_version" | cut -d- -f2)" - if [ -z "$containerd_patch_version" ] || [ "$containerd_patch_version" = "null" ] || [ "$containerd_revision" = "null" ]; then - echo "invalid container version: $containerd_version" - exit $ERR_CONTAINERD_INSTALL_TIMEOUT - fi - logs_to_events "AKS.CSE.installContainerRuntime.installStandaloneContainerd" "installStandaloneContainerd ${containerd_patch_version} ${containerd_revision}" - echo "in installContainerRuntime - CONTAINERD_VERSION = ${containerd_patch_version}" + logs_to_events "AKS.CSE.installContainerRuntime.installStandaloneContainerd" "installStandaloneContainerd ${containerd_version}" + echo "in installContainerRuntime - CONTAINERD_VERSION = ${containerd_version}" } installContainerRuntime() { diff --git a/parts/linux/cloud-init/artifacts/ubuntu/cse_install_ubuntu.sh b/parts/linux/cloud-init/artifacts/ubuntu/cse_install_ubuntu.sh index e9e5fd95107..ec35b2ccb37 100755 --- a/parts/linux/cloud-init/artifacts/ubuntu/cse_install_ubuntu.sh +++ b/parts/linux/cloud-init/artifacts/ubuntu/cse_install_ubuntu.sh @@ -528,9 +528,7 @@ downloadPkgFromVersion() { } installContainerd() { - packageVersion="${3:-}" - containerdMajorMinorPatchVersion="$(echo "$packageVersion" | cut -d- -f1)" - containerdHotFixVersion="$(echo "$packageVersion" | cut -d- -f2)" + local packageVersion="${3:-}" CONTAINERD_DOWNLOADS_DIR="${1:-$CONTAINERD_DOWNLOADS_DIR}" eval containerdOverrideDownloadURL="${2:-}" @@ -539,7 +537,7 @@ installContainerd() { installContainerdFromOverride ${containerdOverrideDownloadURL} || exit $ERR_CONTAINERD_INSTALL_TIMEOUT return 0 fi - installContainerdWithAptGet "${containerdMajorMinorPatchVersion}" "${containerdHotFixVersion}" "${CONTAINERD_DOWNLOADS_DIR}" || exit $ERR_CONTAINERD_INSTALL_TIMEOUT + installContainerdWithAptGet "${packageVersion}" "${CONTAINERD_DOWNLOADS_DIR}" || exit $ERR_CONTAINERD_INSTALL_TIMEOUT } installContainerdFromOverride() { @@ -555,15 +553,19 @@ installContainerdFromOverride() { } installContainerdWithAptGet() { - local containerdMajorMinorPatchVersion="${1}" - local containerdHotFixVersion="${2}" - CONTAINERD_DOWNLOADS_DIR="${3:-$CONTAINERD_DOWNLOADS_DIR}" + # packageVersion is the full version string from components.json, e.g. "2.3.2-ubuntu24.04u2" or "1.7.33-ubuntu22.04u1". + # The major.minor.patch is extracted for version comparison against the currently installed package. + local packageVersion="${1}" + CONTAINERD_DOWNLOADS_DIR="${2:-$CONTAINERD_DOWNLOADS_DIR}" + local containerdMajorMinorPatchVersion + containerdMajorMinorPatchVersion="$(echo "$packageVersion" | cut -d- -f1)" + # Query installed version via dpkg metadata instead of running the containerd # binary. `containerd -version` takes ~5.7s to load the full runtime just to # print a version string; dpkg-query is instant. # dpkg version format: "1.7.31+azure-ubuntu22.04u1" or "1:1.7.31+azure-..." # Normalize to pure "major.minor.patch" by stripping epoch, +suffix, -suffix. - currentVersion="" + local currentVersion="" if dpkg -l moby-containerd 2>/dev/null | grep -q "^ii"; then currentVersion=$(dpkg-query -W -f='${Version}' moby-containerd 2>/dev/null | sed 's/^[0-9]*://' | cut -d '+' -f1 | cut -d '-' -f1) fi @@ -572,26 +574,21 @@ installContainerdWithAptGet() { currentVersion="0.0.0" fi + local currentMajorMinor desiredMajorMinor currentMajorMinor="$(echo $currentVersion | tr '.' '\n' | head -n 2 | paste -sd.)" desiredMajorMinor="$(echo $containerdMajorMinorPatchVersion | tr '.' '\n' | head -n 2 | paste -sd.)" semverCompare "$currentVersion" "$containerdMajorMinorPatchVersion" - hasGreaterVersion="$?" + local hasGreaterVersion="$?" if [ "$hasGreaterVersion" = "0" ] && [ "$currentMajorMinor" = "$desiredMajorMinor" ]; then echo "currently installed containerd version ${currentVersion} matches major.minor with higher patch ${containerdMajorMinorPatchVersion}. skipping installStandaloneContainerd." else - echo "installing containerd version ${containerdMajorMinorPatchVersion}" + echo "installing containerd version ${packageVersion}" logs_to_events "AKS.CSE.installContainerRuntime.removeContainerd" removeContainerd - # if containerd version has been overriden then there should exist a local .deb file for it on aks VHDs (best-effort) - # if no files found then try fetching from packages.microsoft repo - containerdDebFile=$(find "${CONTAINERD_DOWNLOADS_DIR}" -maxdepth 1 -name "moby-containerd_${containerdMajorMinorPatchVersion}*" -print -quit 2>/dev/null) || containerdDebFile="" - if [ -n "${containerdDebFile}" ]; then - logs_to_events "AKS.CSE.installContainerRuntime.installDebPackageFromFile" "installDebPackageFromFile ${containerdDebFile}" || exit $ERR_CONTAINERD_INSTALL_TIMEOUT - return 0 - fi - logs_to_events "AKS.CSE.installContainerRuntime.downloadContainerdFromVersion" "downloadContainerdFromVersion ${containerdMajorMinorPatchVersion} ${containerdHotFixVersion}" - containerdDebFile=$(find "${CONTAINERD_DOWNLOADS_DIR}" -maxdepth 1 -name "moby-containerd_${containerdMajorMinorPatchVersion}*" -print -quit 2>/dev/null) || containerdDebFile="" + # No cached deb found — download from packages.microsoft.com + logs_to_events "AKS.CSE.installContainerRuntime.downloadContainerdFromVersion" "downloadContainerdFromVersion ${packageVersion}" + containerdDebFile=$(find "${CONTAINERD_DOWNLOADS_DIR}" -maxdepth 1 -name "moby-containerd_${packageVersion}*" 2>/dev/null | sort -V | tail -n1) if [ -z "${containerdDebFile}" ]; then echo "Failed to locate cached containerd deb" exit $ERR_CONTAINERD_INSTALL_TIMEOUT @@ -618,20 +615,21 @@ installStandaloneContainerd() { fi echo "Using specified Containerd Version: ${CONTAINERD_VERSION}-${CONTAINERD_PATCH_VERSION}" - installContainerdWithAptGet "${CONTAINERD_VERSION}" "${CONTAINERD_PATCH_VERSION}" || exit $ERR_CONTAINERD_INSTALL_TIMEOUT + installContainerdWithAptGet "${CONTAINERD_VERSION}-${CONTAINERD_PATCH_VERSION}" || exit $ERR_CONTAINERD_INSTALL_TIMEOUT } downloadContainerdFromVersion() { - # Patch version isn't used here...? - CONTAINERD_VERSION=$1 + # packageVersion is the full version string, e.g. "2.3.2-ubuntu24.04u2" or "1.7.33-ubuntu22.04u1". + # The major.minor.patch is extracted for the apt glob pattern. + local packageVersion="$1" mkdir -p $CONTAINERD_DOWNLOADS_DIR # Adding updateAptWithMicrosoftPkg since AB e2e uses an older image version with uncached containerd 1.6 so it needs to download from testing repo. # And RP no image pull e2e has apt update restrictions that prevent calls to packages.microsoft.com in CSE # This won't be called for new VHDs as they have containerd 1.6 cached updateAptWithMicrosoftPkg - apt_get_download 20 30 moby-containerd=${CONTAINERD_VERSION}* || exit $ERR_CONTAINERD_INSTALL_TIMEOUT - cp -al ${APT_CACHE_DIR}moby-containerd_${CONTAINERD_VERSION}* $CONTAINERD_DOWNLOADS_DIR/ || exit $ERR_CONTAINERD_INSTALL_TIMEOUT - echo "Succeeded to download containerd version ${CONTAINERD_VERSION}" + apt_get_download 20 30 moby-containerd=${packageVersion}* || exit $ERR_CONTAINERD_INSTALL_TIMEOUT + cp -al ${APT_CACHE_DIR}moby-containerd_${packageVersion}* $CONTAINERD_DOWNLOADS_DIR/ || exit $ERR_CONTAINERD_INSTALL_TIMEOUT + echo "Succeeded to download containerd version ${packageVersion}" } downloadContainerdFromURL() { From 41c87d3167d3a9f0e0ed89bc7e9333b5a6347729 Mon Sep 17 00:00:00 2001 From: Lily Pan Date: Fri, 17 Jul 2026 14:31:44 -0700 Subject: [PATCH 2/3] fix shellspec test --- .../parts/linux/cloud-init/artifacts/cse_install_spec.sh | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/spec/parts/linux/cloud-init/artifacts/cse_install_spec.sh b/spec/parts/linux/cloud-init/artifacts/cse_install_spec.sh index 2603b789599..139157295d4 100644 --- a/spec/parts/linux/cloud-init/artifacts/cse_install_spec.sh +++ b/spec/parts/linux/cloud-init/artifacts/cse_install_spec.sh @@ -22,8 +22,7 @@ Describe 'cse_install.sh' UBUNTU_RELEASE="20.04" containerdPackage=$(readPackage "containerd") When call installContainerRuntime - The variable containerdMajorMinorPatchVersion should equal "1.2.3" - The variable containerdHotFixVersion should equal "" + The variable packageVersion should equal "1.2.3" The output line 3 should equal "mock logs to events calling with AKS.CSE.installContainerRuntime.installStandaloneContainerd" The output line 4 should equal "in installContainerRuntime - CONTAINERD_VERSION = 1.2.3" End @@ -32,8 +31,7 @@ Describe 'cse_install.sh' OS="MARINER" containerdPackage=$(readPackage "containerd") When call installContainerRuntime - The variable containerdMajorMinorPatchVersion should equal "1.2.3" - The variable containerdHotFixVersion should equal "5.fake" + The variable packageVersion should equal "1.2.3-5.fake" The output line 3 should equal "mock logs to events calling with AKS.CSE.installContainerRuntime.installStandaloneContainerd" The output line 4 should equal "in installContainerRuntime - CONTAINERD_VERSION = 1.2.3-5.fake" End @@ -60,8 +58,7 @@ Describe 'cse_install.sh' OS="AZURELINUX" containerdPackage=$(readPackage "containerd") When call installContainerRuntime - The variable containerdMajorMinorPatchVersion should equal "2.0.0" - The variable containerdHotFixVersion should equal "1.fake" + The variable packageVersion should equal "2.0.0-1.fake" The output line 3 should equal "mock logs to events calling with AKS.CSE.installContainerRuntime.installStandaloneContainerd" The output line 4 should equal "in installContainerRuntime - CONTAINERD_VERSION = 2.0.0-1.fake" End From f976409e6f9abcbcce3ca57ca81904ed0ab795f6 Mon Sep 17 00:00:00 2001 From: Lily Pan Date: Fri, 17 Jul 2026 15:58:39 -0700 Subject: [PATCH 3/3] fix ubuntu installstandalonecontainerd --- .../linux/cloud-init/artifacts/ubuntu/cse_install_ubuntu.sh | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/parts/linux/cloud-init/artifacts/ubuntu/cse_install_ubuntu.sh b/parts/linux/cloud-init/artifacts/ubuntu/cse_install_ubuntu.sh index ec35b2ccb37..720a84b4054 100755 --- a/parts/linux/cloud-init/artifacts/ubuntu/cse_install_ubuntu.sh +++ b/parts/linux/cloud-init/artifacts/ubuntu/cse_install_ubuntu.sh @@ -604,8 +604,6 @@ installStandaloneContainerd() { # Read UBUNTU_CODENAME from /etc/os-release instead of lsb_release (avoids Python spawn). UBUNTU_CODENAME=$(. /etc/os-release && echo "${VERSION_CODENAME}") CONTAINERD_VERSION=$1 - # we always default to the .1 patch versons - CONTAINERD_PATCH_VERSION="${2:-1}" # the user-defined package URL is always picked first, and the other options won't be tried when this one fails CONTAINERD_PACKAGE_URL="${CONTAINERD_PACKAGE_URL:=}" @@ -614,8 +612,8 @@ installStandaloneContainerd() { return 0 fi - echo "Using specified Containerd Version: ${CONTAINERD_VERSION}-${CONTAINERD_PATCH_VERSION}" - installContainerdWithAptGet "${CONTAINERD_VERSION}-${CONTAINERD_PATCH_VERSION}" || exit $ERR_CONTAINERD_INSTALL_TIMEOUT + echo "Using specified Containerd Version: ${CONTAINERD_VERSION}" + installContainerdWithAptGet "${CONTAINERD_VERSION}" || exit $ERR_CONTAINERD_INSTALL_TIMEOUT } downloadContainerdFromVersion() {