diff --git a/parts/windows/kuberneteswindowssetup.ps1 b/parts/windows/kuberneteswindowssetup.ps1 index 8cc918e1c93..5d6d61c4a09 100644 --- a/parts/windows/kuberneteswindowssetup.ps1 +++ b/parts/windows/kuberneteswindowssetup.ps1 @@ -223,6 +223,7 @@ $global:WindowsCiliumInstallPath = Join-Path -Path $global:WindowsCiliumNetworki # Network isolated cluster $global:BootstrapProfileContainerRegistryServer="{{GetBootstrapProfileContainerRegistryServer}}" $global:MCRRepositoryBase="{{GetMCRRepositoryBase}}" +$global:NetworkIsolatedClusterTestMode = [System.Convert]::ToBoolean("{{GetNetworkIsolatedClusterTestMode}}"); # for ab e2e only for local ab test with remote cse package $global:OrasCacheDir="c:\aks-tools\oras\" # refer to components.json $global:OrasPath="c:\aks-tools\oras\oras.exe" @@ -246,36 +247,58 @@ try { $global:OperationId = New-Guid if (-not (Test-Path "C:\AzureData\windows\azurecnifunc.ps1")) { - # Determine the CSE package URL - $WindowsCSEScriptsPackage = "aks-windows-cse-scripts-current.zip" # CSEScriptsPackage is cached on VHD. Previously the cse package version was managed in components.json, whereas RP set the package URL which is a storage account. - # From 2025-06 The CSE packages is eleased on the VHD. RP can use fully qualified URL to download CSE scripts package when required out of VHD release cycle. + # From 2025-06 The CSE packages is released on the VHD. RP can use fully qualified URL to download CSE scripts package when required out of VHD release cycle. # In the transition period, it is important that when deal with older VHD versions, the agentbaker runtime provision script needs to be compatible with the latest known storage account package, 0.0.52. - Write-Log "Requested CSEScriptsPackageUrl is $global:CSEScriptsPackageUrl" - if ($global:CSEScriptsPackageUrl.EndsWith("/")) { - $search = @() - if ($global:CacheDir -and (Test-Path $global:CacheDir)) { - $search = [IO.Directory]::GetFiles($global:CacheDir, $WindowsCSEScriptsPackage, [IO.SearchOption]::AllDirectories) - # list files in the cache directory. - Write-Log "the directory $global:CacheDir contains the following files:" - Get-ChildItem -Path $global:CacheDir | ForEach-Object { Write-Log " $_" } + + $WindowsCSEScriptsPackage = "aks-windows-cse-scripts-current.zip" + $scriptsZip = $null + $shouldCleanup = $false + + # Step 1: Try to find cached scripts on VHD + if ($global:CacheDir -and (Test-Path $global:CacheDir)) { + $searchCachedScripts = [IO.Directory]::GetFiles($global:CacheDir, $WindowsCSEScriptsPackage, [IO.SearchOption]::AllDirectories) + Write-Log "the directory $global:CacheDir contains the following files:" + Get-ChildItem -Path $global:CacheDir | ForEach-Object { Write-Log " $_" } + if ($searchCachedScripts.Count -gt 0) { + $scriptsZip = $searchCachedScripts[0] + Write-Log "Found cached CSE scripts at $scriptsZip" } + } - if ($search.Count -eq 0) { - Write-Log "Could not find windows cse package on VHD. Use remote version instead." - $WindowsCSEScriptsPackage = "aks-windows-cse-scripts-v0.0.52.zip" + # Step 2: For non-network-isolated clusters, download scripts if needed (overrides cached version when appropriate) + $isNetworkIsolated = -not [string]::IsNullOrWhiteSpace($global:BootstrapProfileContainerRegistryServer) -and -not $global:NetworkIsolatedClusterTestMode + if (-not $isNetworkIsolated) { + Write-Log "Requested CSEScriptsPackageUrl is $global:CSEScriptsPackageUrl" + if ($global:CSEScriptsPackageUrl.EndsWith("/")) { + if (-not $scriptsZip) { + Write-Log "Could not find windows cse package on VHD. Use remote version instead." + $WindowsCSEScriptsPackage = "aks-windows-cse-scripts-v0.0.52.zip" + } + Write-Log "WindowsCSEScriptsPackage is $WindowsCSEScriptsPackage" + $global:CSEScriptsPackageUrl = $global:CSEScriptsPackageUrl + $WindowsCSEScriptsPackage } - Write-Log "WindowsCSEScriptsPackage is $WindowsCSEScriptsPackage" - $global:CSEScriptsPackageUrl = $global:CSEScriptsPackageUrl + $WindowsCSEScriptsPackage + Write-Log "CSEScriptsPackageUrl used for provision is $global:CSEScriptsPackageUrl" + + # Download CSE function scripts + $downloadedFile = 'c:\csescripts.zip' + Logs-To-Event -TaskName "AKS.WindowsCSE.DownloadAndExpandCSEScriptPackageUrl" -TaskMessage "Start to get CSE scripts. CSEScriptsPackageUrl: $global:CSEScriptsPackageUrl" + DownloadFileOverHttp -Url $global:CSEScriptsPackageUrl -DestinationPath $downloadedFile -ExitCode $global:WINDOWS_CSE_ERROR_DOWNLOAD_CSE_PACKAGE + $scriptsZip = $downloadedFile + $shouldCleanup = $true + } else { + Write-Log "Network isolated cluster detected (BootstrapProfileContainerRegistryServer is set), skip CSE scripts download and use cached scripts" + if (-not $scriptsZip) { + Set-ExitCode -ExitCode $global:WINDOWS_CSE_ERROR_NETWORK_ISOLATED_CLUSTER_CSE_NOT_CACHED -ErrorMessage "Cached CSE scripts package '$WindowsCSEScriptsPackage' not found under cache directory '$global:CacheDir'" + } + } + + # Step 3: Extract scripts from the resolved zip + Write-Log "Extracting CSE scripts from $scriptsZip" + AKS-Expand-Archive -Path $scriptsZip -DestinationPath "C:\\AzureData\\windows" + if ($shouldCleanup) { + Remove-Item -Path $scriptsZip -Force } - Write-Log "CSEScriptsPackageUrl used for provision is $global:CSEScriptsPackageUrl" - - # Download CSE function scripts - Logs-To-Event -TaskName "AKS.WindowsCSE.DownloadAndExpandCSEScriptPackageUrl" -TaskMessage "Start to get CSE scripts. CSEScriptsPackageUrl: $global:CSEScriptsPackageUrl" - $tempfile = 'c:\csescripts.zip' - DownloadFileOverHttp -Url $global:CSEScriptsPackageUrl -DestinationPath $tempfile -ExitCode $global:WINDOWS_CSE_ERROR_DOWNLOAD_CSE_PACKAGE - AKS-Expand-Archive -Path $tempfile -DestinationPath "C:\\AzureData\\windows" - Remove-Item -Path $tempfile -Force } else { Write-Log "CSE scripts already exist, skipping download" } diff --git a/parts/windows/windowscsehelper.ps1 b/parts/windows/windowscsehelper.ps1 index c4d892c59e6..6c62dfd1c4a 100644 --- a/parts/windows/windowscsehelper.ps1 +++ b/parts/windows/windowscsehelper.ps1 @@ -86,9 +86,10 @@ $global:WINDOWS_CSE_ERROR_ORAS_PULL_UNAUTHORIZED=79 # exit code for error pullin $global:WINDOWS_CSE_ERROR_ORAS_PULL_WINDOWSZIP_FAIL=80 # exit code for error pulling kubelet kubectl artifact with oras from registry $global:WINDOWS_CSE_ERROR_ORAS_PULL_CREDENTIAL_PROVIDER=81 # exit code for error pulling credential provider artifact with oras from registry $global:WINDOWS_CSE_ERROR_ORAS_PULL_POD_INFRA_CONTAINER=82 # exit code for error pulling pause image with oras from registry +$global:WINDOWS_CSE_ERROR_NETWORK_ISOLATED_CLUSTER_CSE_NOT_CACHED=83 # exit code for cse of network isolated cluster not cached # WINDOWS_CSE_ERROR_MAX_CODE is only used in unit tests to verify whether new error code name is added in $global:ErrorCodeNames # Please use the current value of WINDOWS_CSE_ERROR_MAX_CODE as the value of the new error code and increment it by 1 -$global:WINDOWS_CSE_ERROR_MAX_CODE=83 +$global:WINDOWS_CSE_ERROR_MAX_CODE=84 # Please add new error code for downloading new packages in RP code too $global:ErrorCodeNames = @( @@ -174,7 +175,8 @@ $global:ErrorCodeNames = @( "WINDOWS_CSE_ERROR_ORAS_PULL_UNAUTHORIZED", "WINDOWS_CSE_ERROR_ORAS_PULL_WINDOWSZIP_FAIL", "WINDOWS_CSE_ERROR_ORAS_PULL_CREDENTIAL_PROVIDER", - "WINDOWS_CSE_ERROR_ORAS_PULL_POD_INFRA_CONTAINER" + "WINDOWS_CSE_ERROR_ORAS_PULL_POD_INFRA_CONTAINER", + "WINDOWS_CSE_ERROR_NETWORK_ISOLATED_CLUSTER_CSE_NOT_CACHED" ) # The package domain to be used @@ -649,4 +651,3 @@ function Resolve-Error ($ErrorRecord=$Error[0]) $Exception |Format-List * -Force } } - diff --git a/pkg/agent/testdata/AKSWindows2019+CustomCloud+ootcredentialprovider/CustomData b/pkg/agent/testdata/AKSWindows2019+CustomCloud+ootcredentialprovider/CustomData index 4f021d31ea9..36bd8267d93 100644 --- a/pkg/agent/testdata/AKSWindows2019+CustomCloud+ootcredentialprovider/CustomData +++ b/pkg/agent/testdata/AKSWindows2019+CustomCloud+ootcredentialprovider/CustomData @@ -188,7 +188,7 @@ $global:AKSAADServerAppID = "6dae42f8-4368-4678-94ff-3960e28e3630" $global:IsDisableWindowsOutboundNat = [System.Convert]::ToBoolean("false"); # Base64 representation of ZIP archive -$zippedFiles = "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" +$zippedFiles = "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" $global:KubeClusterConfigPath = "c:\k\kubeclusterconfig.json" $fipsEnabled = [System.Convert]::ToBoolean("false") @@ -217,6 +217,7 @@ $global:WindowsCiliumInstallPath = Join-Path -Path $global:WindowsCiliumNetworki # Network isolated cluster $global:BootstrapProfileContainerRegistryServer="" $global:MCRRepositoryBase="mcr.microsoft.com/" +$global:NetworkIsolatedClusterTestMode = [System.Convert]::ToBoolean("false"); # for ab e2e only for local ab test with remote cse package $global:OrasCacheDir="c:\aks-tools\oras\" # refer to components.json $global:OrasPath="c:\aks-tools\oras\oras.exe" @@ -240,36 +241,58 @@ try { $global:OperationId = New-Guid if (-not (Test-Path "C:\AzureData\windows\azurecnifunc.ps1")) { - # Determine the CSE package URL - $WindowsCSEScriptsPackage = "aks-windows-cse-scripts-current.zip" # CSEScriptsPackage is cached on VHD. Previously the cse package version was managed in components.json, whereas RP set the package URL which is a storage account. - # From 2025-06 The CSE packages is eleased on the VHD. RP can use fully qualified URL to download CSE scripts package when required out of VHD release cycle. + # From 2025-06 The CSE packages is released on the VHD. RP can use fully qualified URL to download CSE scripts package when required out of VHD release cycle. # In the transition period, it is important that when deal with older VHD versions, the agentbaker runtime provision script needs to be compatible with the latest known storage account package, 0.0.52. - Write-Log "Requested CSEScriptsPackageUrl is $global:CSEScriptsPackageUrl" - if ($global:CSEScriptsPackageUrl.EndsWith("/")) { - $search = @() - if ($global:CacheDir -and (Test-Path $global:CacheDir)) { - $search = [IO.Directory]::GetFiles($global:CacheDir, $WindowsCSEScriptsPackage, [IO.SearchOption]::AllDirectories) - # list files in the cache directory. - Write-Log "the directory $global:CacheDir contains the following files:" - Get-ChildItem -Path $global:CacheDir | ForEach-Object { Write-Log " $_" } + + $WindowsCSEScriptsPackage = "aks-windows-cse-scripts-current.zip" + $scriptsZip = $null + $shouldCleanup = $false + + # Step 1: Try to find cached scripts on VHD + if ($global:CacheDir -and (Test-Path $global:CacheDir)) { + $searchCachedScripts = [IO.Directory]::GetFiles($global:CacheDir, $WindowsCSEScriptsPackage, [IO.SearchOption]::AllDirectories) + Write-Log "the directory $global:CacheDir contains the following files:" + Get-ChildItem -Path $global:CacheDir | ForEach-Object { Write-Log " $_" } + if ($searchCachedScripts.Count -gt 0) { + $scriptsZip = $searchCachedScripts[0] + Write-Log "Found cached CSE scripts at $scriptsZip" } + } - if ($search.Count -eq 0) { - Write-Log "Could not find windows cse package on VHD. Use remote version instead." - $WindowsCSEScriptsPackage = "aks-windows-cse-scripts-v0.0.52.zip" + # Step 2: For non-network-isolated clusters, download scripts if needed (overrides cached version when appropriate) + $isNetworkIsolated = -not [string]::IsNullOrWhiteSpace($global:BootstrapProfileContainerRegistryServer) -and -not $global:NetworkIsolatedClusterTestMode + if (-not $isNetworkIsolated) { + Write-Log "Requested CSEScriptsPackageUrl is $global:CSEScriptsPackageUrl" + if ($global:CSEScriptsPackageUrl.EndsWith("/")) { + if (-not $scriptsZip) { + Write-Log "Could not find windows cse package on VHD. Use remote version instead." + $WindowsCSEScriptsPackage = "aks-windows-cse-scripts-v0.0.52.zip" + } + Write-Log "WindowsCSEScriptsPackage is $WindowsCSEScriptsPackage" + $global:CSEScriptsPackageUrl = $global:CSEScriptsPackageUrl + $WindowsCSEScriptsPackage } - Write-Log "WindowsCSEScriptsPackage is $WindowsCSEScriptsPackage" - $global:CSEScriptsPackageUrl = $global:CSEScriptsPackageUrl + $WindowsCSEScriptsPackage + Write-Log "CSEScriptsPackageUrl used for provision is $global:CSEScriptsPackageUrl" + + # Download CSE function scripts + $downloadedFile = 'c:\csescripts.zip' + Logs-To-Event -TaskName "AKS.WindowsCSE.DownloadAndExpandCSEScriptPackageUrl" -TaskMessage "Start to get CSE scripts. CSEScriptsPackageUrl: $global:CSEScriptsPackageUrl" + DownloadFileOverHttp -Url $global:CSEScriptsPackageUrl -DestinationPath $downloadedFile -ExitCode $global:WINDOWS_CSE_ERROR_DOWNLOAD_CSE_PACKAGE + $scriptsZip = $downloadedFile + $shouldCleanup = $true + } else { + Write-Log "Network isolated cluster detected (BootstrapProfileContainerRegistryServer is set), skip CSE scripts download and use cached scripts" + if (-not $scriptsZip) { + Set-ExitCode -ExitCode $global:WINDOWS_CSE_ERROR_NETWORK_ISOLATED_CLUSTER_CSE_NOT_CACHED -ErrorMessage "Cached CSE scripts package '$WindowsCSEScriptsPackage' not found under cache directory '$global:CacheDir'" + } + } + + # Step 3: Extract scripts from the resolved zip + Write-Log "Extracting CSE scripts from $scriptsZip" + AKS-Expand-Archive -Path $scriptsZip -DestinationPath "C:\\AzureData\\windows" + if ($shouldCleanup) { + Remove-Item -Path $scriptsZip -Force } - Write-Log "CSEScriptsPackageUrl used for provision is $global:CSEScriptsPackageUrl" - - # Download CSE function scripts - Logs-To-Event -TaskName "AKS.WindowsCSE.DownloadAndExpandCSEScriptPackageUrl" -TaskMessage "Start to get CSE scripts. CSEScriptsPackageUrl: $global:CSEScriptsPackageUrl" - $tempfile = 'c:\csescripts.zip' - DownloadFileOverHttp -Url $global:CSEScriptsPackageUrl -DestinationPath $tempfile -ExitCode $global:WINDOWS_CSE_ERROR_DOWNLOAD_CSE_PACKAGE - AKS-Expand-Archive -Path $tempfile -DestinationPath "C:\\AzureData\\windows" - Remove-Item -Path $tempfile -Force } else { Write-Log "CSE scripts already exist, skipping download" } diff --git a/pkg/agent/testdata/AKSWindows2019+CustomCloud/CustomData b/pkg/agent/testdata/AKSWindows2019+CustomCloud/CustomData index fad956367d0..f48d7f9640f 100644 --- a/pkg/agent/testdata/AKSWindows2019+CustomCloud/CustomData +++ b/pkg/agent/testdata/AKSWindows2019+CustomCloud/CustomData @@ -188,7 +188,7 @@ $global:AKSAADServerAppID = "6dae42f8-4368-4678-94ff-3960e28e3630" $global:IsDisableWindowsOutboundNat = [System.Convert]::ToBoolean("false"); # Base64 representation of ZIP archive -$zippedFiles = "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" +$zippedFiles = "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" $global:KubeClusterConfigPath = "c:\k\kubeclusterconfig.json" $fipsEnabled = [System.Convert]::ToBoolean("false") @@ -217,6 +217,7 @@ $global:WindowsCiliumInstallPath = Join-Path -Path $global:WindowsCiliumNetworki # Network isolated cluster $global:BootstrapProfileContainerRegistryServer="" $global:MCRRepositoryBase="mcr.microsoft.com/" +$global:NetworkIsolatedClusterTestMode = [System.Convert]::ToBoolean("false"); # for ab e2e only for local ab test with remote cse package $global:OrasCacheDir="c:\aks-tools\oras\" # refer to components.json $global:OrasPath="c:\aks-tools\oras\oras.exe" @@ -240,36 +241,58 @@ try { $global:OperationId = New-Guid if (-not (Test-Path "C:\AzureData\windows\azurecnifunc.ps1")) { - # Determine the CSE package URL - $WindowsCSEScriptsPackage = "aks-windows-cse-scripts-current.zip" # CSEScriptsPackage is cached on VHD. Previously the cse package version was managed in components.json, whereas RP set the package URL which is a storage account. - # From 2025-06 The CSE packages is eleased on the VHD. RP can use fully qualified URL to download CSE scripts package when required out of VHD release cycle. + # From 2025-06 The CSE packages is released on the VHD. RP can use fully qualified URL to download CSE scripts package when required out of VHD release cycle. # In the transition period, it is important that when deal with older VHD versions, the agentbaker runtime provision script needs to be compatible with the latest known storage account package, 0.0.52. - Write-Log "Requested CSEScriptsPackageUrl is $global:CSEScriptsPackageUrl" - if ($global:CSEScriptsPackageUrl.EndsWith("/")) { - $search = @() - if ($global:CacheDir -and (Test-Path $global:CacheDir)) { - $search = [IO.Directory]::GetFiles($global:CacheDir, $WindowsCSEScriptsPackage, [IO.SearchOption]::AllDirectories) - # list files in the cache directory. - Write-Log "the directory $global:CacheDir contains the following files:" - Get-ChildItem -Path $global:CacheDir | ForEach-Object { Write-Log " $_" } + + $WindowsCSEScriptsPackage = "aks-windows-cse-scripts-current.zip" + $scriptsZip = $null + $shouldCleanup = $false + + # Step 1: Try to find cached scripts on VHD + if ($global:CacheDir -and (Test-Path $global:CacheDir)) { + $searchCachedScripts = [IO.Directory]::GetFiles($global:CacheDir, $WindowsCSEScriptsPackage, [IO.SearchOption]::AllDirectories) + Write-Log "the directory $global:CacheDir contains the following files:" + Get-ChildItem -Path $global:CacheDir | ForEach-Object { Write-Log " $_" } + if ($searchCachedScripts.Count -gt 0) { + $scriptsZip = $searchCachedScripts[0] + Write-Log "Found cached CSE scripts at $scriptsZip" } + } - if ($search.Count -eq 0) { - Write-Log "Could not find windows cse package on VHD. Use remote version instead." - $WindowsCSEScriptsPackage = "aks-windows-cse-scripts-v0.0.52.zip" + # Step 2: For non-network-isolated clusters, download scripts if needed (overrides cached version when appropriate) + $isNetworkIsolated = -not [string]::IsNullOrWhiteSpace($global:BootstrapProfileContainerRegistryServer) -and -not $global:NetworkIsolatedClusterTestMode + if (-not $isNetworkIsolated) { + Write-Log "Requested CSEScriptsPackageUrl is $global:CSEScriptsPackageUrl" + if ($global:CSEScriptsPackageUrl.EndsWith("/")) { + if (-not $scriptsZip) { + Write-Log "Could not find windows cse package on VHD. Use remote version instead." + $WindowsCSEScriptsPackage = "aks-windows-cse-scripts-v0.0.52.zip" + } + Write-Log "WindowsCSEScriptsPackage is $WindowsCSEScriptsPackage" + $global:CSEScriptsPackageUrl = $global:CSEScriptsPackageUrl + $WindowsCSEScriptsPackage } - Write-Log "WindowsCSEScriptsPackage is $WindowsCSEScriptsPackage" - $global:CSEScriptsPackageUrl = $global:CSEScriptsPackageUrl + $WindowsCSEScriptsPackage + Write-Log "CSEScriptsPackageUrl used for provision is $global:CSEScriptsPackageUrl" + + # Download CSE function scripts + $downloadedFile = 'c:\csescripts.zip' + Logs-To-Event -TaskName "AKS.WindowsCSE.DownloadAndExpandCSEScriptPackageUrl" -TaskMessage "Start to get CSE scripts. CSEScriptsPackageUrl: $global:CSEScriptsPackageUrl" + DownloadFileOverHttp -Url $global:CSEScriptsPackageUrl -DestinationPath $downloadedFile -ExitCode $global:WINDOWS_CSE_ERROR_DOWNLOAD_CSE_PACKAGE + $scriptsZip = $downloadedFile + $shouldCleanup = $true + } else { + Write-Log "Network isolated cluster detected (BootstrapProfileContainerRegistryServer is set), skip CSE scripts download and use cached scripts" + if (-not $scriptsZip) { + Set-ExitCode -ExitCode $global:WINDOWS_CSE_ERROR_NETWORK_ISOLATED_CLUSTER_CSE_NOT_CACHED -ErrorMessage "Cached CSE scripts package '$WindowsCSEScriptsPackage' not found under cache directory '$global:CacheDir'" + } + } + + # Step 3: Extract scripts from the resolved zip + Write-Log "Extracting CSE scripts from $scriptsZip" + AKS-Expand-Archive -Path $scriptsZip -DestinationPath "C:\\AzureData\\windows" + if ($shouldCleanup) { + Remove-Item -Path $scriptsZip -Force } - Write-Log "CSEScriptsPackageUrl used for provision is $global:CSEScriptsPackageUrl" - - # Download CSE function scripts - Logs-To-Event -TaskName "AKS.WindowsCSE.DownloadAndExpandCSEScriptPackageUrl" -TaskMessage "Start to get CSE scripts. CSEScriptsPackageUrl: $global:CSEScriptsPackageUrl" - $tempfile = 'c:\csescripts.zip' - DownloadFileOverHttp -Url $global:CSEScriptsPackageUrl -DestinationPath $tempfile -ExitCode $global:WINDOWS_CSE_ERROR_DOWNLOAD_CSE_PACKAGE - AKS-Expand-Archive -Path $tempfile -DestinationPath "C:\\AzureData\\windows" - Remove-Item -Path $tempfile -Force } else { Write-Log "CSE scripts already exist, skipping download" } diff --git a/pkg/agent/testdata/AKSWindows2019+CustomVnet/CustomData b/pkg/agent/testdata/AKSWindows2019+CustomVnet/CustomData index ac91811eba6..22393e18db3 100644 --- a/pkg/agent/testdata/AKSWindows2019+CustomVnet/CustomData +++ b/pkg/agent/testdata/AKSWindows2019+CustomVnet/CustomData @@ -188,7 +188,7 @@ $global:AKSAADServerAppID = "6dae42f8-4368-4678-94ff-3960e28e3630" $global:IsDisableWindowsOutboundNat = [System.Convert]::ToBoolean("false"); # Base64 representation of ZIP archive -$zippedFiles = "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" +$zippedFiles = "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" $global:KubeClusterConfigPath = "c:\k\kubeclusterconfig.json" $fipsEnabled = [System.Convert]::ToBoolean("false") @@ -217,6 +217,7 @@ $global:WindowsCiliumInstallPath = Join-Path -Path $global:WindowsCiliumNetworki # Network isolated cluster $global:BootstrapProfileContainerRegistryServer="" $global:MCRRepositoryBase="mcr.microsoft.com/" +$global:NetworkIsolatedClusterTestMode = [System.Convert]::ToBoolean("false"); # for ab e2e only for local ab test with remote cse package $global:OrasCacheDir="c:\aks-tools\oras\" # refer to components.json $global:OrasPath="c:\aks-tools\oras\oras.exe" @@ -240,36 +241,58 @@ try { $global:OperationId = New-Guid if (-not (Test-Path "C:\AzureData\windows\azurecnifunc.ps1")) { - # Determine the CSE package URL - $WindowsCSEScriptsPackage = "aks-windows-cse-scripts-current.zip" # CSEScriptsPackage is cached on VHD. Previously the cse package version was managed in components.json, whereas RP set the package URL which is a storage account. - # From 2025-06 The CSE packages is eleased on the VHD. RP can use fully qualified URL to download CSE scripts package when required out of VHD release cycle. + # From 2025-06 The CSE packages is released on the VHD. RP can use fully qualified URL to download CSE scripts package when required out of VHD release cycle. # In the transition period, it is important that when deal with older VHD versions, the agentbaker runtime provision script needs to be compatible with the latest known storage account package, 0.0.52. - Write-Log "Requested CSEScriptsPackageUrl is $global:CSEScriptsPackageUrl" - if ($global:CSEScriptsPackageUrl.EndsWith("/")) { - $search = @() - if ($global:CacheDir -and (Test-Path $global:CacheDir)) { - $search = [IO.Directory]::GetFiles($global:CacheDir, $WindowsCSEScriptsPackage, [IO.SearchOption]::AllDirectories) - # list files in the cache directory. - Write-Log "the directory $global:CacheDir contains the following files:" - Get-ChildItem -Path $global:CacheDir | ForEach-Object { Write-Log " $_" } + + $WindowsCSEScriptsPackage = "aks-windows-cse-scripts-current.zip" + $scriptsZip = $null + $shouldCleanup = $false + + # Step 1: Try to find cached scripts on VHD + if ($global:CacheDir -and (Test-Path $global:CacheDir)) { + $searchCachedScripts = [IO.Directory]::GetFiles($global:CacheDir, $WindowsCSEScriptsPackage, [IO.SearchOption]::AllDirectories) + Write-Log "the directory $global:CacheDir contains the following files:" + Get-ChildItem -Path $global:CacheDir | ForEach-Object { Write-Log " $_" } + if ($searchCachedScripts.Count -gt 0) { + $scriptsZip = $searchCachedScripts[0] + Write-Log "Found cached CSE scripts at $scriptsZip" } + } - if ($search.Count -eq 0) { - Write-Log "Could not find windows cse package on VHD. Use remote version instead." - $WindowsCSEScriptsPackage = "aks-windows-cse-scripts-v0.0.52.zip" + # Step 2: For non-network-isolated clusters, download scripts if needed (overrides cached version when appropriate) + $isNetworkIsolated = -not [string]::IsNullOrWhiteSpace($global:BootstrapProfileContainerRegistryServer) -and -not $global:NetworkIsolatedClusterTestMode + if (-not $isNetworkIsolated) { + Write-Log "Requested CSEScriptsPackageUrl is $global:CSEScriptsPackageUrl" + if ($global:CSEScriptsPackageUrl.EndsWith("/")) { + if (-not $scriptsZip) { + Write-Log "Could not find windows cse package on VHD. Use remote version instead." + $WindowsCSEScriptsPackage = "aks-windows-cse-scripts-v0.0.52.zip" + } + Write-Log "WindowsCSEScriptsPackage is $WindowsCSEScriptsPackage" + $global:CSEScriptsPackageUrl = $global:CSEScriptsPackageUrl + $WindowsCSEScriptsPackage } - Write-Log "WindowsCSEScriptsPackage is $WindowsCSEScriptsPackage" - $global:CSEScriptsPackageUrl = $global:CSEScriptsPackageUrl + $WindowsCSEScriptsPackage + Write-Log "CSEScriptsPackageUrl used for provision is $global:CSEScriptsPackageUrl" + + # Download CSE function scripts + $downloadedFile = 'c:\csescripts.zip' + Logs-To-Event -TaskName "AKS.WindowsCSE.DownloadAndExpandCSEScriptPackageUrl" -TaskMessage "Start to get CSE scripts. CSEScriptsPackageUrl: $global:CSEScriptsPackageUrl" + DownloadFileOverHttp -Url $global:CSEScriptsPackageUrl -DestinationPath $downloadedFile -ExitCode $global:WINDOWS_CSE_ERROR_DOWNLOAD_CSE_PACKAGE + $scriptsZip = $downloadedFile + $shouldCleanup = $true + } else { + Write-Log "Network isolated cluster detected (BootstrapProfileContainerRegistryServer is set), skip CSE scripts download and use cached scripts" + if (-not $scriptsZip) { + Set-ExitCode -ExitCode $global:WINDOWS_CSE_ERROR_NETWORK_ISOLATED_CLUSTER_CSE_NOT_CACHED -ErrorMessage "Cached CSE scripts package '$WindowsCSEScriptsPackage' not found under cache directory '$global:CacheDir'" + } + } + + # Step 3: Extract scripts from the resolved zip + Write-Log "Extracting CSE scripts from $scriptsZip" + AKS-Expand-Archive -Path $scriptsZip -DestinationPath "C:\\AzureData\\windows" + if ($shouldCleanup) { + Remove-Item -Path $scriptsZip -Force } - Write-Log "CSEScriptsPackageUrl used for provision is $global:CSEScriptsPackageUrl" - - # Download CSE function scripts - Logs-To-Event -TaskName "AKS.WindowsCSE.DownloadAndExpandCSEScriptPackageUrl" -TaskMessage "Start to get CSE scripts. CSEScriptsPackageUrl: $global:CSEScriptsPackageUrl" - $tempfile = 'c:\csescripts.zip' - DownloadFileOverHttp -Url $global:CSEScriptsPackageUrl -DestinationPath $tempfile -ExitCode $global:WINDOWS_CSE_ERROR_DOWNLOAD_CSE_PACKAGE - AKS-Expand-Archive -Path $tempfile -DestinationPath "C:\\AzureData\\windows" - Remove-Item -Path $tempfile -Force } else { Write-Log "CSE scripts already exist, skipping download" } diff --git a/pkg/agent/testdata/AKSWindows2019+EnablePrivateClusterHostsConfigAgent/CustomData b/pkg/agent/testdata/AKSWindows2019+EnablePrivateClusterHostsConfigAgent/CustomData index 4f170f9bb84..7f78bb37c60 100644 --- a/pkg/agent/testdata/AKSWindows2019+EnablePrivateClusterHostsConfigAgent/CustomData +++ b/pkg/agent/testdata/AKSWindows2019+EnablePrivateClusterHostsConfigAgent/CustomData @@ -188,7 +188,7 @@ $global:AKSAADServerAppID = "6dae42f8-4368-4678-94ff-3960e28e3630" $global:IsDisableWindowsOutboundNat = [System.Convert]::ToBoolean("false"); # Base64 representation of ZIP archive -$zippedFiles = "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" +$zippedFiles = "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" $global:KubeClusterConfigPath = "c:\k\kubeclusterconfig.json" $fipsEnabled = [System.Convert]::ToBoolean("false") @@ -217,6 +217,7 @@ $global:WindowsCiliumInstallPath = Join-Path -Path $global:WindowsCiliumNetworki # Network isolated cluster $global:BootstrapProfileContainerRegistryServer="" $global:MCRRepositoryBase="mcr.microsoft.com/" +$global:NetworkIsolatedClusterTestMode = [System.Convert]::ToBoolean("false"); # for ab e2e only for local ab test with remote cse package $global:OrasCacheDir="c:\aks-tools\oras\" # refer to components.json $global:OrasPath="c:\aks-tools\oras\oras.exe" @@ -240,36 +241,58 @@ try { $global:OperationId = New-Guid if (-not (Test-Path "C:\AzureData\windows\azurecnifunc.ps1")) { - # Determine the CSE package URL - $WindowsCSEScriptsPackage = "aks-windows-cse-scripts-current.zip" # CSEScriptsPackage is cached on VHD. Previously the cse package version was managed in components.json, whereas RP set the package URL which is a storage account. - # From 2025-06 The CSE packages is eleased on the VHD. RP can use fully qualified URL to download CSE scripts package when required out of VHD release cycle. + # From 2025-06 The CSE packages is released on the VHD. RP can use fully qualified URL to download CSE scripts package when required out of VHD release cycle. # In the transition period, it is important that when deal with older VHD versions, the agentbaker runtime provision script needs to be compatible with the latest known storage account package, 0.0.52. - Write-Log "Requested CSEScriptsPackageUrl is $global:CSEScriptsPackageUrl" - if ($global:CSEScriptsPackageUrl.EndsWith("/")) { - $search = @() - if ($global:CacheDir -and (Test-Path $global:CacheDir)) { - $search = [IO.Directory]::GetFiles($global:CacheDir, $WindowsCSEScriptsPackage, [IO.SearchOption]::AllDirectories) - # list files in the cache directory. - Write-Log "the directory $global:CacheDir contains the following files:" - Get-ChildItem -Path $global:CacheDir | ForEach-Object { Write-Log " $_" } + + $WindowsCSEScriptsPackage = "aks-windows-cse-scripts-current.zip" + $scriptsZip = $null + $shouldCleanup = $false + + # Step 1: Try to find cached scripts on VHD + if ($global:CacheDir -and (Test-Path $global:CacheDir)) { + $searchCachedScripts = [IO.Directory]::GetFiles($global:CacheDir, $WindowsCSEScriptsPackage, [IO.SearchOption]::AllDirectories) + Write-Log "the directory $global:CacheDir contains the following files:" + Get-ChildItem -Path $global:CacheDir | ForEach-Object { Write-Log " $_" } + if ($searchCachedScripts.Count -gt 0) { + $scriptsZip = $searchCachedScripts[0] + Write-Log "Found cached CSE scripts at $scriptsZip" } + } - if ($search.Count -eq 0) { - Write-Log "Could not find windows cse package on VHD. Use remote version instead." - $WindowsCSEScriptsPackage = "aks-windows-cse-scripts-v0.0.52.zip" + # Step 2: For non-network-isolated clusters, download scripts if needed (overrides cached version when appropriate) + $isNetworkIsolated = -not [string]::IsNullOrWhiteSpace($global:BootstrapProfileContainerRegistryServer) -and -not $global:NetworkIsolatedClusterTestMode + if (-not $isNetworkIsolated) { + Write-Log "Requested CSEScriptsPackageUrl is $global:CSEScriptsPackageUrl" + if ($global:CSEScriptsPackageUrl.EndsWith("/")) { + if (-not $scriptsZip) { + Write-Log "Could not find windows cse package on VHD. Use remote version instead." + $WindowsCSEScriptsPackage = "aks-windows-cse-scripts-v0.0.52.zip" + } + Write-Log "WindowsCSEScriptsPackage is $WindowsCSEScriptsPackage" + $global:CSEScriptsPackageUrl = $global:CSEScriptsPackageUrl + $WindowsCSEScriptsPackage } - Write-Log "WindowsCSEScriptsPackage is $WindowsCSEScriptsPackage" - $global:CSEScriptsPackageUrl = $global:CSEScriptsPackageUrl + $WindowsCSEScriptsPackage + Write-Log "CSEScriptsPackageUrl used for provision is $global:CSEScriptsPackageUrl" + + # Download CSE function scripts + $downloadedFile = 'c:\csescripts.zip' + Logs-To-Event -TaskName "AKS.WindowsCSE.DownloadAndExpandCSEScriptPackageUrl" -TaskMessage "Start to get CSE scripts. CSEScriptsPackageUrl: $global:CSEScriptsPackageUrl" + DownloadFileOverHttp -Url $global:CSEScriptsPackageUrl -DestinationPath $downloadedFile -ExitCode $global:WINDOWS_CSE_ERROR_DOWNLOAD_CSE_PACKAGE + $scriptsZip = $downloadedFile + $shouldCleanup = $true + } else { + Write-Log "Network isolated cluster detected (BootstrapProfileContainerRegistryServer is set), skip CSE scripts download and use cached scripts" + if (-not $scriptsZip) { + Set-ExitCode -ExitCode $global:WINDOWS_CSE_ERROR_NETWORK_ISOLATED_CLUSTER_CSE_NOT_CACHED -ErrorMessage "Cached CSE scripts package '$WindowsCSEScriptsPackage' not found under cache directory '$global:CacheDir'" + } + } + + # Step 3: Extract scripts from the resolved zip + Write-Log "Extracting CSE scripts from $scriptsZip" + AKS-Expand-Archive -Path $scriptsZip -DestinationPath "C:\\AzureData\\windows" + if ($shouldCleanup) { + Remove-Item -Path $scriptsZip -Force } - Write-Log "CSEScriptsPackageUrl used for provision is $global:CSEScriptsPackageUrl" - - # Download CSE function scripts - Logs-To-Event -TaskName "AKS.WindowsCSE.DownloadAndExpandCSEScriptPackageUrl" -TaskMessage "Start to get CSE scripts. CSEScriptsPackageUrl: $global:CSEScriptsPackageUrl" - $tempfile = 'c:\csescripts.zip' - DownloadFileOverHttp -Url $global:CSEScriptsPackageUrl -DestinationPath $tempfile -ExitCode $global:WINDOWS_CSE_ERROR_DOWNLOAD_CSE_PACKAGE - AKS-Expand-Archive -Path $tempfile -DestinationPath "C:\\AzureData\\windows" - Remove-Item -Path $tempfile -Force } else { Write-Log "CSE scripts already exist, skipping download" } diff --git a/pkg/agent/testdata/AKSWindows2019+K8S116/CustomData b/pkg/agent/testdata/AKSWindows2019+K8S116/CustomData index 92664402c24..a5f0578a16a 100644 --- a/pkg/agent/testdata/AKSWindows2019+K8S116/CustomData +++ b/pkg/agent/testdata/AKSWindows2019+K8S116/CustomData @@ -188,7 +188,7 @@ $global:AKSAADServerAppID = "6dae42f8-4368-4678-94ff-3960e28e3630" $global:IsDisableWindowsOutboundNat = [System.Convert]::ToBoolean("false"); # Base64 representation of ZIP archive -$zippedFiles = "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" +$zippedFiles = "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" $global:KubeClusterConfigPath = "c:\k\kubeclusterconfig.json" $fipsEnabled = [System.Convert]::ToBoolean("false") @@ -217,6 +217,7 @@ $global:WindowsCiliumInstallPath = Join-Path -Path $global:WindowsCiliumNetworki # Network isolated cluster $global:BootstrapProfileContainerRegistryServer="" $global:MCRRepositoryBase="mcr.microsoft.com/" +$global:NetworkIsolatedClusterTestMode = [System.Convert]::ToBoolean("false"); # for ab e2e only for local ab test with remote cse package $global:OrasCacheDir="c:\aks-tools\oras\" # refer to components.json $global:OrasPath="c:\aks-tools\oras\oras.exe" @@ -240,36 +241,58 @@ try { $global:OperationId = New-Guid if (-not (Test-Path "C:\AzureData\windows\azurecnifunc.ps1")) { - # Determine the CSE package URL - $WindowsCSEScriptsPackage = "aks-windows-cse-scripts-current.zip" # CSEScriptsPackage is cached on VHD. Previously the cse package version was managed in components.json, whereas RP set the package URL which is a storage account. - # From 2025-06 The CSE packages is eleased on the VHD. RP can use fully qualified URL to download CSE scripts package when required out of VHD release cycle. + # From 2025-06 The CSE packages is released on the VHD. RP can use fully qualified URL to download CSE scripts package when required out of VHD release cycle. # In the transition period, it is important that when deal with older VHD versions, the agentbaker runtime provision script needs to be compatible with the latest known storage account package, 0.0.52. - Write-Log "Requested CSEScriptsPackageUrl is $global:CSEScriptsPackageUrl" - if ($global:CSEScriptsPackageUrl.EndsWith("/")) { - $search = @() - if ($global:CacheDir -and (Test-Path $global:CacheDir)) { - $search = [IO.Directory]::GetFiles($global:CacheDir, $WindowsCSEScriptsPackage, [IO.SearchOption]::AllDirectories) - # list files in the cache directory. - Write-Log "the directory $global:CacheDir contains the following files:" - Get-ChildItem -Path $global:CacheDir | ForEach-Object { Write-Log " $_" } + + $WindowsCSEScriptsPackage = "aks-windows-cse-scripts-current.zip" + $scriptsZip = $null + $shouldCleanup = $false + + # Step 1: Try to find cached scripts on VHD + if ($global:CacheDir -and (Test-Path $global:CacheDir)) { + $searchCachedScripts = [IO.Directory]::GetFiles($global:CacheDir, $WindowsCSEScriptsPackage, [IO.SearchOption]::AllDirectories) + Write-Log "the directory $global:CacheDir contains the following files:" + Get-ChildItem -Path $global:CacheDir | ForEach-Object { Write-Log " $_" } + if ($searchCachedScripts.Count -gt 0) { + $scriptsZip = $searchCachedScripts[0] + Write-Log "Found cached CSE scripts at $scriptsZip" } + } - if ($search.Count -eq 0) { - Write-Log "Could not find windows cse package on VHD. Use remote version instead." - $WindowsCSEScriptsPackage = "aks-windows-cse-scripts-v0.0.52.zip" + # Step 2: For non-network-isolated clusters, download scripts if needed (overrides cached version when appropriate) + $isNetworkIsolated = -not [string]::IsNullOrWhiteSpace($global:BootstrapProfileContainerRegistryServer) -and -not $global:NetworkIsolatedClusterTestMode + if (-not $isNetworkIsolated) { + Write-Log "Requested CSEScriptsPackageUrl is $global:CSEScriptsPackageUrl" + if ($global:CSEScriptsPackageUrl.EndsWith("/")) { + if (-not $scriptsZip) { + Write-Log "Could not find windows cse package on VHD. Use remote version instead." + $WindowsCSEScriptsPackage = "aks-windows-cse-scripts-v0.0.52.zip" + } + Write-Log "WindowsCSEScriptsPackage is $WindowsCSEScriptsPackage" + $global:CSEScriptsPackageUrl = $global:CSEScriptsPackageUrl + $WindowsCSEScriptsPackage } - Write-Log "WindowsCSEScriptsPackage is $WindowsCSEScriptsPackage" - $global:CSEScriptsPackageUrl = $global:CSEScriptsPackageUrl + $WindowsCSEScriptsPackage + Write-Log "CSEScriptsPackageUrl used for provision is $global:CSEScriptsPackageUrl" + + # Download CSE function scripts + $downloadedFile = 'c:\csescripts.zip' + Logs-To-Event -TaskName "AKS.WindowsCSE.DownloadAndExpandCSEScriptPackageUrl" -TaskMessage "Start to get CSE scripts. CSEScriptsPackageUrl: $global:CSEScriptsPackageUrl" + DownloadFileOverHttp -Url $global:CSEScriptsPackageUrl -DestinationPath $downloadedFile -ExitCode $global:WINDOWS_CSE_ERROR_DOWNLOAD_CSE_PACKAGE + $scriptsZip = $downloadedFile + $shouldCleanup = $true + } else { + Write-Log "Network isolated cluster detected (BootstrapProfileContainerRegistryServer is set), skip CSE scripts download and use cached scripts" + if (-not $scriptsZip) { + Set-ExitCode -ExitCode $global:WINDOWS_CSE_ERROR_NETWORK_ISOLATED_CLUSTER_CSE_NOT_CACHED -ErrorMessage "Cached CSE scripts package '$WindowsCSEScriptsPackage' not found under cache directory '$global:CacheDir'" + } + } + + # Step 3: Extract scripts from the resolved zip + Write-Log "Extracting CSE scripts from $scriptsZip" + AKS-Expand-Archive -Path $scriptsZip -DestinationPath "C:\\AzureData\\windows" + if ($shouldCleanup) { + Remove-Item -Path $scriptsZip -Force } - Write-Log "CSEScriptsPackageUrl used for provision is $global:CSEScriptsPackageUrl" - - # Download CSE function scripts - Logs-To-Event -TaskName "AKS.WindowsCSE.DownloadAndExpandCSEScriptPackageUrl" -TaskMessage "Start to get CSE scripts. CSEScriptsPackageUrl: $global:CSEScriptsPackageUrl" - $tempfile = 'c:\csescripts.zip' - DownloadFileOverHttp -Url $global:CSEScriptsPackageUrl -DestinationPath $tempfile -ExitCode $global:WINDOWS_CSE_ERROR_DOWNLOAD_CSE_PACKAGE - AKS-Expand-Archive -Path $tempfile -DestinationPath "C:\\AzureData\\windows" - Remove-Item -Path $tempfile -Force } else { Write-Log "CSE scripts already exist, skipping download" } diff --git a/pkg/agent/testdata/AKSWindows2019+K8S117/CustomData b/pkg/agent/testdata/AKSWindows2019+K8S117/CustomData index be1b8e2ea49..865719acc6b 100644 --- a/pkg/agent/testdata/AKSWindows2019+K8S117/CustomData +++ b/pkg/agent/testdata/AKSWindows2019+K8S117/CustomData @@ -188,7 +188,7 @@ $global:AKSAADServerAppID = "6dae42f8-4368-4678-94ff-3960e28e3630" $global:IsDisableWindowsOutboundNat = [System.Convert]::ToBoolean("false"); # Base64 representation of ZIP archive -$zippedFiles = "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" +$zippedFiles = "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" $global:KubeClusterConfigPath = "c:\k\kubeclusterconfig.json" $fipsEnabled = [System.Convert]::ToBoolean("false") @@ -217,6 +217,7 @@ $global:WindowsCiliumInstallPath = Join-Path -Path $global:WindowsCiliumNetworki # Network isolated cluster $global:BootstrapProfileContainerRegistryServer="" $global:MCRRepositoryBase="mcr.microsoft.com/" +$global:NetworkIsolatedClusterTestMode = [System.Convert]::ToBoolean("false"); # for ab e2e only for local ab test with remote cse package $global:OrasCacheDir="c:\aks-tools\oras\" # refer to components.json $global:OrasPath="c:\aks-tools\oras\oras.exe" @@ -240,36 +241,58 @@ try { $global:OperationId = New-Guid if (-not (Test-Path "C:\AzureData\windows\azurecnifunc.ps1")) { - # Determine the CSE package URL - $WindowsCSEScriptsPackage = "aks-windows-cse-scripts-current.zip" # CSEScriptsPackage is cached on VHD. Previously the cse package version was managed in components.json, whereas RP set the package URL which is a storage account. - # From 2025-06 The CSE packages is eleased on the VHD. RP can use fully qualified URL to download CSE scripts package when required out of VHD release cycle. + # From 2025-06 The CSE packages is released on the VHD. RP can use fully qualified URL to download CSE scripts package when required out of VHD release cycle. # In the transition period, it is important that when deal with older VHD versions, the agentbaker runtime provision script needs to be compatible with the latest known storage account package, 0.0.52. - Write-Log "Requested CSEScriptsPackageUrl is $global:CSEScriptsPackageUrl" - if ($global:CSEScriptsPackageUrl.EndsWith("/")) { - $search = @() - if ($global:CacheDir -and (Test-Path $global:CacheDir)) { - $search = [IO.Directory]::GetFiles($global:CacheDir, $WindowsCSEScriptsPackage, [IO.SearchOption]::AllDirectories) - # list files in the cache directory. - Write-Log "the directory $global:CacheDir contains the following files:" - Get-ChildItem -Path $global:CacheDir | ForEach-Object { Write-Log " $_" } + + $WindowsCSEScriptsPackage = "aks-windows-cse-scripts-current.zip" + $scriptsZip = $null + $shouldCleanup = $false + + # Step 1: Try to find cached scripts on VHD + if ($global:CacheDir -and (Test-Path $global:CacheDir)) { + $searchCachedScripts = [IO.Directory]::GetFiles($global:CacheDir, $WindowsCSEScriptsPackage, [IO.SearchOption]::AllDirectories) + Write-Log "the directory $global:CacheDir contains the following files:" + Get-ChildItem -Path $global:CacheDir | ForEach-Object { Write-Log " $_" } + if ($searchCachedScripts.Count -gt 0) { + $scriptsZip = $searchCachedScripts[0] + Write-Log "Found cached CSE scripts at $scriptsZip" } + } - if ($search.Count -eq 0) { - Write-Log "Could not find windows cse package on VHD. Use remote version instead." - $WindowsCSEScriptsPackage = "aks-windows-cse-scripts-v0.0.52.zip" + # Step 2: For non-network-isolated clusters, download scripts if needed (overrides cached version when appropriate) + $isNetworkIsolated = -not [string]::IsNullOrWhiteSpace($global:BootstrapProfileContainerRegistryServer) -and -not $global:NetworkIsolatedClusterTestMode + if (-not $isNetworkIsolated) { + Write-Log "Requested CSEScriptsPackageUrl is $global:CSEScriptsPackageUrl" + if ($global:CSEScriptsPackageUrl.EndsWith("/")) { + if (-not $scriptsZip) { + Write-Log "Could not find windows cse package on VHD. Use remote version instead." + $WindowsCSEScriptsPackage = "aks-windows-cse-scripts-v0.0.52.zip" + } + Write-Log "WindowsCSEScriptsPackage is $WindowsCSEScriptsPackage" + $global:CSEScriptsPackageUrl = $global:CSEScriptsPackageUrl + $WindowsCSEScriptsPackage } - Write-Log "WindowsCSEScriptsPackage is $WindowsCSEScriptsPackage" - $global:CSEScriptsPackageUrl = $global:CSEScriptsPackageUrl + $WindowsCSEScriptsPackage + Write-Log "CSEScriptsPackageUrl used for provision is $global:CSEScriptsPackageUrl" + + # Download CSE function scripts + $downloadedFile = 'c:\csescripts.zip' + Logs-To-Event -TaskName "AKS.WindowsCSE.DownloadAndExpandCSEScriptPackageUrl" -TaskMessage "Start to get CSE scripts. CSEScriptsPackageUrl: $global:CSEScriptsPackageUrl" + DownloadFileOverHttp -Url $global:CSEScriptsPackageUrl -DestinationPath $downloadedFile -ExitCode $global:WINDOWS_CSE_ERROR_DOWNLOAD_CSE_PACKAGE + $scriptsZip = $downloadedFile + $shouldCleanup = $true + } else { + Write-Log "Network isolated cluster detected (BootstrapProfileContainerRegistryServer is set), skip CSE scripts download and use cached scripts" + if (-not $scriptsZip) { + Set-ExitCode -ExitCode $global:WINDOWS_CSE_ERROR_NETWORK_ISOLATED_CLUSTER_CSE_NOT_CACHED -ErrorMessage "Cached CSE scripts package '$WindowsCSEScriptsPackage' not found under cache directory '$global:CacheDir'" + } + } + + # Step 3: Extract scripts from the resolved zip + Write-Log "Extracting CSE scripts from $scriptsZip" + AKS-Expand-Archive -Path $scriptsZip -DestinationPath "C:\\AzureData\\windows" + if ($shouldCleanup) { + Remove-Item -Path $scriptsZip -Force } - Write-Log "CSEScriptsPackageUrl used for provision is $global:CSEScriptsPackageUrl" - - # Download CSE function scripts - Logs-To-Event -TaskName "AKS.WindowsCSE.DownloadAndExpandCSEScriptPackageUrl" -TaskMessage "Start to get CSE scripts. CSEScriptsPackageUrl: $global:CSEScriptsPackageUrl" - $tempfile = 'c:\csescripts.zip' - DownloadFileOverHttp -Url $global:CSEScriptsPackageUrl -DestinationPath $tempfile -ExitCode $global:WINDOWS_CSE_ERROR_DOWNLOAD_CSE_PACKAGE - AKS-Expand-Archive -Path $tempfile -DestinationPath "C:\\AzureData\\windows" - Remove-Item -Path $tempfile -Force } else { Write-Log "CSE scripts already exist, skipping download" } diff --git a/pkg/agent/testdata/AKSWindows2019+K8S118/CustomData b/pkg/agent/testdata/AKSWindows2019+K8S118/CustomData index 583445e77d3..25bbfcb5d7b 100644 --- a/pkg/agent/testdata/AKSWindows2019+K8S118/CustomData +++ b/pkg/agent/testdata/AKSWindows2019+K8S118/CustomData @@ -188,7 +188,7 @@ $global:AKSAADServerAppID = "6dae42f8-4368-4678-94ff-3960e28e3630" $global:IsDisableWindowsOutboundNat = [System.Convert]::ToBoolean("false"); # Base64 representation of ZIP archive -$zippedFiles = "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" +$zippedFiles = "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" $global:KubeClusterConfigPath = "c:\k\kubeclusterconfig.json" $fipsEnabled = [System.Convert]::ToBoolean("false") @@ -217,6 +217,7 @@ $global:WindowsCiliumInstallPath = Join-Path -Path $global:WindowsCiliumNetworki # Network isolated cluster $global:BootstrapProfileContainerRegistryServer="" $global:MCRRepositoryBase="mcr.microsoft.com/" +$global:NetworkIsolatedClusterTestMode = [System.Convert]::ToBoolean("false"); # for ab e2e only for local ab test with remote cse package $global:OrasCacheDir="c:\aks-tools\oras\" # refer to components.json $global:OrasPath="c:\aks-tools\oras\oras.exe" @@ -240,36 +241,58 @@ try { $global:OperationId = New-Guid if (-not (Test-Path "C:\AzureData\windows\azurecnifunc.ps1")) { - # Determine the CSE package URL - $WindowsCSEScriptsPackage = "aks-windows-cse-scripts-current.zip" # CSEScriptsPackage is cached on VHD. Previously the cse package version was managed in components.json, whereas RP set the package URL which is a storage account. - # From 2025-06 The CSE packages is eleased on the VHD. RP can use fully qualified URL to download CSE scripts package when required out of VHD release cycle. + # From 2025-06 The CSE packages is released on the VHD. RP can use fully qualified URL to download CSE scripts package when required out of VHD release cycle. # In the transition period, it is important that when deal with older VHD versions, the agentbaker runtime provision script needs to be compatible with the latest known storage account package, 0.0.52. - Write-Log "Requested CSEScriptsPackageUrl is $global:CSEScriptsPackageUrl" - if ($global:CSEScriptsPackageUrl.EndsWith("/")) { - $search = @() - if ($global:CacheDir -and (Test-Path $global:CacheDir)) { - $search = [IO.Directory]::GetFiles($global:CacheDir, $WindowsCSEScriptsPackage, [IO.SearchOption]::AllDirectories) - # list files in the cache directory. - Write-Log "the directory $global:CacheDir contains the following files:" - Get-ChildItem -Path $global:CacheDir | ForEach-Object { Write-Log " $_" } + + $WindowsCSEScriptsPackage = "aks-windows-cse-scripts-current.zip" + $scriptsZip = $null + $shouldCleanup = $false + + # Step 1: Try to find cached scripts on VHD + if ($global:CacheDir -and (Test-Path $global:CacheDir)) { + $searchCachedScripts = [IO.Directory]::GetFiles($global:CacheDir, $WindowsCSEScriptsPackage, [IO.SearchOption]::AllDirectories) + Write-Log "the directory $global:CacheDir contains the following files:" + Get-ChildItem -Path $global:CacheDir | ForEach-Object { Write-Log " $_" } + if ($searchCachedScripts.Count -gt 0) { + $scriptsZip = $searchCachedScripts[0] + Write-Log "Found cached CSE scripts at $scriptsZip" } + } - if ($search.Count -eq 0) { - Write-Log "Could not find windows cse package on VHD. Use remote version instead." - $WindowsCSEScriptsPackage = "aks-windows-cse-scripts-v0.0.52.zip" + # Step 2: For non-network-isolated clusters, download scripts if needed (overrides cached version when appropriate) + $isNetworkIsolated = -not [string]::IsNullOrWhiteSpace($global:BootstrapProfileContainerRegistryServer) -and -not $global:NetworkIsolatedClusterTestMode + if (-not $isNetworkIsolated) { + Write-Log "Requested CSEScriptsPackageUrl is $global:CSEScriptsPackageUrl" + if ($global:CSEScriptsPackageUrl.EndsWith("/")) { + if (-not $scriptsZip) { + Write-Log "Could not find windows cse package on VHD. Use remote version instead." + $WindowsCSEScriptsPackage = "aks-windows-cse-scripts-v0.0.52.zip" + } + Write-Log "WindowsCSEScriptsPackage is $WindowsCSEScriptsPackage" + $global:CSEScriptsPackageUrl = $global:CSEScriptsPackageUrl + $WindowsCSEScriptsPackage } - Write-Log "WindowsCSEScriptsPackage is $WindowsCSEScriptsPackage" - $global:CSEScriptsPackageUrl = $global:CSEScriptsPackageUrl + $WindowsCSEScriptsPackage + Write-Log "CSEScriptsPackageUrl used for provision is $global:CSEScriptsPackageUrl" + + # Download CSE function scripts + $downloadedFile = 'c:\csescripts.zip' + Logs-To-Event -TaskName "AKS.WindowsCSE.DownloadAndExpandCSEScriptPackageUrl" -TaskMessage "Start to get CSE scripts. CSEScriptsPackageUrl: $global:CSEScriptsPackageUrl" + DownloadFileOverHttp -Url $global:CSEScriptsPackageUrl -DestinationPath $downloadedFile -ExitCode $global:WINDOWS_CSE_ERROR_DOWNLOAD_CSE_PACKAGE + $scriptsZip = $downloadedFile + $shouldCleanup = $true + } else { + Write-Log "Network isolated cluster detected (BootstrapProfileContainerRegistryServer is set), skip CSE scripts download and use cached scripts" + if (-not $scriptsZip) { + Set-ExitCode -ExitCode $global:WINDOWS_CSE_ERROR_NETWORK_ISOLATED_CLUSTER_CSE_NOT_CACHED -ErrorMessage "Cached CSE scripts package '$WindowsCSEScriptsPackage' not found under cache directory '$global:CacheDir'" + } + } + + # Step 3: Extract scripts from the resolved zip + Write-Log "Extracting CSE scripts from $scriptsZip" + AKS-Expand-Archive -Path $scriptsZip -DestinationPath "C:\\AzureData\\windows" + if ($shouldCleanup) { + Remove-Item -Path $scriptsZip -Force } - Write-Log "CSEScriptsPackageUrl used for provision is $global:CSEScriptsPackageUrl" - - # Download CSE function scripts - Logs-To-Event -TaskName "AKS.WindowsCSE.DownloadAndExpandCSEScriptPackageUrl" -TaskMessage "Start to get CSE scripts. CSEScriptsPackageUrl: $global:CSEScriptsPackageUrl" - $tempfile = 'c:\csescripts.zip' - DownloadFileOverHttp -Url $global:CSEScriptsPackageUrl -DestinationPath $tempfile -ExitCode $global:WINDOWS_CSE_ERROR_DOWNLOAD_CSE_PACKAGE - AKS-Expand-Archive -Path $tempfile -DestinationPath "C:\\AzureData\\windows" - Remove-Item -Path $tempfile -Force } else { Write-Log "CSE scripts already exist, skipping download" } diff --git a/pkg/agent/testdata/AKSWindows2019+K8S119+CSI/CustomData b/pkg/agent/testdata/AKSWindows2019+K8S119+CSI/CustomData index 4e5ea457a6d..2479f33d4db 100644 --- a/pkg/agent/testdata/AKSWindows2019+K8S119+CSI/CustomData +++ b/pkg/agent/testdata/AKSWindows2019+K8S119+CSI/CustomData @@ -188,7 +188,7 @@ $global:AKSAADServerAppID = "6dae42f8-4368-4678-94ff-3960e28e3630" $global:IsDisableWindowsOutboundNat = [System.Convert]::ToBoolean("false"); # Base64 representation of ZIP archive -$zippedFiles = "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" +$zippedFiles = "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" $global:KubeClusterConfigPath = "c:\k\kubeclusterconfig.json" $fipsEnabled = [System.Convert]::ToBoolean("false") @@ -217,6 +217,7 @@ $global:WindowsCiliumInstallPath = Join-Path -Path $global:WindowsCiliumNetworki # Network isolated cluster $global:BootstrapProfileContainerRegistryServer="" $global:MCRRepositoryBase="mcr.microsoft.com/" +$global:NetworkIsolatedClusterTestMode = [System.Convert]::ToBoolean("false"); # for ab e2e only for local ab test with remote cse package $global:OrasCacheDir="c:\aks-tools\oras\" # refer to components.json $global:OrasPath="c:\aks-tools\oras\oras.exe" @@ -240,36 +241,58 @@ try { $global:OperationId = New-Guid if (-not (Test-Path "C:\AzureData\windows\azurecnifunc.ps1")) { - # Determine the CSE package URL - $WindowsCSEScriptsPackage = "aks-windows-cse-scripts-current.zip" # CSEScriptsPackage is cached on VHD. Previously the cse package version was managed in components.json, whereas RP set the package URL which is a storage account. - # From 2025-06 The CSE packages is eleased on the VHD. RP can use fully qualified URL to download CSE scripts package when required out of VHD release cycle. + # From 2025-06 The CSE packages is released on the VHD. RP can use fully qualified URL to download CSE scripts package when required out of VHD release cycle. # In the transition period, it is important that when deal with older VHD versions, the agentbaker runtime provision script needs to be compatible with the latest known storage account package, 0.0.52. - Write-Log "Requested CSEScriptsPackageUrl is $global:CSEScriptsPackageUrl" - if ($global:CSEScriptsPackageUrl.EndsWith("/")) { - $search = @() - if ($global:CacheDir -and (Test-Path $global:CacheDir)) { - $search = [IO.Directory]::GetFiles($global:CacheDir, $WindowsCSEScriptsPackage, [IO.SearchOption]::AllDirectories) - # list files in the cache directory. - Write-Log "the directory $global:CacheDir contains the following files:" - Get-ChildItem -Path $global:CacheDir | ForEach-Object { Write-Log " $_" } + + $WindowsCSEScriptsPackage = "aks-windows-cse-scripts-current.zip" + $scriptsZip = $null + $shouldCleanup = $false + + # Step 1: Try to find cached scripts on VHD + if ($global:CacheDir -and (Test-Path $global:CacheDir)) { + $searchCachedScripts = [IO.Directory]::GetFiles($global:CacheDir, $WindowsCSEScriptsPackage, [IO.SearchOption]::AllDirectories) + Write-Log "the directory $global:CacheDir contains the following files:" + Get-ChildItem -Path $global:CacheDir | ForEach-Object { Write-Log " $_" } + if ($searchCachedScripts.Count -gt 0) { + $scriptsZip = $searchCachedScripts[0] + Write-Log "Found cached CSE scripts at $scriptsZip" } + } - if ($search.Count -eq 0) { - Write-Log "Could not find windows cse package on VHD. Use remote version instead." - $WindowsCSEScriptsPackage = "aks-windows-cse-scripts-v0.0.52.zip" + # Step 2: For non-network-isolated clusters, download scripts if needed (overrides cached version when appropriate) + $isNetworkIsolated = -not [string]::IsNullOrWhiteSpace($global:BootstrapProfileContainerRegistryServer) -and -not $global:NetworkIsolatedClusterTestMode + if (-not $isNetworkIsolated) { + Write-Log "Requested CSEScriptsPackageUrl is $global:CSEScriptsPackageUrl" + if ($global:CSEScriptsPackageUrl.EndsWith("/")) { + if (-not $scriptsZip) { + Write-Log "Could not find windows cse package on VHD. Use remote version instead." + $WindowsCSEScriptsPackage = "aks-windows-cse-scripts-v0.0.52.zip" + } + Write-Log "WindowsCSEScriptsPackage is $WindowsCSEScriptsPackage" + $global:CSEScriptsPackageUrl = $global:CSEScriptsPackageUrl + $WindowsCSEScriptsPackage } - Write-Log "WindowsCSEScriptsPackage is $WindowsCSEScriptsPackage" - $global:CSEScriptsPackageUrl = $global:CSEScriptsPackageUrl + $WindowsCSEScriptsPackage + Write-Log "CSEScriptsPackageUrl used for provision is $global:CSEScriptsPackageUrl" + + # Download CSE function scripts + $downloadedFile = 'c:\csescripts.zip' + Logs-To-Event -TaskName "AKS.WindowsCSE.DownloadAndExpandCSEScriptPackageUrl" -TaskMessage "Start to get CSE scripts. CSEScriptsPackageUrl: $global:CSEScriptsPackageUrl" + DownloadFileOverHttp -Url $global:CSEScriptsPackageUrl -DestinationPath $downloadedFile -ExitCode $global:WINDOWS_CSE_ERROR_DOWNLOAD_CSE_PACKAGE + $scriptsZip = $downloadedFile + $shouldCleanup = $true + } else { + Write-Log "Network isolated cluster detected (BootstrapProfileContainerRegistryServer is set), skip CSE scripts download and use cached scripts" + if (-not $scriptsZip) { + Set-ExitCode -ExitCode $global:WINDOWS_CSE_ERROR_NETWORK_ISOLATED_CLUSTER_CSE_NOT_CACHED -ErrorMessage "Cached CSE scripts package '$WindowsCSEScriptsPackage' not found under cache directory '$global:CacheDir'" + } + } + + # Step 3: Extract scripts from the resolved zip + Write-Log "Extracting CSE scripts from $scriptsZip" + AKS-Expand-Archive -Path $scriptsZip -DestinationPath "C:\\AzureData\\windows" + if ($shouldCleanup) { + Remove-Item -Path $scriptsZip -Force } - Write-Log "CSEScriptsPackageUrl used for provision is $global:CSEScriptsPackageUrl" - - # Download CSE function scripts - Logs-To-Event -TaskName "AKS.WindowsCSE.DownloadAndExpandCSEScriptPackageUrl" -TaskMessage "Start to get CSE scripts. CSEScriptsPackageUrl: $global:CSEScriptsPackageUrl" - $tempfile = 'c:\csescripts.zip' - DownloadFileOverHttp -Url $global:CSEScriptsPackageUrl -DestinationPath $tempfile -ExitCode $global:WINDOWS_CSE_ERROR_DOWNLOAD_CSE_PACKAGE - AKS-Expand-Archive -Path $tempfile -DestinationPath "C:\\AzureData\\windows" - Remove-Item -Path $tempfile -Force } else { Write-Log "CSE scripts already exist, skipping download" } diff --git a/pkg/agent/testdata/AKSWindows2019+K8S119+FIPS/CustomData b/pkg/agent/testdata/AKSWindows2019+K8S119+FIPS/CustomData index c4171a5033c..b271cbfdf86 100644 --- a/pkg/agent/testdata/AKSWindows2019+K8S119+FIPS/CustomData +++ b/pkg/agent/testdata/AKSWindows2019+K8S119+FIPS/CustomData @@ -188,7 +188,7 @@ $global:AKSAADServerAppID = "6dae42f8-4368-4678-94ff-3960e28e3630" $global:IsDisableWindowsOutboundNat = [System.Convert]::ToBoolean("false"); # Base64 representation of ZIP archive -$zippedFiles = "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" +$zippedFiles = "UEsDBBQACAAIAAAAAAAAAAAAAAAAAAAAAAAcAAAAd2luZG93cy93aW5kb3dzY3NlaGVscGVyLnBzMdR97XLbOLLofz0Frqx7Yu9Eiu3EScZTPHcZiXY4liVdkrKTiVNamIIknFCEFgDteJK8+yl8kAQpkpazsz82NZXYZH+h0Wh0NxqcPRCsMAMspHjDAWYgYWgOOAFztMAxAreQ4RAkHEdgkcQhxyRmrT3gSthbxDmiBnQGAnAM+Appugwk8RxRwDhc4nj5ImToxT2O5+Se9VqtPTBQ2DCKAPqKOQjJHEkS1woI9H1HMV0njIM15OEK/OOT3f1j9vmXf7Q6y4jcwuj02h0Nxtf+rO87M3/a7zu+bx1WvnU8b+zNpqOL0fh6ZB2BPXBGKEhi9HWDQo7mAFFKKAhhslxxcPsgxxJKtrcRCb8I2b4kt4jGiCOmh8IQTza9DTtqYDkYX4+GY3swO3OHzuzaDd7PPCfwPlrHDUju6Gp84cycD05/Gtjvho71sgFaUh6Ng5nzwfUD61UDaP+907+Y2RN35jvelePN+uPRyOkH7pUbfLROGjAn9tR3Zu6lfW7yet2Ace4EM3/6buQEs4nnnLkfrDeN0CPHswNnFowvnNHsbOzNbO/SetuAMnKC67F3MXNHgeOd2X3HNyT7dQdEe2BPAsczsI6arOfSHtnnzqUzCmbuxERqmv++PXT7Y6lut+/M7H5/PB0FJnaTIfTHo8B2R443kBjuyA/s4dAZWEdNBlHC8qajkTs6t46aLGM8cUa+/77MpskkUpQz13Ou7eFQ4vbHozP3fOoJ5CbrcEdX9tAdzCa2Z186Yhbc0cz+Y+o5moR11GQuo/FsMO5fON4sGM/eTd3hQFtoNnbrqMl2hHH27Vnf8QL3zO3bgeNbR002k63jMtZxk8k4l5Pg4zZKk8E4I7HgZ77TF7oIhr513GQh55e+PXM+TOzRYGZ7/ffulWMdNxmHQlBMJuNrx/PfO8PhbOK5V+7QOXes4yYzkdi+E8w859z1A+/jbOJ4l67vu+ORddxkLduYV/ZwKrTR6EQElns5GXvBrN8/d66cUeBbx42epIhiX1xNJsPpuTtKkRt9yjiYnY2no0FxtVvHjf4kQ1KWOJpevnM862WTZeQ4E2985Qr9uaPzmd/33EngWy+bTMQPbE+4kIEz8xyhUoU1C2z/wnrZZC25FfvObGL3L+xzx3rZZC4ZxsX0neONnMDxc8QmS8lZjdwco8lCMoz3I392OR5Mxb7XZBzGmpRONuPSZB4ZkrSTDKXJKAytuWK6PnzM8XbzGblDThFfNRmHmNOgP5kNPo7sS7c/k7bs2SOB12QYyvy0Yyz7w1dNhjGZCh+Q7/HWqyajUHwC+7yI0hh55Cp4545s72MarTRZRKoH50N/OB04BT00GYbAmw6q9ddkGyleFb9mrzHrT/1gfDkb2IEtBmi9+hXsAQ/xhIq4GLM0wCRzJGLJkKFwPRexI7hfoRj0T2/sPxOKBpDDm37COFmLH3u3OAZzghiICRehMuOPiOFLnzAdBrPh+Nw6OfwXpPAdD7Ek4r2ILHcXoj+efBS8Z/3xcChCy/Eo82onTcbrOb77hzMb+7OBJ3axk8ZtbzJVYF4ardiS05ntirjlpHEHrMEN3EtnPA2sk8YNsAb56nImxRd+3Z9OhOUIORp3xBpSU0+FUr4TWCeNm+NkOvMvpjN3dDbONxTrpHF3rGGa5ym2O5x6jnXSGD6ZVFQg57vnIzuQmE0+sY6/86HvTMRP1usmz/iYzpwPjvW6ycqmk4EdiJ1W7Gez/nDqByoNEiHn60aTc/Se606uXouY4HWjkTmB6fOuHE+GSK+bbEuPaNb3nIEzClx7qIKDgeMBC7w+AXt5tgwWhAIcMw6jCMdLEFI0RzHHMAIbSu7wHNGddibBalDkZb1+vcVpTu7jiMB5DSuwgDhKKGryC9uDytT+ZotfuELhlzpmIYkXeLkDT3vw+9QPZhP73JFJslih1usmwx6OxxfTiZqJUd9R/jywz63Xv27JGBEiRUw2ICZztCEkenF1CThcMnCHIXAvB/4uc5CH+rN343HgB549mfWHrjMKrDeHjVPBUJhQBIKhD24J4YxTuAFhhFHMd1BPam+NAhw1Wd2/xj974g7d6WWalovFmUqm3fmbpnXpfAg8ux/M/nAn1pumJSmVfekEtphU603TSpzYnu8YsI1psGf7hvd9s714xLa5wLGcMUJhVivLik8byFfPwf0KhyuAGYBgQxFF/0www1yR2CRK4RsYfoFLxMCCkjWgaIkZpw+KC+L3hH4BmJEICqphlDDe6Aak6MJMs73vzfZS5HiNSMLBPcRciCCeCRxAEduQmDXNsGQgY8u05pIxervFSMUm6UilomRUEpEljndiMh3Z0+D92HP/EEazvWKLHCDleAFDDu4xXyl+Ra3K5zDhK0Lxn5BjEgPMWLLbgPW7P9yJtGLr7fZKLorzJblFEeLy35BHj4q3kxQVXtd6u72ki5JU+dy/RJrJeCCCFc820pK3x49Is4EJQwCv4RL9BPOsSOiPh3bgDPIt31fBWt/uv3cG1tuX23sQQ4AsateVXNYhDFdo3toD25wv7Q+z/njgiBVN4uhBFdpxDJIYc8AR4wxwAu4QxYsHYel8JYiiezNIj+EaSZcwnyvkdKSOgOmTORrBNWKtPTCJEGRIMFG164RS4YXvYJTIYTQICJlEyUDFLyU5YCy4hxStBVEsS+RNYVZK23r7qpULB+fzMuHyjiZeZ04Ox8CbKDhOSKt67MACf99vAQBA25RDnwe0n2+/0pGgOgyoB6gr3ddjbNXt60GLRft6uMaKfT1aZbm+HnyrVt8EWlWor4dvqtI/jrVVoq9HqSnPN6j2kdJ8A2ZNWX5nDF2Sr4evLMc/Dl5Tim+02OYyfMMUPVqCb7a3UlV8h3W4M0Zl2b0BvFxybxB8u9z+GHB9qf0RzJoy+1OwVIn9EYxyeX1n8HJpvclWKsvquyCYJfVd4KvK6fV4TaX0XSwyL6PvAL1dQt8BySif7wCdl853AC6WzXdAMEvmO4Bvlct3wdkqlTdMXm2ZvB6nqURej1Uujz9Gv1Qa32lfMMvij495u0TdjFNdDn8c5yl8tsvgzbCFWnWTjmoryvVIpWpyg09rrCQ/HU8nuE9HrKwgP52MUT1uRt6uHD+dWblqvCOFUsV4R6yqavHTUY1KcT1yU5W4gWWpQtwMuV0drodvqAzv4lMrirwNy622UFuPU1VorYeuK7LuMJSGUuXj2vsp5OzJI0XKegpGgbJJJ0ZxsmEjKhQm6+GKRclH4MwK4COgVbW8XVDMytwu8PpdWj3bBeVJa6OxJlWPtmM1qd06aLX2QLBCaS0DzMka4hhwAm5lkWaeVTMmCmKgiyBn/5zHwAKdOImilAZFC0SpLBQramf/fzDKCaSvqym103JKD35hPfhnQlEvJOt2aw+cwSi6heEXSQ/ghcEphHFMuBA2JDGHITckTtFq+MGQddeYUkIVNzRfol6MeFvoZDQOnFNwkbVSXiHKMDEOuSU7HIP2XTtjeIljvIbRFtY15qsh5IjxvsJCdC4kOOodv+0dtsEeuMZRBMIVjJcIYC7UL4tjhFIUcnCnmcsy8z0CLNlsCOWyCJV2ooY5ZQ2uZ2UthErWRltoRo8TWYczUI97X39qNMdqOC9f9g7FhNkRX5FkudKjiDmGknxqFwmNAGaAIQ5wDOwLP6ufxeT+uRwiFxqJker5TTZzyFXBcEGiiNzjeAnuIMXwNkJMFufsJYr5O/gF0UwlzrGj6pdmL++2ngBH600EeV4vz8elTSfQEGKUd98Of3SVeR69uMUxpBixFznZrgnQ1S24Xbiev37V45D2ln9KA0sNKk7Wt4jq0ms3K76KwZGEgU0EQ8QyyXwuRpzLl1KR2n/de3mSG2N5igqgb3rHh/Wgxwbsce+w96rdymuoakAa4vjw+ERCHR6fyGGdJVGUTfMG8hUDkCKwRDGisiqdMDF3nxinOF5+Pj09I3QN+f6jqn8OOnq+DtQ6ELaB5rlgzh2KORuS5RLHywGmQqz+6Y2WV/aL3AzJkt1MomSJY3ZziUNKGFnwXp+sNwlHPdXQ4svWcOcrR7Fgd6MI3+TqCiD7MoJraQ3FpwFeI5/D9Ua9aukm9gWOOKKAojW5E+4jUYudCndFGdi/OTzQp2pCVyHc8IQqM4gZW/fQVwRIwjcJzw6almJdrKhcYxtyjyhboShqaUaeZDRKooiBb6AzA12KpCGBZzeHz56DZ8/Aj1YKLGRmUuZvoN3ZP0e8OxCm3lUzA8jBKejM2hJDd9GDa4o56g7Jcr+zRozBJToA3+Rm1FmzpdgW9GPwPacv3yvM94RxCdoyqWYOGkdofIfoe843muwEUrhW1XPx55P8HXFE9y9hPIec0AfBldMEHXxOjSsD70xp9PynkQeIcRzLc7UJ5KudCeGYG1Scr5j3yRzJJwct+c8eOMOUcdVFIPwcQ0hsb1BYjD5FkpcVhLFlRywRRXD+oI90AFFntFfvB0r/YYRgPKWREGRKo56/iTDff/b/nh18OlTidARxbb+f3HFPDOrz6ek54mf6xX5GRQvaYQjScCWPMA7kE7wA+ZoVkogV14XxHOwHiPGuIArKAAeplRRpCiEGWOx0hD7kkrAtBs9z2Z9LLF+SGG/E3Hw+PbWjKKWDEVOC/mjl8iqOvT5JYg66MQKHpkCZUYP2VDopreF0myALQ3Vd0CebB3nOLKZKHvN1Ug6fDj8fiOksm0474yWQuy5Ha6A1lSGCroG0RUGuyhDpkYm/UcRQUathQtGEEk5CEjFjyuRrHFcBfPIfGEfr3gjxni/eY/6QQgQPG/T59FRBDNACJhF/DnbBYNFLbT/iz4JQBMMV2O9sNJxwcCkdJ07WauqvYJQg9rhIBWMC6RRvj68bE653ZwYy3mXkSt39YuUIBegfre2figLTOxyiCcExv4QxXCIqFFIahliiJZa5ujqXcLNBc7WSpzL+6b6DDIkHXTfGHMNI/CwWeaUJS5Q5mHpDCQO6/23S5CQ7zjSsutJmc5FINJ9QsqSIMRXMozgUXqSz/TRHqsR45uMIxTx6EPs9jhP0zGCTCiZ2DrGNp5odYLiMCeM4ZD2fk8095KHwXD6HlI/QvWHnnD6UJrgD6VIa+7cpxVauid/AJeIrMrfa54i3fwPjRDofq6yH34A8zrXlVmW1Bf/2jwIHD3H60O2T9Vq4weyHthvfkS+o6yHGFas26NpCGCVSV+BhxMCJ+vFhgCL44KOQxHMGjg5zU9MXvYrj8hHvpnsLyH/qGM+E3Jd6P26fQRyp2MI8zs710VPjlHt+hZUXJ0dOg+leUAQ3DM0vhaZLoI5+haMIMzW6fM7N7cTebNyY4eWKs75q0RKuWiaa5VXbQSI2AxYYofvu+PZ/RLLUzuM6e7OJcCinMKXYG0AOhdGJ4Iv1ZGwXoAithebbFcR7aaQnrCKNUCoBJ5RsEOUYsU/tdCdtfxaKSNdXFdalmP2QfWoPEiolvWQKKVNlEatOSb2AwvCLHM++In1gTN8jy7F6Zbeq/EqqAjRXO1/Rp2ztVzg2jWLNcs2JQFPugNt7nLHSQOogwHegAtLuEDMOvouF2vVlrAa+5wK21HjNsNJcIa2dw0mrOYxrjgKt2mDSXIzyqZolQ8E+4iBbvEKl2S/Cm6CvmOdL1KSmNJtlQxrJKgaeeyK3Fjn/97SbhqENpEJo8QCCe0K/QEqSeA4YFsbRBoSCZ2BOZNVDdhhBZrQEIirJcDmHS1YUwhDP2i9Ia6Yk30VK8n/f9J8pXcjuplxscyonhPENiZUzhZTrxI3qaRXpXTcgXbkKQDfL09r2hd/TiWDfd3opmRKVtkLJXKXcV8QUhBSJjAjGQPDmWOyUkMmInSoSKga/1HMAlbTKLfkiiEwiNBe0tVF3na8oTDgC7Tx5E2me2hkS2bzUzreQf7S1pN1UVB0H/qOtOW4ojkO8gVEV00n2sjtliLpz4H/0A+cSCIMjsYimgI5Y7DBUwbGXxEN0hyLwHi9XiHFtPZzi5VJOOWZKByTd7DvpOyXB7+Q20A+6NgcgSywPevZ8rre3/aOTA+GRkdgiQHec0ZLXtnGdFkFX6zHVdDcfoqGKbipAJpqIrWV2L5BSpYIwVSpciL9lL6GI+IVrMefVk218iJaFye1MW0M3zC3KjTcJ11uTMazyqu9LE5vvZGPmilB43Sx9+gkHt+WjzpIoejzTtToLGLHqjDmVZioXkgXaqv4TgU1CN4RpX3WQp2bdEeGFzDGV4aAmQ1PjBvOUU44hq4ElEfJdR9iSyrvE39L0M1BQ4g3+W5e3gYy+SpmWuSfuJoW6k6S3QLlH7YEV5xt2+uIF4zD8Qu4QXUTkvheS9Qv44uWrk5NfT05evXj965uj49f5pItBBGi9IRTSh5y5rsBsIFVBURo3F3J8gSd+01FbOnmgE+uKgEY6T/D88+npCN2LnzT0Dtrb/53gWCtSSyJJHxTM1r7wu87XDYznXZuGK3yHfqrQcwUjLNKcEeGjJIrG1Flv+MN+bpOdx+34SeSeXAtK10g96VtCIgTjz508s1cLo5jDlLSlNazipXIA1flWevKjGFOJqN2sJJTM2U/CEDG2SKLoQez0MM6jPUm/trSxnaIYZHXmwYmmaVLsVmUdWYRYHRAqzCeEhaAhXartEDZORcup1DSGtxFSA5L5BPgTb+SotpKoYkRazBT/LYafO2PN5nFTfZT0CrKVPH8wqItE9i8gXQyydUb8b6FbSK/NbUg47P0OBhY4/A38Bsx9Z7uasAcGKiCOyBLIZF5Fy/LHNXzIjgcZihnmYsXOIYcFGsbSkIKBDganoBOq+SqmmFTdjf2vbDrB3wWrDCZP0KtqBB38yy+FB6pUBrpLlCm7qiDGV5Tcg86s8KJY9JAxctePENrU6TdHKq4CXRdRobBcSTuvhIb8KqP2WPRSoPDpc9GmhTPZkcCj+SGOeZF8FJF7NE8hVQX28KCIsb0ahGE2whQLRxY4qrVuMfVRPvW/SQOpCbQELPCSWEbDhnozNYFer5cb639VwmSvpeENbT9wPriBvNTRjQnH8bZWyvZoimRwUAsDzUESM3Pbkmcn+T2ZAs92rQV3U+01mLL4E+o9qGL9laJEsIPopuBVy35rFcl/nlr4c76uYMJEjkG1QckQtWK2ihmGzRiivHuGI+TI+HX3Zdp0qiboibhwZyf/+HFadSKh+RQSiafqLqNS+r5A1eYuohZda3iX4Gg+kgf8mrn24/tpaKNrhg+g/f5ieHl644/Pgmvbc/LD6fQAG4yCm766LKXP3tsHPf1A8qkTIj3L19nBrSGTVSOshGT3mMvjGgPD1GH76M2b1y/b4Fs6qPbR28Nf28ZSaB8fvnz11oSIOAuPD4+Pi1AnL38tQB2/fF+A+NaZya1KQv7aVseM4lmEQPvl4ctf37R/5OgNjQo5SX2OtWMtvf7WXmX7f03JnRN5u1am8botBEjd6h6Q08LklIvvtUY2gQlD/3mTXAX1tImupvGfPrOuurXezRth5LHfvDuOu3krVteccMMTP8ELd3IOWXvEk9BH7jscDzD9KdQ+iRc/hSt08NOIhT62lt449sQCKVxGTV2uPvl/rsqd4r+YI4rXOti/R7JfZ6MPTvAdih7S3jzZP2D21R3K7RZGUZl6T9+9v1ctYBwxLpxVC4DOfdGDWxVuvVUIL7TxAKPNUAZCxlR7w9Py1G+3OZ5WqOs5KHI+Lcsn7HrXCrwWNJdD2vg43uJaW5PH5aEOwK2gAUhc0erYA4Uhn4LtfrNaTWhI8eqdbvcrqwTU60QaWDW7tAVSNo94k1xEXYzvbbITxR6h4QoxLk9qJpTIIkMubF9+aSRTsDnbkr8Ig2EMbpH8rQsgEMEmmHrDHkC9Ze85AO20Elndhms0OKZfSH1xd9g77L16Xd0Eqd7V9D9qKWKA4vmG4JifajF+Qgqt4muk1o9QqLHw0lbEBttQTXXVM4REMiCXUPtFGzBidN+eqpkFRz2gwzBwi1bwDhOqWrmUT0kVraGPe2IvKruHVErZeb1cRvqLFojxtGIOCAUrwhf4qxhuJyy3dVqPdIju5ico+mcimE69IWhyE6nqGv2EAVRcFD05ZTIVLHDoOfGcXWO+2m+/aGfx+l7mH+/1FG8ousPovsq/pqy1B9VcSn60i/7ZECUWetTq9VzXM6u2dJkGCt77n7QWPm9r6kA2nkKKAmKA/UT39YGMmg5/UvKC4K0Ssu7CBdbPtexuSXFQEXuIHbv44JcKEVqmWrf2xt3mdA8E48EY7N8iHCG8SmC8PACnujFXf3lO5O94oT+nLF2DNxGemiL1cQhjbZf681VGnZleYQicIyr7qe9u5r/c9NK/VJ+4/LHajdZBFx3rjfCsN9q1Vi0t0FXfpt6WqWA0EgjNZeZspb+ytHG0NKjjf9E2HllIRldRs7X0PNVJsG+K/7xK0oPMxmUNZSeHyEh0h+YlZw2/qEsM/1Yf+S9EU0+ImrYjo8LvQoztlAR0i1NSNrYsNzDSBPlUh/1mCgC6OqTPYvtCPlTUwV9Sekr1uHPpqZLCdhOParuSbRNW240XcilgEsPIWJal/pztNuQCFZluplUmgwlLG8ysT2n7xHixYIh/Pj2d8nBE7nsBmcb4q3hjttzpg9yOTnXEa6ui6b/98PDw0L287M7n4P370/X6lLHeYrFopw3hEWS8eA+i8DhtZgMWONwae/GmhFBAu13QQIl4+d7FNqDBrrMvT8fxGrENjEFXmX4NayeeF1RRaBmvuO7RKYhQd/PDpKhImRXgMtVuwZy0Hs3Va4F9FK5I8eF3sWzvEOUB6f7Osn1VX7sQT4AF/q6oGeWc94Rx2Zd4CtodFN+dpp0qsXiYL4j20JgCCWzOSRVgOgUF4OyhgaCDZXPMp9sr6ker/feqIWlVmA+3VaEQ/4eRWJ8EV6kiu5ciJa6aSlPq8QapobhzE958bECn2d8paB/1jg7NVwWllmzBhHMyL6DmKv/VADIUaGikqEBle2N1f8hUyndZFROeWzZpfEs9U+ke1Y/Ot6LL+dETRFT7in3hg3scRYBTKA8681uF1Rlc2nY412W6/N6pbkavu5XZ2hPZ2+9JjMDRkdjfRZzVA+D3RCRJVGddshUxF+UegXsYy51vBe8QWKQXSSOyxKFIt1QPIietPYBillARBUIu75hWy49V+V/eZZCnJvdI5tYZaS0FieagPxjJ1G8vuwiW7moMcaUHpfTsLmPmU6rurGrK+eVXeb1W/u9H5ByIgG694ekEbMOChbxuJD+StlADXUAcMYA1haZBGN0LMibqahFZQca/ZIPObgoLkj+/S6f3f3ejknbq1B2+nvwsiWuIuTxerDma7WyKc53e8rBKiigf5B7tcJC7B2RpiK7VbGtbFX7vNsJsJcLaGIUc32H+ICa9xuhv0YJQJD8fW2yPlI2J+dloxbWL9OubwEoP/K/RrafrDN0pxXnNp/OtMN4fL3Jf8GKFYMRXf7ZlC+s7yHA4gVTe0pJ7PUm4j0JwUupzKl0yqZZMhmGWOlHPHvZ8DnnC5BFjAU0GMgVUkXoeHx5WNVAY+76T6lwlEwWtF+e519ZtTKO099D8c0sR/FJ4alxGqu7+KA30sPDWFPFriFRr7P0KR8KRygtunDQYTEl0kNFQl0ZrBiKVOOtlwD1Pi1h5LatyoqqwzUkzKZjXtVoFGbAqHNT0wOwBd6HXjDzyfeKyeV7wp6YvNZk0LH/TgRVwikaw1ZoKatsayr7IUAzYjnxrPvlQLbBC3TVl1ZtI/i2INcRbxf5JOTgQm9hpk3htFZYUN1u5tbF7uFGRh/rChf628dQb5rVh+XVRRPECG9+wKDDPd8HSlby/ZN/Lr/UV9gf19YO09mEAydfCjv/PvvE4rfUYH7i4yWOpGxFMfU8N9kZYrH57Iz+3cVDcPq7RM3XEdQtvowcZ+uAYTJLbCIcgjEgyz4DT8/dcXNOmzASwyq7kOizf8Ur5i0DNYPkc3CZyMxNBXfyMZwW5yjkDDyhvQJIsgNUcxHQLTi23t6YPmHTNxZqhNHyCxFTOHtA1rNQ6CyaZHktWW2Sq3Ee1W/eBlQN9b7tgQhH+gvKduS4of/G3or3Ummp+3af+syvPmxa20lZeVn90sLVsdhhuzeHTTwy2RuU7DFUZRsWaKjYSKyuWQQ/QN6w8FBI6t9Qvnw4/H6g7IebLUtf034xmcBOsJyK29P7kgoDvBSQFncUMVhE1e9Ha6j7MXql49bkQvEAm29jdOEY0+/VAFjm+icS3g9vgb+BtFsoYBL7XjexH60frfwMAAP//UEsHCKcx+QkgHgAAVnIAAFBLAwQUAAgACAAAAAAAAAAAAAAAAAAAAAAAFAAAAHdpbmRvd3Mvc2VuZGxvZ3MucHMxrFNPT9tOEL3vp5jfkkMi/ezYQUSF1i00pWCVPxGGSi3lsI0n9or1rrU7dlshvnu1NiFQQOqhe/LMvHkzb2b8ZoMBAITZl5PTeZZmneXfRa2MyB0IUKaA743OFQIZoBKhNI5gaSxYJCuxFQpaKeCgQUefj49M4ULW037Yz2Zn6fw8PT35t8z+nYtr9DS1sKJCQgtmCQK+pnNYSoWgRdURN13B/+FHKRclSAcONa0qHhpHewVquqf1BX1k3FZd4MgUgDqvjdQUso237HJW5QrpvdS51MVwdMW6DoYdw6UjK3Vx1RmDuaCSjRiTSxj+NzxHR4F39YHRCG46mEVqrGa3jA0OjFAZCcI9WzhIYLdH8GOk0uQ84QdI/HXvu7CSJ7wkqnfG43j6KpxuhvFkO4yn40osSqlx/G5hqjopjFDOk64yD1HkaB1Pdm/4z6ByQYvWSaN5widRPAniONiM+C27fdAQJDAYpro11xicoaO+I9h91PEovDcZG/SbfknJvPkLJTubk63J9MEqVimp/igV8qSb5FNZ99t8Rt9WEG0HUXzHtAYtlERNwcJYi0qQNFr6Pl/C+fPiCd/7lM2y/blqCqlfgq7LR2EcRk9hRpOQGq0vuB55OFv5119p/mdyWwk/G2WKIMdamV8VavJEw2eZzozCVDsSeoFH0tEjh8ctZdHYTv6ddeL/o8DVShLwbyEfXUb9efsDeeYi1mv/HQAA//9QSwcIhV/jUSECAABeBAAAUEsBAhQAFAAIAAgAAAAAAKcx+QkgHgAAVnIAABwAAAAAAAAAAAAAAAAAAAAAAHdpbmRvd3Mvd2luZG93c2NzZWhlbHBlci5wczFQSwECFAAUAAgACAAAAAAAhV/jUSECAABeBAAAFAAAAAAAAAAAAAAAAABqHgAAd2luZG93cy9zZW5kbG9ncy5wczFQSwUGAAAAAAIAAgCMAAAAzSAAAAAA" $global:KubeClusterConfigPath = "c:\k\kubeclusterconfig.json" $fipsEnabled = [System.Convert]::ToBoolean("true") @@ -217,6 +217,7 @@ $global:WindowsCiliumInstallPath = Join-Path -Path $global:WindowsCiliumNetworki # Network isolated cluster $global:BootstrapProfileContainerRegistryServer="" $global:MCRRepositoryBase="mcr.microsoft.com/" +$global:NetworkIsolatedClusterTestMode = [System.Convert]::ToBoolean("false"); # for ab e2e only for local ab test with remote cse package $global:OrasCacheDir="c:\aks-tools\oras\" # refer to components.json $global:OrasPath="c:\aks-tools\oras\oras.exe" @@ -240,36 +241,58 @@ try { $global:OperationId = New-Guid if (-not (Test-Path "C:\AzureData\windows\azurecnifunc.ps1")) { - # Determine the CSE package URL - $WindowsCSEScriptsPackage = "aks-windows-cse-scripts-current.zip" # CSEScriptsPackage is cached on VHD. Previously the cse package version was managed in components.json, whereas RP set the package URL which is a storage account. - # From 2025-06 The CSE packages is eleased on the VHD. RP can use fully qualified URL to download CSE scripts package when required out of VHD release cycle. + # From 2025-06 The CSE packages is released on the VHD. RP can use fully qualified URL to download CSE scripts package when required out of VHD release cycle. # In the transition period, it is important that when deal with older VHD versions, the agentbaker runtime provision script needs to be compatible with the latest known storage account package, 0.0.52. - Write-Log "Requested CSEScriptsPackageUrl is $global:CSEScriptsPackageUrl" - if ($global:CSEScriptsPackageUrl.EndsWith("/")) { - $search = @() - if ($global:CacheDir -and (Test-Path $global:CacheDir)) { - $search = [IO.Directory]::GetFiles($global:CacheDir, $WindowsCSEScriptsPackage, [IO.SearchOption]::AllDirectories) - # list files in the cache directory. - Write-Log "the directory $global:CacheDir contains the following files:" - Get-ChildItem -Path $global:CacheDir | ForEach-Object { Write-Log " $_" } + + $WindowsCSEScriptsPackage = "aks-windows-cse-scripts-current.zip" + $scriptsZip = $null + $shouldCleanup = $false + + # Step 1: Try to find cached scripts on VHD + if ($global:CacheDir -and (Test-Path $global:CacheDir)) { + $searchCachedScripts = [IO.Directory]::GetFiles($global:CacheDir, $WindowsCSEScriptsPackage, [IO.SearchOption]::AllDirectories) + Write-Log "the directory $global:CacheDir contains the following files:" + Get-ChildItem -Path $global:CacheDir | ForEach-Object { Write-Log " $_" } + if ($searchCachedScripts.Count -gt 0) { + $scriptsZip = $searchCachedScripts[0] + Write-Log "Found cached CSE scripts at $scriptsZip" } + } - if ($search.Count -eq 0) { - Write-Log "Could not find windows cse package on VHD. Use remote version instead." - $WindowsCSEScriptsPackage = "aks-windows-cse-scripts-v0.0.52.zip" + # Step 2: For non-network-isolated clusters, download scripts if needed (overrides cached version when appropriate) + $isNetworkIsolated = -not [string]::IsNullOrWhiteSpace($global:BootstrapProfileContainerRegistryServer) -and -not $global:NetworkIsolatedClusterTestMode + if (-not $isNetworkIsolated) { + Write-Log "Requested CSEScriptsPackageUrl is $global:CSEScriptsPackageUrl" + if ($global:CSEScriptsPackageUrl.EndsWith("/")) { + if (-not $scriptsZip) { + Write-Log "Could not find windows cse package on VHD. Use remote version instead." + $WindowsCSEScriptsPackage = "aks-windows-cse-scripts-v0.0.52.zip" + } + Write-Log "WindowsCSEScriptsPackage is $WindowsCSEScriptsPackage" + $global:CSEScriptsPackageUrl = $global:CSEScriptsPackageUrl + $WindowsCSEScriptsPackage } - Write-Log "WindowsCSEScriptsPackage is $WindowsCSEScriptsPackage" - $global:CSEScriptsPackageUrl = $global:CSEScriptsPackageUrl + $WindowsCSEScriptsPackage + Write-Log "CSEScriptsPackageUrl used for provision is $global:CSEScriptsPackageUrl" + + # Download CSE function scripts + $downloadedFile = 'c:\csescripts.zip' + Logs-To-Event -TaskName "AKS.WindowsCSE.DownloadAndExpandCSEScriptPackageUrl" -TaskMessage "Start to get CSE scripts. CSEScriptsPackageUrl: $global:CSEScriptsPackageUrl" + DownloadFileOverHttp -Url $global:CSEScriptsPackageUrl -DestinationPath $downloadedFile -ExitCode $global:WINDOWS_CSE_ERROR_DOWNLOAD_CSE_PACKAGE + $scriptsZip = $downloadedFile + $shouldCleanup = $true + } else { + Write-Log "Network isolated cluster detected (BootstrapProfileContainerRegistryServer is set), skip CSE scripts download and use cached scripts" + if (-not $scriptsZip) { + Set-ExitCode -ExitCode $global:WINDOWS_CSE_ERROR_NETWORK_ISOLATED_CLUSTER_CSE_NOT_CACHED -ErrorMessage "Cached CSE scripts package '$WindowsCSEScriptsPackage' not found under cache directory '$global:CacheDir'" + } + } + + # Step 3: Extract scripts from the resolved zip + Write-Log "Extracting CSE scripts from $scriptsZip" + AKS-Expand-Archive -Path $scriptsZip -DestinationPath "C:\\AzureData\\windows" + if ($shouldCleanup) { + Remove-Item -Path $scriptsZip -Force } - Write-Log "CSEScriptsPackageUrl used for provision is $global:CSEScriptsPackageUrl" - - # Download CSE function scripts - Logs-To-Event -TaskName "AKS.WindowsCSE.DownloadAndExpandCSEScriptPackageUrl" -TaskMessage "Start to get CSE scripts. CSEScriptsPackageUrl: $global:CSEScriptsPackageUrl" - $tempfile = 'c:\csescripts.zip' - DownloadFileOverHttp -Url $global:CSEScriptsPackageUrl -DestinationPath $tempfile -ExitCode $global:WINDOWS_CSE_ERROR_DOWNLOAD_CSE_PACKAGE - AKS-Expand-Archive -Path $tempfile -DestinationPath "C:\\AzureData\\windows" - Remove-Item -Path $tempfile -Force } else { Write-Log "CSE scripts already exist, skipping download" } diff --git a/pkg/agent/testdata/AKSWindows2019+K8S119/CustomData b/pkg/agent/testdata/AKSWindows2019+K8S119/CustomData index 903d8726bc7..070d7078e34 100644 --- a/pkg/agent/testdata/AKSWindows2019+K8S119/CustomData +++ b/pkg/agent/testdata/AKSWindows2019+K8S119/CustomData @@ -188,7 +188,7 @@ $global:AKSAADServerAppID = "6dae42f8-4368-4678-94ff-3960e28e3630" $global:IsDisableWindowsOutboundNat = [System.Convert]::ToBoolean("false"); # Base64 representation of ZIP archive -$zippedFiles = "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" +$zippedFiles = "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" $global:KubeClusterConfigPath = "c:\k\kubeclusterconfig.json" $fipsEnabled = [System.Convert]::ToBoolean("false") @@ -217,6 +217,7 @@ $global:WindowsCiliumInstallPath = Join-Path -Path $global:WindowsCiliumNetworki # Network isolated cluster $global:BootstrapProfileContainerRegistryServer="" $global:MCRRepositoryBase="mcr.microsoft.com/" +$global:NetworkIsolatedClusterTestMode = [System.Convert]::ToBoolean("false"); # for ab e2e only for local ab test with remote cse package $global:OrasCacheDir="c:\aks-tools\oras\" # refer to components.json $global:OrasPath="c:\aks-tools\oras\oras.exe" @@ -240,36 +241,58 @@ try { $global:OperationId = New-Guid if (-not (Test-Path "C:\AzureData\windows\azurecnifunc.ps1")) { - # Determine the CSE package URL - $WindowsCSEScriptsPackage = "aks-windows-cse-scripts-current.zip" # CSEScriptsPackage is cached on VHD. Previously the cse package version was managed in components.json, whereas RP set the package URL which is a storage account. - # From 2025-06 The CSE packages is eleased on the VHD. RP can use fully qualified URL to download CSE scripts package when required out of VHD release cycle. + # From 2025-06 The CSE packages is released on the VHD. RP can use fully qualified URL to download CSE scripts package when required out of VHD release cycle. # In the transition period, it is important that when deal with older VHD versions, the agentbaker runtime provision script needs to be compatible with the latest known storage account package, 0.0.52. - Write-Log "Requested CSEScriptsPackageUrl is $global:CSEScriptsPackageUrl" - if ($global:CSEScriptsPackageUrl.EndsWith("/")) { - $search = @() - if ($global:CacheDir -and (Test-Path $global:CacheDir)) { - $search = [IO.Directory]::GetFiles($global:CacheDir, $WindowsCSEScriptsPackage, [IO.SearchOption]::AllDirectories) - # list files in the cache directory. - Write-Log "the directory $global:CacheDir contains the following files:" - Get-ChildItem -Path $global:CacheDir | ForEach-Object { Write-Log " $_" } + + $WindowsCSEScriptsPackage = "aks-windows-cse-scripts-current.zip" + $scriptsZip = $null + $shouldCleanup = $false + + # Step 1: Try to find cached scripts on VHD + if ($global:CacheDir -and (Test-Path $global:CacheDir)) { + $searchCachedScripts = [IO.Directory]::GetFiles($global:CacheDir, $WindowsCSEScriptsPackage, [IO.SearchOption]::AllDirectories) + Write-Log "the directory $global:CacheDir contains the following files:" + Get-ChildItem -Path $global:CacheDir | ForEach-Object { Write-Log " $_" } + if ($searchCachedScripts.Count -gt 0) { + $scriptsZip = $searchCachedScripts[0] + Write-Log "Found cached CSE scripts at $scriptsZip" } + } - if ($search.Count -eq 0) { - Write-Log "Could not find windows cse package on VHD. Use remote version instead." - $WindowsCSEScriptsPackage = "aks-windows-cse-scripts-v0.0.52.zip" + # Step 2: For non-network-isolated clusters, download scripts if needed (overrides cached version when appropriate) + $isNetworkIsolated = -not [string]::IsNullOrWhiteSpace($global:BootstrapProfileContainerRegistryServer) -and -not $global:NetworkIsolatedClusterTestMode + if (-not $isNetworkIsolated) { + Write-Log "Requested CSEScriptsPackageUrl is $global:CSEScriptsPackageUrl" + if ($global:CSEScriptsPackageUrl.EndsWith("/")) { + if (-not $scriptsZip) { + Write-Log "Could not find windows cse package on VHD. Use remote version instead." + $WindowsCSEScriptsPackage = "aks-windows-cse-scripts-v0.0.52.zip" + } + Write-Log "WindowsCSEScriptsPackage is $WindowsCSEScriptsPackage" + $global:CSEScriptsPackageUrl = $global:CSEScriptsPackageUrl + $WindowsCSEScriptsPackage } - Write-Log "WindowsCSEScriptsPackage is $WindowsCSEScriptsPackage" - $global:CSEScriptsPackageUrl = $global:CSEScriptsPackageUrl + $WindowsCSEScriptsPackage + Write-Log "CSEScriptsPackageUrl used for provision is $global:CSEScriptsPackageUrl" + + # Download CSE function scripts + $downloadedFile = 'c:\csescripts.zip' + Logs-To-Event -TaskName "AKS.WindowsCSE.DownloadAndExpandCSEScriptPackageUrl" -TaskMessage "Start to get CSE scripts. CSEScriptsPackageUrl: $global:CSEScriptsPackageUrl" + DownloadFileOverHttp -Url $global:CSEScriptsPackageUrl -DestinationPath $downloadedFile -ExitCode $global:WINDOWS_CSE_ERROR_DOWNLOAD_CSE_PACKAGE + $scriptsZip = $downloadedFile + $shouldCleanup = $true + } else { + Write-Log "Network isolated cluster detected (BootstrapProfileContainerRegistryServer is set), skip CSE scripts download and use cached scripts" + if (-not $scriptsZip) { + Set-ExitCode -ExitCode $global:WINDOWS_CSE_ERROR_NETWORK_ISOLATED_CLUSTER_CSE_NOT_CACHED -ErrorMessage "Cached CSE scripts package '$WindowsCSEScriptsPackage' not found under cache directory '$global:CacheDir'" + } + } + + # Step 3: Extract scripts from the resolved zip + Write-Log "Extracting CSE scripts from $scriptsZip" + AKS-Expand-Archive -Path $scriptsZip -DestinationPath "C:\\AzureData\\windows" + if ($shouldCleanup) { + Remove-Item -Path $scriptsZip -Force } - Write-Log "CSEScriptsPackageUrl used for provision is $global:CSEScriptsPackageUrl" - - # Download CSE function scripts - Logs-To-Event -TaskName "AKS.WindowsCSE.DownloadAndExpandCSEScriptPackageUrl" -TaskMessage "Start to get CSE scripts. CSEScriptsPackageUrl: $global:CSEScriptsPackageUrl" - $tempfile = 'c:\csescripts.zip' - DownloadFileOverHttp -Url $global:CSEScriptsPackageUrl -DestinationPath $tempfile -ExitCode $global:WINDOWS_CSE_ERROR_DOWNLOAD_CSE_PACKAGE - AKS-Expand-Archive -Path $tempfile -DestinationPath "C:\\AzureData\\windows" - Remove-Item -Path $tempfile -Force } else { Write-Log "CSE scripts already exist, skipping download" } diff --git a/pkg/agent/testdata/AKSWindows2019+KubeletClientTLSBootstrapping/CustomData b/pkg/agent/testdata/AKSWindows2019+KubeletClientTLSBootstrapping/CustomData index fd00091d894..b10782f4bf3 100644 --- a/pkg/agent/testdata/AKSWindows2019+KubeletClientTLSBootstrapping/CustomData +++ b/pkg/agent/testdata/AKSWindows2019+KubeletClientTLSBootstrapping/CustomData @@ -188,7 +188,7 @@ $global:AKSAADServerAppID = "6dae42f8-4368-4678-94ff-3960e28e3630" $global:IsDisableWindowsOutboundNat = [System.Convert]::ToBoolean("false"); # Base64 representation of ZIP archive -$zippedFiles = "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" +$zippedFiles = "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" $global:KubeClusterConfigPath = "c:\k\kubeclusterconfig.json" $fipsEnabled = [System.Convert]::ToBoolean("false") @@ -217,6 +217,7 @@ $global:WindowsCiliumInstallPath = Join-Path -Path $global:WindowsCiliumNetworki # Network isolated cluster $global:BootstrapProfileContainerRegistryServer="" $global:MCRRepositoryBase="mcr.microsoft.com/" +$global:NetworkIsolatedClusterTestMode = [System.Convert]::ToBoolean("false"); # for ab e2e only for local ab test with remote cse package $global:OrasCacheDir="c:\aks-tools\oras\" # refer to components.json $global:OrasPath="c:\aks-tools\oras\oras.exe" @@ -240,36 +241,58 @@ try { $global:OperationId = New-Guid if (-not (Test-Path "C:\AzureData\windows\azurecnifunc.ps1")) { - # Determine the CSE package URL - $WindowsCSEScriptsPackage = "aks-windows-cse-scripts-current.zip" # CSEScriptsPackage is cached on VHD. Previously the cse package version was managed in components.json, whereas RP set the package URL which is a storage account. - # From 2025-06 The CSE packages is eleased on the VHD. RP can use fully qualified URL to download CSE scripts package when required out of VHD release cycle. + # From 2025-06 The CSE packages is released on the VHD. RP can use fully qualified URL to download CSE scripts package when required out of VHD release cycle. # In the transition period, it is important that when deal with older VHD versions, the agentbaker runtime provision script needs to be compatible with the latest known storage account package, 0.0.52. - Write-Log "Requested CSEScriptsPackageUrl is $global:CSEScriptsPackageUrl" - if ($global:CSEScriptsPackageUrl.EndsWith("/")) { - $search = @() - if ($global:CacheDir -and (Test-Path $global:CacheDir)) { - $search = [IO.Directory]::GetFiles($global:CacheDir, $WindowsCSEScriptsPackage, [IO.SearchOption]::AllDirectories) - # list files in the cache directory. - Write-Log "the directory $global:CacheDir contains the following files:" - Get-ChildItem -Path $global:CacheDir | ForEach-Object { Write-Log " $_" } + + $WindowsCSEScriptsPackage = "aks-windows-cse-scripts-current.zip" + $scriptsZip = $null + $shouldCleanup = $false + + # Step 1: Try to find cached scripts on VHD + if ($global:CacheDir -and (Test-Path $global:CacheDir)) { + $searchCachedScripts = [IO.Directory]::GetFiles($global:CacheDir, $WindowsCSEScriptsPackage, [IO.SearchOption]::AllDirectories) + Write-Log "the directory $global:CacheDir contains the following files:" + Get-ChildItem -Path $global:CacheDir | ForEach-Object { Write-Log " $_" } + if ($searchCachedScripts.Count -gt 0) { + $scriptsZip = $searchCachedScripts[0] + Write-Log "Found cached CSE scripts at $scriptsZip" } + } - if ($search.Count -eq 0) { - Write-Log "Could not find windows cse package on VHD. Use remote version instead." - $WindowsCSEScriptsPackage = "aks-windows-cse-scripts-v0.0.52.zip" + # Step 2: For non-network-isolated clusters, download scripts if needed (overrides cached version when appropriate) + $isNetworkIsolated = -not [string]::IsNullOrWhiteSpace($global:BootstrapProfileContainerRegistryServer) -and -not $global:NetworkIsolatedClusterTestMode + if (-not $isNetworkIsolated) { + Write-Log "Requested CSEScriptsPackageUrl is $global:CSEScriptsPackageUrl" + if ($global:CSEScriptsPackageUrl.EndsWith("/")) { + if (-not $scriptsZip) { + Write-Log "Could not find windows cse package on VHD. Use remote version instead." + $WindowsCSEScriptsPackage = "aks-windows-cse-scripts-v0.0.52.zip" + } + Write-Log "WindowsCSEScriptsPackage is $WindowsCSEScriptsPackage" + $global:CSEScriptsPackageUrl = $global:CSEScriptsPackageUrl + $WindowsCSEScriptsPackage } - Write-Log "WindowsCSEScriptsPackage is $WindowsCSEScriptsPackage" - $global:CSEScriptsPackageUrl = $global:CSEScriptsPackageUrl + $WindowsCSEScriptsPackage + Write-Log "CSEScriptsPackageUrl used for provision is $global:CSEScriptsPackageUrl" + + # Download CSE function scripts + $downloadedFile = 'c:\csescripts.zip' + Logs-To-Event -TaskName "AKS.WindowsCSE.DownloadAndExpandCSEScriptPackageUrl" -TaskMessage "Start to get CSE scripts. CSEScriptsPackageUrl: $global:CSEScriptsPackageUrl" + DownloadFileOverHttp -Url $global:CSEScriptsPackageUrl -DestinationPath $downloadedFile -ExitCode $global:WINDOWS_CSE_ERROR_DOWNLOAD_CSE_PACKAGE + $scriptsZip = $downloadedFile + $shouldCleanup = $true + } else { + Write-Log "Network isolated cluster detected (BootstrapProfileContainerRegistryServer is set), skip CSE scripts download and use cached scripts" + if (-not $scriptsZip) { + Set-ExitCode -ExitCode $global:WINDOWS_CSE_ERROR_NETWORK_ISOLATED_CLUSTER_CSE_NOT_CACHED -ErrorMessage "Cached CSE scripts package '$WindowsCSEScriptsPackage' not found under cache directory '$global:CacheDir'" + } + } + + # Step 3: Extract scripts from the resolved zip + Write-Log "Extracting CSE scripts from $scriptsZip" + AKS-Expand-Archive -Path $scriptsZip -DestinationPath "C:\\AzureData\\windows" + if ($shouldCleanup) { + Remove-Item -Path $scriptsZip -Force } - Write-Log "CSEScriptsPackageUrl used for provision is $global:CSEScriptsPackageUrl" - - # Download CSE function scripts - Logs-To-Event -TaskName "AKS.WindowsCSE.DownloadAndExpandCSEScriptPackageUrl" -TaskMessage "Start to get CSE scripts. CSEScriptsPackageUrl: $global:CSEScriptsPackageUrl" - $tempfile = 'c:\csescripts.zip' - DownloadFileOverHttp -Url $global:CSEScriptsPackageUrl -DestinationPath $tempfile -ExitCode $global:WINDOWS_CSE_ERROR_DOWNLOAD_CSE_PACKAGE - AKS-Expand-Archive -Path $tempfile -DestinationPath "C:\\AzureData\\windows" - Remove-Item -Path $tempfile -Force } else { Write-Log "CSE scripts already exist, skipping download" } diff --git a/pkg/agent/testdata/AKSWindows2019+KubeletServingCertificateRotation/CustomData b/pkg/agent/testdata/AKSWindows2019+KubeletServingCertificateRotation/CustomData index d4f4c50bfb2..aa72d32e1eb 100644 --- a/pkg/agent/testdata/AKSWindows2019+KubeletServingCertificateRotation/CustomData +++ b/pkg/agent/testdata/AKSWindows2019+KubeletServingCertificateRotation/CustomData @@ -188,7 +188,7 @@ $global:AKSAADServerAppID = "6dae42f8-4368-4678-94ff-3960e28e3630" $global:IsDisableWindowsOutboundNat = [System.Convert]::ToBoolean("false"); # Base64 representation of ZIP archive -$zippedFiles = "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" +$zippedFiles = "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" $global:KubeClusterConfigPath = "c:\k\kubeclusterconfig.json" $fipsEnabled = [System.Convert]::ToBoolean("false") @@ -217,6 +217,7 @@ $global:WindowsCiliumInstallPath = Join-Path -Path $global:WindowsCiliumNetworki # Network isolated cluster $global:BootstrapProfileContainerRegistryServer="" $global:MCRRepositoryBase="mcr.microsoft.com/" +$global:NetworkIsolatedClusterTestMode = [System.Convert]::ToBoolean("false"); # for ab e2e only for local ab test with remote cse package $global:OrasCacheDir="c:\aks-tools\oras\" # refer to components.json $global:OrasPath="c:\aks-tools\oras\oras.exe" @@ -240,36 +241,58 @@ try { $global:OperationId = New-Guid if (-not (Test-Path "C:\AzureData\windows\azurecnifunc.ps1")) { - # Determine the CSE package URL - $WindowsCSEScriptsPackage = "aks-windows-cse-scripts-current.zip" # CSEScriptsPackage is cached on VHD. Previously the cse package version was managed in components.json, whereas RP set the package URL which is a storage account. - # From 2025-06 The CSE packages is eleased on the VHD. RP can use fully qualified URL to download CSE scripts package when required out of VHD release cycle. + # From 2025-06 The CSE packages is released on the VHD. RP can use fully qualified URL to download CSE scripts package when required out of VHD release cycle. # In the transition period, it is important that when deal with older VHD versions, the agentbaker runtime provision script needs to be compatible with the latest known storage account package, 0.0.52. - Write-Log "Requested CSEScriptsPackageUrl is $global:CSEScriptsPackageUrl" - if ($global:CSEScriptsPackageUrl.EndsWith("/")) { - $search = @() - if ($global:CacheDir -and (Test-Path $global:CacheDir)) { - $search = [IO.Directory]::GetFiles($global:CacheDir, $WindowsCSEScriptsPackage, [IO.SearchOption]::AllDirectories) - # list files in the cache directory. - Write-Log "the directory $global:CacheDir contains the following files:" - Get-ChildItem -Path $global:CacheDir | ForEach-Object { Write-Log " $_" } + + $WindowsCSEScriptsPackage = "aks-windows-cse-scripts-current.zip" + $scriptsZip = $null + $shouldCleanup = $false + + # Step 1: Try to find cached scripts on VHD + if ($global:CacheDir -and (Test-Path $global:CacheDir)) { + $searchCachedScripts = [IO.Directory]::GetFiles($global:CacheDir, $WindowsCSEScriptsPackage, [IO.SearchOption]::AllDirectories) + Write-Log "the directory $global:CacheDir contains the following files:" + Get-ChildItem -Path $global:CacheDir | ForEach-Object { Write-Log " $_" } + if ($searchCachedScripts.Count -gt 0) { + $scriptsZip = $searchCachedScripts[0] + Write-Log "Found cached CSE scripts at $scriptsZip" } + } - if ($search.Count -eq 0) { - Write-Log "Could not find windows cse package on VHD. Use remote version instead." - $WindowsCSEScriptsPackage = "aks-windows-cse-scripts-v0.0.52.zip" + # Step 2: For non-network-isolated clusters, download scripts if needed (overrides cached version when appropriate) + $isNetworkIsolated = -not [string]::IsNullOrWhiteSpace($global:BootstrapProfileContainerRegistryServer) -and -not $global:NetworkIsolatedClusterTestMode + if (-not $isNetworkIsolated) { + Write-Log "Requested CSEScriptsPackageUrl is $global:CSEScriptsPackageUrl" + if ($global:CSEScriptsPackageUrl.EndsWith("/")) { + if (-not $scriptsZip) { + Write-Log "Could not find windows cse package on VHD. Use remote version instead." + $WindowsCSEScriptsPackage = "aks-windows-cse-scripts-v0.0.52.zip" + } + Write-Log "WindowsCSEScriptsPackage is $WindowsCSEScriptsPackage" + $global:CSEScriptsPackageUrl = $global:CSEScriptsPackageUrl + $WindowsCSEScriptsPackage } - Write-Log "WindowsCSEScriptsPackage is $WindowsCSEScriptsPackage" - $global:CSEScriptsPackageUrl = $global:CSEScriptsPackageUrl + $WindowsCSEScriptsPackage + Write-Log "CSEScriptsPackageUrl used for provision is $global:CSEScriptsPackageUrl" + + # Download CSE function scripts + $downloadedFile = 'c:\csescripts.zip' + Logs-To-Event -TaskName "AKS.WindowsCSE.DownloadAndExpandCSEScriptPackageUrl" -TaskMessage "Start to get CSE scripts. CSEScriptsPackageUrl: $global:CSEScriptsPackageUrl" + DownloadFileOverHttp -Url $global:CSEScriptsPackageUrl -DestinationPath $downloadedFile -ExitCode $global:WINDOWS_CSE_ERROR_DOWNLOAD_CSE_PACKAGE + $scriptsZip = $downloadedFile + $shouldCleanup = $true + } else { + Write-Log "Network isolated cluster detected (BootstrapProfileContainerRegistryServer is set), skip CSE scripts download and use cached scripts" + if (-not $scriptsZip) { + Set-ExitCode -ExitCode $global:WINDOWS_CSE_ERROR_NETWORK_ISOLATED_CLUSTER_CSE_NOT_CACHED -ErrorMessage "Cached CSE scripts package '$WindowsCSEScriptsPackage' not found under cache directory '$global:CacheDir'" + } + } + + # Step 3: Extract scripts from the resolved zip + Write-Log "Extracting CSE scripts from $scriptsZip" + AKS-Expand-Archive -Path $scriptsZip -DestinationPath "C:\\AzureData\\windows" + if ($shouldCleanup) { + Remove-Item -Path $scriptsZip -Force } - Write-Log "CSEScriptsPackageUrl used for provision is $global:CSEScriptsPackageUrl" - - # Download CSE function scripts - Logs-To-Event -TaskName "AKS.WindowsCSE.DownloadAndExpandCSEScriptPackageUrl" -TaskMessage "Start to get CSE scripts. CSEScriptsPackageUrl: $global:CSEScriptsPackageUrl" - $tempfile = 'c:\csescripts.zip' - DownloadFileOverHttp -Url $global:CSEScriptsPackageUrl -DestinationPath $tempfile -ExitCode $global:WINDOWS_CSE_ERROR_DOWNLOAD_CSE_PACKAGE - AKS-Expand-Archive -Path $tempfile -DestinationPath "C:\\AzureData\\windows" - Remove-Item -Path $tempfile -Force } else { Write-Log "CSE scripts already exist, skipping download" } diff --git a/pkg/agent/testdata/AKSWindows2019+ManagedIdentity/CustomData b/pkg/agent/testdata/AKSWindows2019+ManagedIdentity/CustomData index c920fe818ad..caa14ed2070 100644 --- a/pkg/agent/testdata/AKSWindows2019+ManagedIdentity/CustomData +++ b/pkg/agent/testdata/AKSWindows2019+ManagedIdentity/CustomData @@ -190,7 +190,7 @@ $global:AKSAADServerAppID = "6dae42f8-4368-4678-94ff-3960e28e3630" $global:IsDisableWindowsOutboundNat = [System.Convert]::ToBoolean("false"); # Base64 representation of ZIP archive -$zippedFiles = "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" +$zippedFiles = "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" $global:KubeClusterConfigPath = "c:\k\kubeclusterconfig.json" $fipsEnabled = [System.Convert]::ToBoolean("false") @@ -219,6 +219,7 @@ $global:WindowsCiliumInstallPath = Join-Path -Path $global:WindowsCiliumNetworki # Network isolated cluster $global:BootstrapProfileContainerRegistryServer="" $global:MCRRepositoryBase="mcr.microsoft.com/" +$global:NetworkIsolatedClusterTestMode = [System.Convert]::ToBoolean("false"); # for ab e2e only for local ab test with remote cse package $global:OrasCacheDir="c:\aks-tools\oras\" # refer to components.json $global:OrasPath="c:\aks-tools\oras\oras.exe" @@ -242,36 +243,58 @@ try { $global:OperationId = New-Guid if (-not (Test-Path "C:\AzureData\windows\azurecnifunc.ps1")) { - # Determine the CSE package URL - $WindowsCSEScriptsPackage = "aks-windows-cse-scripts-current.zip" # CSEScriptsPackage is cached on VHD. Previously the cse package version was managed in components.json, whereas RP set the package URL which is a storage account. - # From 2025-06 The CSE packages is eleased on the VHD. RP can use fully qualified URL to download CSE scripts package when required out of VHD release cycle. + # From 2025-06 The CSE packages is released on the VHD. RP can use fully qualified URL to download CSE scripts package when required out of VHD release cycle. # In the transition period, it is important that when deal with older VHD versions, the agentbaker runtime provision script needs to be compatible with the latest known storage account package, 0.0.52. - Write-Log "Requested CSEScriptsPackageUrl is $global:CSEScriptsPackageUrl" - if ($global:CSEScriptsPackageUrl.EndsWith("/")) { - $search = @() - if ($global:CacheDir -and (Test-Path $global:CacheDir)) { - $search = [IO.Directory]::GetFiles($global:CacheDir, $WindowsCSEScriptsPackage, [IO.SearchOption]::AllDirectories) - # list files in the cache directory. - Write-Log "the directory $global:CacheDir contains the following files:" - Get-ChildItem -Path $global:CacheDir | ForEach-Object { Write-Log " $_" } + + $WindowsCSEScriptsPackage = "aks-windows-cse-scripts-current.zip" + $scriptsZip = $null + $shouldCleanup = $false + + # Step 1: Try to find cached scripts on VHD + if ($global:CacheDir -and (Test-Path $global:CacheDir)) { + $searchCachedScripts = [IO.Directory]::GetFiles($global:CacheDir, $WindowsCSEScriptsPackage, [IO.SearchOption]::AllDirectories) + Write-Log "the directory $global:CacheDir contains the following files:" + Get-ChildItem -Path $global:CacheDir | ForEach-Object { Write-Log " $_" } + if ($searchCachedScripts.Count -gt 0) { + $scriptsZip = $searchCachedScripts[0] + Write-Log "Found cached CSE scripts at $scriptsZip" } + } - if ($search.Count -eq 0) { - Write-Log "Could not find windows cse package on VHD. Use remote version instead." - $WindowsCSEScriptsPackage = "aks-windows-cse-scripts-v0.0.52.zip" + # Step 2: For non-network-isolated clusters, download scripts if needed (overrides cached version when appropriate) + $isNetworkIsolated = -not [string]::IsNullOrWhiteSpace($global:BootstrapProfileContainerRegistryServer) -and -not $global:NetworkIsolatedClusterTestMode + if (-not $isNetworkIsolated) { + Write-Log "Requested CSEScriptsPackageUrl is $global:CSEScriptsPackageUrl" + if ($global:CSEScriptsPackageUrl.EndsWith("/")) { + if (-not $scriptsZip) { + Write-Log "Could not find windows cse package on VHD. Use remote version instead." + $WindowsCSEScriptsPackage = "aks-windows-cse-scripts-v0.0.52.zip" + } + Write-Log "WindowsCSEScriptsPackage is $WindowsCSEScriptsPackage" + $global:CSEScriptsPackageUrl = $global:CSEScriptsPackageUrl + $WindowsCSEScriptsPackage } - Write-Log "WindowsCSEScriptsPackage is $WindowsCSEScriptsPackage" - $global:CSEScriptsPackageUrl = $global:CSEScriptsPackageUrl + $WindowsCSEScriptsPackage + Write-Log "CSEScriptsPackageUrl used for provision is $global:CSEScriptsPackageUrl" + + # Download CSE function scripts + $downloadedFile = 'c:\csescripts.zip' + Logs-To-Event -TaskName "AKS.WindowsCSE.DownloadAndExpandCSEScriptPackageUrl" -TaskMessage "Start to get CSE scripts. CSEScriptsPackageUrl: $global:CSEScriptsPackageUrl" + DownloadFileOverHttp -Url $global:CSEScriptsPackageUrl -DestinationPath $downloadedFile -ExitCode $global:WINDOWS_CSE_ERROR_DOWNLOAD_CSE_PACKAGE + $scriptsZip = $downloadedFile + $shouldCleanup = $true + } else { + Write-Log "Network isolated cluster detected (BootstrapProfileContainerRegistryServer is set), skip CSE scripts download and use cached scripts" + if (-not $scriptsZip) { + Set-ExitCode -ExitCode $global:WINDOWS_CSE_ERROR_NETWORK_ISOLATED_CLUSTER_CSE_NOT_CACHED -ErrorMessage "Cached CSE scripts package '$WindowsCSEScriptsPackage' not found under cache directory '$global:CacheDir'" + } + } + + # Step 3: Extract scripts from the resolved zip + Write-Log "Extracting CSE scripts from $scriptsZip" + AKS-Expand-Archive -Path $scriptsZip -DestinationPath "C:\\AzureData\\windows" + if ($shouldCleanup) { + Remove-Item -Path $scriptsZip -Force } - Write-Log "CSEScriptsPackageUrl used for provision is $global:CSEScriptsPackageUrl" - - # Download CSE function scripts - Logs-To-Event -TaskName "AKS.WindowsCSE.DownloadAndExpandCSEScriptPackageUrl" -TaskMessage "Start to get CSE scripts. CSEScriptsPackageUrl: $global:CSEScriptsPackageUrl" - $tempfile = 'c:\csescripts.zip' - DownloadFileOverHttp -Url $global:CSEScriptsPackageUrl -DestinationPath $tempfile -ExitCode $global:WINDOWS_CSE_ERROR_DOWNLOAD_CSE_PACKAGE - AKS-Expand-Archive -Path $tempfile -DestinationPath "C:\\AzureData\\windows" - Remove-Item -Path $tempfile -Force } else { Write-Log "CSE scripts already exist, skipping download" } diff --git a/pkg/agent/testdata/AKSWindows2019+SecurityProfile/CustomData b/pkg/agent/testdata/AKSWindows2019+SecurityProfile/CustomData index 5e2a2f0a1b1..86ff6da0d27 100644 --- a/pkg/agent/testdata/AKSWindows2019+SecurityProfile/CustomData +++ b/pkg/agent/testdata/AKSWindows2019+SecurityProfile/CustomData @@ -188,7 +188,7 @@ $global:AKSAADServerAppID = "6dae42f8-4368-4678-94ff-3960e28e3630" $global:IsDisableWindowsOutboundNat = [System.Convert]::ToBoolean("false"); # Base64 representation of ZIP archive -$zippedFiles = "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" +$zippedFiles = "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" $global:KubeClusterConfigPath = "c:\k\kubeclusterconfig.json" $fipsEnabled = [System.Convert]::ToBoolean("false") @@ -217,6 +217,7 @@ $global:WindowsCiliumInstallPath = Join-Path -Path $global:WindowsCiliumNetworki # Network isolated cluster $global:BootstrapProfileContainerRegistryServer="" $global:MCRRepositoryBase="mcr.microsoft.com/" +$global:NetworkIsolatedClusterTestMode = [System.Convert]::ToBoolean("false"); # for ab e2e only for local ab test with remote cse package $global:OrasCacheDir="c:\aks-tools\oras\" # refer to components.json $global:OrasPath="c:\aks-tools\oras\oras.exe" @@ -240,36 +241,58 @@ try { $global:OperationId = New-Guid if (-not (Test-Path "C:\AzureData\windows\azurecnifunc.ps1")) { - # Determine the CSE package URL - $WindowsCSEScriptsPackage = "aks-windows-cse-scripts-current.zip" # CSEScriptsPackage is cached on VHD. Previously the cse package version was managed in components.json, whereas RP set the package URL which is a storage account. - # From 2025-06 The CSE packages is eleased on the VHD. RP can use fully qualified URL to download CSE scripts package when required out of VHD release cycle. + # From 2025-06 The CSE packages is released on the VHD. RP can use fully qualified URL to download CSE scripts package when required out of VHD release cycle. # In the transition period, it is important that when deal with older VHD versions, the agentbaker runtime provision script needs to be compatible with the latest known storage account package, 0.0.52. - Write-Log "Requested CSEScriptsPackageUrl is $global:CSEScriptsPackageUrl" - if ($global:CSEScriptsPackageUrl.EndsWith("/")) { - $search = @() - if ($global:CacheDir -and (Test-Path $global:CacheDir)) { - $search = [IO.Directory]::GetFiles($global:CacheDir, $WindowsCSEScriptsPackage, [IO.SearchOption]::AllDirectories) - # list files in the cache directory. - Write-Log "the directory $global:CacheDir contains the following files:" - Get-ChildItem -Path $global:CacheDir | ForEach-Object { Write-Log " $_" } + + $WindowsCSEScriptsPackage = "aks-windows-cse-scripts-current.zip" + $scriptsZip = $null + $shouldCleanup = $false + + # Step 1: Try to find cached scripts on VHD + if ($global:CacheDir -and (Test-Path $global:CacheDir)) { + $searchCachedScripts = [IO.Directory]::GetFiles($global:CacheDir, $WindowsCSEScriptsPackage, [IO.SearchOption]::AllDirectories) + Write-Log "the directory $global:CacheDir contains the following files:" + Get-ChildItem -Path $global:CacheDir | ForEach-Object { Write-Log " $_" } + if ($searchCachedScripts.Count -gt 0) { + $scriptsZip = $searchCachedScripts[0] + Write-Log "Found cached CSE scripts at $scriptsZip" } + } - if ($search.Count -eq 0) { - Write-Log "Could not find windows cse package on VHD. Use remote version instead." - $WindowsCSEScriptsPackage = "aks-windows-cse-scripts-v0.0.52.zip" + # Step 2: For non-network-isolated clusters, download scripts if needed (overrides cached version when appropriate) + $isNetworkIsolated = -not [string]::IsNullOrWhiteSpace($global:BootstrapProfileContainerRegistryServer) -and -not $global:NetworkIsolatedClusterTestMode + if (-not $isNetworkIsolated) { + Write-Log "Requested CSEScriptsPackageUrl is $global:CSEScriptsPackageUrl" + if ($global:CSEScriptsPackageUrl.EndsWith("/")) { + if (-not $scriptsZip) { + Write-Log "Could not find windows cse package on VHD. Use remote version instead." + $WindowsCSEScriptsPackage = "aks-windows-cse-scripts-v0.0.52.zip" + } + Write-Log "WindowsCSEScriptsPackage is $WindowsCSEScriptsPackage" + $global:CSEScriptsPackageUrl = $global:CSEScriptsPackageUrl + $WindowsCSEScriptsPackage } - Write-Log "WindowsCSEScriptsPackage is $WindowsCSEScriptsPackage" - $global:CSEScriptsPackageUrl = $global:CSEScriptsPackageUrl + $WindowsCSEScriptsPackage + Write-Log "CSEScriptsPackageUrl used for provision is $global:CSEScriptsPackageUrl" + + # Download CSE function scripts + $downloadedFile = 'c:\csescripts.zip' + Logs-To-Event -TaskName "AKS.WindowsCSE.DownloadAndExpandCSEScriptPackageUrl" -TaskMessage "Start to get CSE scripts. CSEScriptsPackageUrl: $global:CSEScriptsPackageUrl" + DownloadFileOverHttp -Url $global:CSEScriptsPackageUrl -DestinationPath $downloadedFile -ExitCode $global:WINDOWS_CSE_ERROR_DOWNLOAD_CSE_PACKAGE + $scriptsZip = $downloadedFile + $shouldCleanup = $true + } else { + Write-Log "Network isolated cluster detected (BootstrapProfileContainerRegistryServer is set), skip CSE scripts download and use cached scripts" + if (-not $scriptsZip) { + Set-ExitCode -ExitCode $global:WINDOWS_CSE_ERROR_NETWORK_ISOLATED_CLUSTER_CSE_NOT_CACHED -ErrorMessage "Cached CSE scripts package '$WindowsCSEScriptsPackage' not found under cache directory '$global:CacheDir'" + } + } + + # Step 3: Extract scripts from the resolved zip + Write-Log "Extracting CSE scripts from $scriptsZip" + AKS-Expand-Archive -Path $scriptsZip -DestinationPath "C:\\AzureData\\windows" + if ($shouldCleanup) { + Remove-Item -Path $scriptsZip -Force } - Write-Log "CSEScriptsPackageUrl used for provision is $global:CSEScriptsPackageUrl" - - # Download CSE function scripts - Logs-To-Event -TaskName "AKS.WindowsCSE.DownloadAndExpandCSEScriptPackageUrl" -TaskMessage "Start to get CSE scripts. CSEScriptsPackageUrl: $global:CSEScriptsPackageUrl" - $tempfile = 'c:\csescripts.zip' - DownloadFileOverHttp -Url $global:CSEScriptsPackageUrl -DestinationPath $tempfile -ExitCode $global:WINDOWS_CSE_ERROR_DOWNLOAD_CSE_PACKAGE - AKS-Expand-Archive -Path $tempfile -DestinationPath "C:\\AzureData\\windows" - Remove-Item -Path $tempfile -Force } else { Write-Log "CSE scripts already exist, skipping download" } diff --git a/pkg/agent/testdata/AKSWindows2019+ootcredentialprovider/CustomData b/pkg/agent/testdata/AKSWindows2019+ootcredentialprovider/CustomData index 54ad664e653..734a6a2948a 100644 --- a/pkg/agent/testdata/AKSWindows2019+ootcredentialprovider/CustomData +++ b/pkg/agent/testdata/AKSWindows2019+ootcredentialprovider/CustomData @@ -188,7 +188,7 @@ $global:AKSAADServerAppID = "6dae42f8-4368-4678-94ff-3960e28e3630" $global:IsDisableWindowsOutboundNat = [System.Convert]::ToBoolean("false"); # Base64 representation of ZIP archive -$zippedFiles = "UEsDBBQACAAIAAAAAAAAAAAAAAAAAAAAAAAcAAAAd2luZG93cy93aW5kb3dzY3NlaGVscGVyLnBzMdR9a3PbOLLod/8KXFn3xN6JFNuJk4yneO4yEu1wrNclKTuZOKWFKUjCCUVoAdCOJ8l/P4UHSZAiaTk7+2FTU4lN9guNRqO70eDsg2CFGWAhxRsOMAMJQ3PACZijBY4RuIUMhyDhOAKLJA45JjHb2weuhL1FnCNqQGcgAMeAr5Cmy0ASzxEFjMMljpcvQoZe3ON4Tu5Zd29vH/QVNowigL5iDkIyR5LEtQICPd9RTNcJ42ANebgC//hkd/6Yff7lH3vtZURuYXR27Y7642t/1vOdmT/t9Rzft44q3zqeN/Zm09HlaHw9so7BPjgnFCQx+rpBIUdzgCglFIQwWa44uH2QYwkl29uIhF+EbF+SW0RjxBHTQ2GIJ5vuhh03sOyPr0eDsd2fnbsDZ3btBu9nnhN4H62TBiR3dDW+dGbOB6c3Dex3A8d62QAtKY/Gwcz54PqB9aoBtPfe6V3O7Ik78x3vyvFmvfFo5PQC98oNPlqnDZgTe+o7M3doX5i8XjdgXDjBzJ++GznBbOI55+4H600j9Mjx7MCZBeNLZzQ7H3sz2xtabxtQRk5wPfYuZ+4ocLxzu+f4hmS/7oBo9+1J4HgG1nGT9QztkX3hDJ1RMHMnJlLT/PfsgdsbS3W7PWdm93rj6SgwsZsMoTceBbY7cry+xHBHfmAPBk7fOm4yiBKWNx2N3NGFddxkGeOJM/L992U2TSaRopy7nnNtDwYStzcenbsXU08gN1mHO7qyB25/NrE9e+iIWXBHM/uPqedoEtZxk7mMxrP+uHfpeLNgPHs3dQd9baHZ2K3jJtsRxtmzZz3HC9xzt2cHjm8dN9lMto7LWCdNJuMMJ8HHbZQmg3FGYsHPfKcndBEMfOukyUIuhr49cz5M7FF/Znu99+6VY500GYdCUEwm42vH8987g8Fs4rlX7sC5cKyTJjOR2L4TzDznwvUD7+Ns4nhD1/fd8cg6abKWbcwrezAV2mh0IgLLHU7GXjDr9S6cK2cU+NZJoycpotiXV5PJYHrhjlLkRp8yDmbn4+moX1zt1kmjP8mQlCWOpsN3jme9bLKMHGfija9coT93dDHze547CXzrZZOJ+IHtCRfSd2aeI1SqsGaB7V9aL5usJbdi35lN7N6lfeFYL5vMJcO4nL5zvJETOH6O2GQpOauRm2M0WUiG8X7kz4bj/lTse03GYaxJ6WQzLk3mkSFJO8lQmozC0JorpuvDxxxvN5+RO+QU8VWTcYg5DXqTWf/jyB66vZm0Zc8eCbwmw1Dmpx1j2R++ajKMyVT4gHyPt141GYXiE9gXRZTGyCNXwTt3ZHsf02ilySJSPTgfeoNp3ynoockwBN60X62/JttI8ar4NXuNWW/qB+PhrG8Hthig9epXsA88xBMq4mLM0gCTzJGIJUOGwvVcxI7gfoVi0Du7sf9MKOpDDm96CeNkLX7s3uIYzAliICZchMqMPyKGL33CdBDMBuML6/ToX5DCdzzEkoh3I7LcXYjeePJR8J71xoOBCC3Ho8yrnTYZr+f47h/ObOzP+p7YxU4bt73JVIF5abRiS07ntiviltPGHbAGN3CHzngaWKeNG2AN8tVwJsUXft2fToTlCDkad8QaUlNPhVK+E1injZvjZDrzL6czd3Q+zjcU67Rxd6xhmucptjuYeo512hg+mVRUIOe7FyM7kJhNPrGOv/Oh50zET9brJs/4mM6cD471usnKppO+HYidVuxns95g6gcqDRIh5+tGk3P0nutOrl6LmOB1o5E5genzrhxPhkivm2xLj2jW85y+Mwpce6CCg77jAQu8PgX7ebYMFoQCHDMOowjHSxBSNEcxxzACG0ru8BzRnXYmwapf5GW9fr3FaU7u44jAeQ0rsIA4Sihq8gvbg8rU/maLX7hC4Zc6ZiGJF3i5A0+7//vUD2YT+8KRSbJYodbrJsMejMeX04maiVHPUf48sC+s179uyRgRIkVMNiAmc7QhJHpxNQQcLhm4wxC4w76/yxzkof7s3Xgc+IFnT2a9geuMAuvNUeNUMBQmFIFg4INbQjjjFG5AGGEU8x3Uk9pbowDHTVb3r/HPnrgDdzpM03KxOFPJtDt/07QunQ+BZ/eC2R/uxHrTtCSlsodOYItJtd40rcSJ7fmOAduYBnu2b3jfN9uLR2ybCxzLGSMUZrWyrPi0gXz1HNyvcLgCmAEINhRR9M8EM8wViU2iFL6B4Re4RAwsKFkDipaYcfqguCB+T+gXgBmJoKAaRgnjjW5Aii7MNNv73mwvRY7XiCQc3EPMhQjimcABFLENiVnTDEsGMrZMay4Zo7dbjFRsko5UKkpGJRFZ4ngnJtORPQ3ejz33D2E02yu2yAFSjhcw5OAe85XiV9SqfA4TviIU/wk5JjHAjCW7DVi/+8OdSCu23m6v5KI4X5JbFCEu/w159Kh4O0lR4XWtt9tLuihJlc/9S6SZjPsiWPFsIy15e/KINBuYMATwGi5RLfN9sM12aH+Y9cZ9R6woEkcPqtCNY5DEmAOOGGeAE3CHKF48CEvjKyRW0b0ZJMdwjeSSnM8VcjpMR8D0yByN4BqxvX0wiRBkSDBRteOEUuEF72CUIEAWTQJCJlEyUPFLSQ4YC+4hRWtBFMsSdVOYk9K23r7cy4WD83mZcHlHEa8zJ4Nj4E0UHCdkr3rswAJ/P9gDAICWKYeux7eeb7/SkZgqxtcD1JXO6zG26ub1oMWieT1cY8W8Hq2yXF4PvlUrbwKtKpTXwzdVyR/H2iqR16PUlMcbVPtIabwBs6YsvjOGLonXw1eWwx8HrymFN1pscxm8YYoeLYE321upKr3DOtwZo7Ls3QBeLnk3CL5d7n4MuL7U/QhmTZn7KViqxP0IRrm8vTN4ubTdZCuVZe1dEMyS9i7wVeXserymUvYuFpmXsXeA3i5h74BklK93gM5L1zsAF8vWOyCYJesdwLfK1bvgbJWqGyavtkxdj9NUoq7HKpenH6NfKk3vtC+YZenHx7xdIm7GqS5HP47zFD7bZehm2EKtuElHtRXdeqRSNbfBpzVWcp+OpxPMpyNWVnCfTsao3jYjb1dun86sXLXdkUKpYrsjVlW19umoRqW2HrmpStvAslShbYbcrs7WwzdUZnfxqRVF1oblVlsorcepKnTWQ9cVOXcYSkOp8HHt/RRy9uSRImE9BaNA2KQTozjYsBEVCoP1cMWi4CNwZgXuEdCqWtouKGZlbBd4/S6tXu2C8qS10VgTau0d7u3tg2CF0lIEmJM1xDHgBNzKGss8K0ZMFERf1zDO/zmPgQXacRJFKQ2KFohSWWdV1M7/f3+UE0hfV1NqpdWQLvzCuvDPhKJuSNatvX1wDqPoFoZfJD2AFwanEMYx4ULYkMQchtyQOEWr4QdD1lljSglV3NB8ibox4i2hk9E4cM7AZdaJeIUow8Q4I5bscAxad62M4RDHeA2jLaxrzFcDyBHjPYWF6FxIcNw9eds9aoF9cI2jCIQrGC8RwFyoX9a2CKUo5OBOM5dV2nsEWLLZEMplDSlt5Axzyhpcz8paCJWsja7KjB4nsoxmoJ50v/7UaE7UcF6+7B6JCbMjviLJcqVHEXMMJfnULhIaAcwAQxzgGNiXflb+isn9czlELjQSI9Uym2zmkKt634JEEbnH8RLcQYrhbYSYrK3ZSxTzd/ALoplKnBNHlR/NVthtPQGO1psI8rzcnI9Lm06gIcQo774d/ego8zx+cYtjSDFiL3KyHROgoztYO3A9f/2qyyHtLv+UBpYaVJysbxHVldNOVjsVgyMJA5sIhohlkvlcjDiXL6Uitf+6+/I0N8byFBVA33RPjupBTwzYk+5R91VrLy+BqgFpiJOjk1MJdXRyKod1nkRRNs0byFcMQIrAEsWIysOShIm5+8Q4xfHy89nZOaFryA8eVf1z0NbzdajWgbANNM8Fc+5QzNmALJc4XvYxFWL1zm60vLLd4mZAluxmEiVLHLObIQ4pYWTBuz2y3iQcdVU/iC87q52vHMWC3Y0ifJOrK4DsywiupTUUnwZ4jXwO1xv1ak/3gC9wxBEFFK3JnXAfiVrsVLgrysDBzdGhPpQSugrhhidUmUHM2LqLviJAEr5JeHZOsxTrYkXlGtuQe0TZCkXRnmbkSUajJIoY+AbaM9ChSBoSeHZz9Ow5ePYM/NhLgYXMTMr8DbTaBxeId/rC1DtqZgA5PAPtWUti6CZ0cE0xR50BWR6014gxuESH4JvcgtprthTbgn4Mvuf05XuF+Z4wLkH3TKqZg8YRGt8h+p7zjSY7gRSuVfFb/Pkkf0cc0YMhjOeQE/oguHKaoMPPqXFl4O0pjZ7/NHIfMY5jeSw1gXy1MyEcc4OK8xXzHpkj+eRwT/6zD84xZVwdwgs/xxAS2xsUFqMPYWSvvzC27IQkogjOH0AIwxWaA6KOOK/e95X+wwjBeEojIciURl1/E2F+8Oz/PTv8dKTEaQvi2n4/ueOuGNTns7MLxM/1i4OMiha0zRCk4UqeQBzKJ3gB8jUrJBErrgPjOTgIEOMdQRSUAQ5TKynSFEL0sdjpCH3IJWFbDJ7nsj+XWL4kMd6Iufl8dmZHUUoHI6YE/bGXy6s4dnskiTnoxAgcmQJlRg1aU+mktIbTbYIsDNV1QI9sHuQxrZgqeUrWTjl8Ovp8KKazbDqtjJdA7rgcrYHWVIYIOgbSFgW5KkOkRyb+RhFDRa2GCUUTSjgJScSMKZOvcVwF8Ml/YBytuyPEu754j/lDChE8bNDnszMF0UcLmET8OdgFg0Uvtf2IPwtCEQxX4KC90XDCwaV0nDhZq6m/glGC2OMiFYwJpFO8Pb5OTLjenRnIeJeRK3X3i5UjFKB/7G3/VBSY3uEQTQiO+RDGcImoUEhpGGKJlljm6moP4WaD5molT2X803kHGRIPOm6MOYaR+Fks8koTlihzMPUGEgZ0/tukyUl2GmlYdaXN5iKRaD6hZEkRYyqYR3EovEh7+2mOVInxzMcRinn0IPZ7HCfomcEmFUzsHGIbTzXbx3AZE8ZxyLo+J5t7yEPhuXwOKR+he8POOX0oTXAb0qU09m9Tiq1cE7+BIeIrMrdaF4i3fgPjRDofq6yH34A8jbXlVmW1BP/WjwIHD3H60OmR9Vq4weyHlhvfkS+o4yHGFasW6NhCGCVSR+BhxMCp+vGhjyL44KOQxHMGjo9yU9P3pIrj8hHvpHsLyH9qG8+E3EO9H7fOIY5UbGGeRuf66Kpxyj2/wsqLkyOnwXQvKIIbhuZDoekSqKNf4SjCTI0un3NzO7E3GzdmeLnirKc6nISrlolmedW2kYjNgAVG6L4zvv0fkSy18rjO3mwiHMopTCl2+5BDYXQi+GJdGdsFKEJroflWBfFuGukJq0gjlErACSUbRDlG7FMr3Ulbn4Ui0vVVhTUUsx+yT61+QqWkQ6aQMlUWseqU1A0oDL/I8Rwo0ofG9D2yHKtX9l6VX0lVgOZq5yv6lK39CsemUaxZrjkRaModcHuPM1YaSB0E+A5UQNoZYMbBd7FQO76M1cD3XMA9NV4zrDRXyN7O4aTVHMY1R4FWbTBpLkb5VM2SoWAfcZAtXqHS7BfhTdBXzPMlalJTms2yIY1kFQPPfZFbi5z/e9oMw9AGUiG0eADBPaFfICVJPAcMC+NoAULBMzAnsuohG98gMzrqEJVkuJzDJSsKYYhnHRSkNVOS7yIl+b9ves+ULmSPUi62OZUTwviGxMqZQsp14kb1tIr0rhOQjlwFoJPlaS370u/qRLDnO92UTIlKS6FkrlLuK2IKQopERgRjIHhzLHZKyGTEThUJFYMP9RxAJa1yS74IIpMIzQVtbdQd5ysKE45AK0/eRJqndoZE9h618i3kHy0taScVVceB/2hpjhuK4xBvYFTFdJK97EwZou4c+B/9wBkCYXAkFtEU0BGLHYYqOPaSeIDuUATe4+UKMa6th1O8XMopx0zpgKSbfTt9pyT4ndwG+kHH5gBkieVh157P9fZ2cHx6KDwyElsE6IwzWvLWM67TIuhoPaaa7uRDNFTRSQXIRBOxtczuBVKqVBCmSoUL8bdsxRMRv3At5rx6sgsO0bIwuZ1pa+iEuUW58SbhemsyhlVe9T1pYvOdbMxcEQqvk6VPP+HgtnzUeRJFj2e6VnsBI1adMafSTOVCskBL1X8isEnohjDtqw7z1KwzIryQOaYyHNZkaGrcYJ5yyjFkNbAkQr7rCFtSeZf4W5p+BgpKvMF/6/I2kNFXKdMy98TdpFBXevQWKPeofbDifMPOXrxgHIZfyB2ii4jcd0OyfgFfvHx1evrr6emrF69/fXN88jqfdDGIAK03hEL6kDPXFZgNpCooSuPmQo4v8MRvOmpLJw+0Y10R0EgXCZ5/PjsboXvxk4beQXsHvxMca0VqSSTpw4LZ2pd+x/m6gfG8Y9Nwhe/QTxV6rmCERZozInyURNGYOusNfzjIbbL9uB0/idyTa0HpGqknfUtIhGD8uZ1n9mphFHOYkra0hlW8VA6g2t9KT34UYyoRtZuVhJI5+0kYIsYWSRQ9iJ0exnm0J+nXlja2UxSDrM48ONE0TYqdqqwjixCrA0KF+YSwEDSkS7UNvsahZjmVmsbwNkJqQDKfAH/ijRzVVhJVjEiLmeK/xfBzZ6zZPG6qj5JeQbaS5w8GdZHI/gWki0G2zoj/LXQL6bW5DQmHfdDGwAJHv4HfgLnvbFcT9kFfBcQRWQKZzKtoWf64hg/Z8SBDMcNcrNg55LBAw1gaUjDQxuAMtEM1X8UUk6qrpf+VTSf4u2CVweQJelWNoI1/+aXwQJXKQGeJMmVXFcT4ipJ70J4VXhSLHjJG7vgRQps6/eZIxVWg6yIqFJYraeeV0JBfZdQei14KFD59Ltq0cCY7Eng0P8QxL5KPInKP5imkqsAeHRYxtleDMMxGmGLhyALHtdYtpj7Kp/43aSA1gZaABV4Sy2jYUG+mJtDtdnNj/a9KmOy1NLyB7QfOBzeQdzI6MeE43tZK2R5NkQwOamGgOUhiZm5b8uwkv+1S4NmqteBOqr0GUxZ/Qr0HVay/UpQIdhDdFLxq2W+tIvnPUwt/ztcVTJjIMag2KBmiVsxWMcOwGUOUd85xhBwZv+6+TJtO1QQ9ERfu7OQfP06rTiQ0n0Ii8VTdZVRK1/OrNncRtehaw7sER/ORPODXzLUfP0hDG10zfACt95eD4dmNPz4Prm3PyQ+n0wNsMApueuqukz57bx129QPJp06I9CxfZwe3hkxWjbASkt1jLo9rDAxTh63jN29ev2yBb+mgWsdvj35tGUuhdXL08tVbEyLiLDw5OjkpQp2+/LUAdfLyfQHiW3smtyoJ+WtLHTOKZxECrZdHL3990/qRozc0KuQk9TnWjrX02uCwunu/puTOibycKtN43RYCpG51D8hZYXLKxfdaI5vAhKH/vEmugnraRFfT+E+fWVdd+u7kjTDy2G/eGcedvBWrY0644Ymf4IXbOYesPeJJ6CP3HY77mP4Uao/Ei5/CFTr4acRCH9ue3jj2xQIp3CVNXa4++X+uyp3iv5gjitc62L9Hsl9now9O8B2KHtLePNk/YPbVHcntFkZRmXpXX12/Vy1gHDEunNUeAO37oge3Ktz6XiG80MYDjDZDGQgZU+0NzspTv93meFahruegyPmsLJ+w610r8FrQXA5p4+N4i2ttTR6Xh9oHt4IGIHFFq2MXFIZ8Brb7zWo1oSHFq3e63a+sElCvE2lg1ezSFkjZPOJNchF1Mb67yU4Uu4SGK8S4PKmZUCKLDLmwPfmhjkzB5mxL/iIMhjG4RfK3DoBABJtg6g26AHWX3ecAtNJKZHUbrtHgmH5g9MXdUfeo++p1dROkelfT/6iliAGK5xuCY36mxfgJKbSKr5FaP0KhxsJLWxEbbEM11VXPEBLJgFxCrRctwIjRfXumZhYcd4EOw8AtWsE7TKhq5VI+JVW0hj7pir2o7B5SKWXn9XIZ6Q9CIMbTijkgFKwIX+CvYrjtsNzWaT3SIbqbn6Don4lgOvUGoMlNpKpr9BMGUHFRdOWUyVSwwKHrxHN2jfnqoPWilcXr+5l/vNdTvKHoDqP7Kv+astYeVHMp+dEO+mdDlFjoUavXc13PrNrSZRooeB980lr4vK2pQ9l4CikKiAH2E93XhzJqOvpJyQuC75WQdRcusH6uZXdLisOK2EPs2MUHv1SIsGeqdWtv3G1O90Ew7o/BwS3CEcKrBMbLQ3CmG3P1h9tE/o4X+mvE0jV4E+GpKVLfdjDWdqk/X2XUmekVhsA5orKf+u5m/stNN/1L9YnLH6vdaB100bHeCM96o11r1dICHfVp522ZCkYjgdBcZs5W+itLG0dLgzr5F23jkYVkdBU1W0vXU50EB6b4z6skPcxsXNZQdnKIjER3aF5y1vCLusTwb/WR/0I09YSoaTsyKvwuxNhOSUCnOCVlY8tyAyNNkE912G+mAKCjQ/osti/kQ0Ud/CWlp1SPO5eeKilsN/GotivZNmG13HghlwImMYyMZVnqz9luQy5QkelmWmUymLC0wcz6lLZPjBcLhvjns7MpD0fkvhuQaYy/ijdmy50+yG3rVEe8tiqa/lsPDw8PneGwM5+D9+/P1uszxrqLxaKVNoRHkPHiPYjC47SZDVjgaGvsxZsSQgGtVkEDJeLlexfbgAa79oE8HcdrxDYwBh1l+jWsnXheUEWhZbziuke7IELdzQ+ToiJlVoDLVDsFc9J6NFevBQ5QuCLFh9/Fsr1DlAek8zvL9lV97UI8ARb4u6JmlHPeE8ZlX+IZaLVRfHeWdqrE4mG+IFoDYwoksDknVYDpFBSAs4cGgg6WzTGfba+oH3utv1cNSavCfLitCoX4P4zE+iS4ShXZvRQpcdVUmlKPN0gNxZ2b8OZjAzrN/s5A67h7fGS+Kii1ZAsmnJN5ATVX+a8GkKFAQyNFBSrbG6v7Q6ZSvsuqmPDcsknjW+qZSveofrS/FV3Oj64gotpX7Esf3OMoApxCedCZ3yqszuDStsO5LtPl9051M3rdrcy9fZG9/Z7ECBwfi/1dxFldAH5PRJJEddYlWxFzUe4RuIex3PlW8A6BRXqRNCJLHIp0S/UgcrK3D1DMEiqiQMjlHdNq+bEq/8u7DPLU5B7J3DojraUg0Rz0+iOZ+u1nF8HSXY0hrvSglJ7dZcx8StWdVU05v/wqr9fK/3uHnAMR0K03PJ2AbViwkNeN5DfOFmqgC4gjBrCm0DQIo3tBxkQdLSIryPiXbNDZTWFB8ud36fT+725U0k6dusPX058lcQ0xl8eLNUez7U1xrtNbHlZJEeWD3OMdDnL3gSwN0bWabW2rwu/dRpitRFgbo5DjO8wfxKTXGP0tWhCK5NdXi+2RsjExPxutuHaRfrwSWOmB/zW69XSdoTOlOK/5tL8VxvvjRe4LXqwQjPjqz5ZsYX0HGQ4nkMpbWnKvJwn3UQhOS31OpUsm1ZLJMMxSJ+rZw67PIU+YPGIsoMlApoAqUs+To6OqBgpj33dSnatkoqD14jx3W7qNaZT2Hpp/bimCXwpPjctI1d0fpYEeFd6aIn4NkWqNvV/hSDhSecGNkwaDKYkOMhrq0mjNQKQSZ90MuOtpESuvZVVOVBW2OWkmBfO61l5BBqwKBzU9MPvAXeg1I498n7hsnhf8qelLTSYNy990YAWcohFstaaC2raGsi8yFAO2I9+aTz5UC6xQd01Z9SaSfwtiDfFWsX9SDg7EJnbWJF5LhSXFzVZubeweblTkob5woT8NPPUGeW1YfhwUUbzAxjcsCszzXbB0Je8v2ffya32F/UF9/SCtfRhA8rWw4/9zYDxOaz3GBy5u8ljqRgRT31ODvREWq9/eyM9tHBa3j2v0TB1x3cLb6EGGPjgGk+Q2wiEII5LMM+D0/D0X17QpMwGssiu5Dst3vFL+IlAzWD4Ht4nczERQFz/jWUGucs7AA8obkCQLYDUHMZ2CU8vtrekDJh1zsWYoDZ8gMZWzD3QNK7XOgkmmx5LVFpkq91Ht1n1g5VDf2y6YUIS/oHxnrgvKX/ytaC+1pppf96n/7MrzpoWttJWX1R8dbC2bHYZbc/j0E4OtUfkOQ1WGUbGmio3Eyopl0AP0DSsPhYTOLfXLp6PPh+pOiPmy1DX9N6MZ3ATriogtvT+5IOB7AUlBZzGDVUTNXuxtdR9mr1S8+lwIXiCTbexuHCOa/XooixzfROLbxi3wN/A2C2UMAt/rRib7LP43AAD//1BLBwh1Fvl59B0AAJZxAABQSwMEFAAIAAgAAAAAAAAAAAAAAAAAAAAAABQAAAB3aW5kb3dzL3NlbmRsb2dzLnBzMaxTT0/bThC976eY35JDIv3s2EFEhdYtNKVglT8Rhkot5bCNJ/aK9a61O3ZbIb57tTYhUEDqoXvyzLx5M29m/GaDAQCE2ZeT03mWZp3l30WtjMgdCFCmgO+NzhUCGaASoTSOYGksWCQrsRUKWingoEFHn4+PTOFC1tN+2M9mZ+n8PD09+bfM/p2La/Q0tbCiQkILZgkCvqZzWEqFoEXVETddwf/hRykXJUgHDjWtKh4aR3sFarqn9QV9ZNxWXeDIFIA6r43UFLKNt+xyVuUK6b3UudTFcHTFug6GHcOlIyt1cdUZg7mgko0Yk0sY/jc8R0eBd/WB0QhuOphFaqxmt4wNDoxQGQnCPVs4SGC3R/BjpNLkPOEHSPx177uwkie8JKp3xuN4+iqcbobxZDuMp+NKLEqpcfxuYao6KYxQzpOuMg9R5GgdT3Zv+M+gckGL1kmjecInUTwJ4jjYjPgtu33QECQwGKa6NdcYnKGjviPYfdTxKLw3GRv0m35Jybz5CyU7m5OtyfTBKlYpqf4oFfKkm+RTWffbfEbfVhBtB1F8x7QGLZRETcHCWItKkDRa+j5fwvnz4gnf+5TNsv25agqpX4Kuy0dhHEZPYUaTkBqtL7geeThb+ddfaf5nclsJPxtliiDHWplfFWryRMNnmc6MwlQ7EnqBR9LRI4fHLWXR2E7+nXXi/6PA1UoS8G8hH11G/Xn7A3nmItZr/x0AAP//UEsHCIVf41EhAgAAXgQAAFBLAQIUABQACAAIAAAAAAB1Fvl59B0AAJZxAAAcAAAAAAAAAAAAAAAAAAAAAAB3aW5kb3dzL3dpbmRvd3Njc2VoZWxwZXIucHMxUEsBAhQAFAAIAAgAAAAAAIVf41EhAgAAXgQAABQAAAAAAAAAAAAAAAAAPh4AAHdpbmRvd3Mvc2VuZGxvZ3MucHMxUEsFBgAAAAACAAIAjAAAAKEgAAAAAA==" +$zippedFiles = "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" $global:KubeClusterConfigPath = "c:\k\kubeclusterconfig.json" $fipsEnabled = [System.Convert]::ToBoolean("false") @@ -217,6 +217,7 @@ $global:WindowsCiliumInstallPath = Join-Path -Path $global:WindowsCiliumNetworki # Network isolated cluster $global:BootstrapProfileContainerRegistryServer="" $global:MCRRepositoryBase="mcr.microsoft.com/" +$global:NetworkIsolatedClusterTestMode = [System.Convert]::ToBoolean("false"); # for ab e2e only for local ab test with remote cse package $global:OrasCacheDir="c:\aks-tools\oras\" # refer to components.json $global:OrasPath="c:\aks-tools\oras\oras.exe" @@ -240,36 +241,58 @@ try { $global:OperationId = New-Guid if (-not (Test-Path "C:\AzureData\windows\azurecnifunc.ps1")) { - # Determine the CSE package URL - $WindowsCSEScriptsPackage = "aks-windows-cse-scripts-current.zip" # CSEScriptsPackage is cached on VHD. Previously the cse package version was managed in components.json, whereas RP set the package URL which is a storage account. - # From 2025-06 The CSE packages is eleased on the VHD. RP can use fully qualified URL to download CSE scripts package when required out of VHD release cycle. + # From 2025-06 The CSE packages is released on the VHD. RP can use fully qualified URL to download CSE scripts package when required out of VHD release cycle. # In the transition period, it is important that when deal with older VHD versions, the agentbaker runtime provision script needs to be compatible with the latest known storage account package, 0.0.52. - Write-Log "Requested CSEScriptsPackageUrl is $global:CSEScriptsPackageUrl" - if ($global:CSEScriptsPackageUrl.EndsWith("/")) { - $search = @() - if ($global:CacheDir -and (Test-Path $global:CacheDir)) { - $search = [IO.Directory]::GetFiles($global:CacheDir, $WindowsCSEScriptsPackage, [IO.SearchOption]::AllDirectories) - # list files in the cache directory. - Write-Log "the directory $global:CacheDir contains the following files:" - Get-ChildItem -Path $global:CacheDir | ForEach-Object { Write-Log " $_" } + + $WindowsCSEScriptsPackage = "aks-windows-cse-scripts-current.zip" + $scriptsZip = $null + $shouldCleanup = $false + + # Step 1: Try to find cached scripts on VHD + if ($global:CacheDir -and (Test-Path $global:CacheDir)) { + $searchCachedScripts = [IO.Directory]::GetFiles($global:CacheDir, $WindowsCSEScriptsPackage, [IO.SearchOption]::AllDirectories) + Write-Log "the directory $global:CacheDir contains the following files:" + Get-ChildItem -Path $global:CacheDir | ForEach-Object { Write-Log " $_" } + if ($searchCachedScripts.Count -gt 0) { + $scriptsZip = $searchCachedScripts[0] + Write-Log "Found cached CSE scripts at $scriptsZip" } + } - if ($search.Count -eq 0) { - Write-Log "Could not find windows cse package on VHD. Use remote version instead." - $WindowsCSEScriptsPackage = "aks-windows-cse-scripts-v0.0.52.zip" + # Step 2: For non-network-isolated clusters, download scripts if needed (overrides cached version when appropriate) + $isNetworkIsolated = -not [string]::IsNullOrWhiteSpace($global:BootstrapProfileContainerRegistryServer) -and -not $global:NetworkIsolatedClusterTestMode + if (-not $isNetworkIsolated) { + Write-Log "Requested CSEScriptsPackageUrl is $global:CSEScriptsPackageUrl" + if ($global:CSEScriptsPackageUrl.EndsWith("/")) { + if (-not $scriptsZip) { + Write-Log "Could not find windows cse package on VHD. Use remote version instead." + $WindowsCSEScriptsPackage = "aks-windows-cse-scripts-v0.0.52.zip" + } + Write-Log "WindowsCSEScriptsPackage is $WindowsCSEScriptsPackage" + $global:CSEScriptsPackageUrl = $global:CSEScriptsPackageUrl + $WindowsCSEScriptsPackage } - Write-Log "WindowsCSEScriptsPackage is $WindowsCSEScriptsPackage" - $global:CSEScriptsPackageUrl = $global:CSEScriptsPackageUrl + $WindowsCSEScriptsPackage + Write-Log "CSEScriptsPackageUrl used for provision is $global:CSEScriptsPackageUrl" + + # Download CSE function scripts + $downloadedFile = 'c:\csescripts.zip' + Logs-To-Event -TaskName "AKS.WindowsCSE.DownloadAndExpandCSEScriptPackageUrl" -TaskMessage "Start to get CSE scripts. CSEScriptsPackageUrl: $global:CSEScriptsPackageUrl" + DownloadFileOverHttp -Url $global:CSEScriptsPackageUrl -DestinationPath $downloadedFile -ExitCode $global:WINDOWS_CSE_ERROR_DOWNLOAD_CSE_PACKAGE + $scriptsZip = $downloadedFile + $shouldCleanup = $true + } else { + Write-Log "Network isolated cluster detected (BootstrapProfileContainerRegistryServer is set), skip CSE scripts download and use cached scripts" + if (-not $scriptsZip) { + Set-ExitCode -ExitCode $global:WINDOWS_CSE_ERROR_NETWORK_ISOLATED_CLUSTER_CSE_NOT_CACHED -ErrorMessage "Cached CSE scripts package '$WindowsCSEScriptsPackage' not found under cache directory '$global:CacheDir'" + } + } + + # Step 3: Extract scripts from the resolved zip + Write-Log "Extracting CSE scripts from $scriptsZip" + AKS-Expand-Archive -Path $scriptsZip -DestinationPath "C:\\AzureData\\windows" + if ($shouldCleanup) { + Remove-Item -Path $scriptsZip -Force } - Write-Log "CSEScriptsPackageUrl used for provision is $global:CSEScriptsPackageUrl" - - # Download CSE function scripts - Logs-To-Event -TaskName "AKS.WindowsCSE.DownloadAndExpandCSEScriptPackageUrl" -TaskMessage "Start to get CSE scripts. CSEScriptsPackageUrl: $global:CSEScriptsPackageUrl" - $tempfile = 'c:\csescripts.zip' - DownloadFileOverHttp -Url $global:CSEScriptsPackageUrl -DestinationPath $tempfile -ExitCode $global:WINDOWS_CSE_ERROR_DOWNLOAD_CSE_PACKAGE - AKS-Expand-Archive -Path $tempfile -DestinationPath "C:\\AzureData\\windows" - Remove-Item -Path $tempfile -Force } else { Write-Log "CSE scripts already exist, skipping download" } diff --git a/pkg/agent/testdata/AKSWindows23H2Gen2+NextGenNetworking/CustomData b/pkg/agent/testdata/AKSWindows23H2Gen2+NextGenNetworking/CustomData index 3b664ef0ea1..013767089ff 100644 --- a/pkg/agent/testdata/AKSWindows23H2Gen2+NextGenNetworking/CustomData +++ b/pkg/agent/testdata/AKSWindows23H2Gen2+NextGenNetworking/CustomData @@ -188,7 +188,7 @@ $global:AKSAADServerAppID = "6dae42f8-4368-4678-94ff-3960e28e3630" $global:IsDisableWindowsOutboundNat = [System.Convert]::ToBoolean("false"); # Base64 representation of ZIP archive -$zippedFiles = "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" +$zippedFiles = "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" $global:KubeClusterConfigPath = "c:\k\kubeclusterconfig.json" $fipsEnabled = [System.Convert]::ToBoolean("false") @@ -217,6 +217,7 @@ $global:WindowsCiliumInstallPath = Join-Path -Path $global:WindowsCiliumNetworki # Network isolated cluster $global:BootstrapProfileContainerRegistryServer="" $global:MCRRepositoryBase="mcr.microsoft.com/" +$global:NetworkIsolatedClusterTestMode = [System.Convert]::ToBoolean("false"); # for ab e2e only for local ab test with remote cse package $global:OrasCacheDir="c:\aks-tools\oras\" # refer to components.json $global:OrasPath="c:\aks-tools\oras\oras.exe" @@ -240,36 +241,58 @@ try { $global:OperationId = New-Guid if (-not (Test-Path "C:\AzureData\windows\azurecnifunc.ps1")) { - # Determine the CSE package URL - $WindowsCSEScriptsPackage = "aks-windows-cse-scripts-current.zip" # CSEScriptsPackage is cached on VHD. Previously the cse package version was managed in components.json, whereas RP set the package URL which is a storage account. - # From 2025-06 The CSE packages is eleased on the VHD. RP can use fully qualified URL to download CSE scripts package when required out of VHD release cycle. + # From 2025-06 The CSE packages is released on the VHD. RP can use fully qualified URL to download CSE scripts package when required out of VHD release cycle. # In the transition period, it is important that when deal with older VHD versions, the agentbaker runtime provision script needs to be compatible with the latest known storage account package, 0.0.52. - Write-Log "Requested CSEScriptsPackageUrl is $global:CSEScriptsPackageUrl" - if ($global:CSEScriptsPackageUrl.EndsWith("/")) { - $search = @() - if ($global:CacheDir -and (Test-Path $global:CacheDir)) { - $search = [IO.Directory]::GetFiles($global:CacheDir, $WindowsCSEScriptsPackage, [IO.SearchOption]::AllDirectories) - # list files in the cache directory. - Write-Log "the directory $global:CacheDir contains the following files:" - Get-ChildItem -Path $global:CacheDir | ForEach-Object { Write-Log " $_" } + + $WindowsCSEScriptsPackage = "aks-windows-cse-scripts-current.zip" + $scriptsZip = $null + $shouldCleanup = $false + + # Step 1: Try to find cached scripts on VHD + if ($global:CacheDir -and (Test-Path $global:CacheDir)) { + $searchCachedScripts = [IO.Directory]::GetFiles($global:CacheDir, $WindowsCSEScriptsPackage, [IO.SearchOption]::AllDirectories) + Write-Log "the directory $global:CacheDir contains the following files:" + Get-ChildItem -Path $global:CacheDir | ForEach-Object { Write-Log " $_" } + if ($searchCachedScripts.Count -gt 0) { + $scriptsZip = $searchCachedScripts[0] + Write-Log "Found cached CSE scripts at $scriptsZip" } + } - if ($search.Count -eq 0) { - Write-Log "Could not find windows cse package on VHD. Use remote version instead." - $WindowsCSEScriptsPackage = "aks-windows-cse-scripts-v0.0.52.zip" + # Step 2: For non-network-isolated clusters, download scripts if needed (overrides cached version when appropriate) + $isNetworkIsolated = -not [string]::IsNullOrWhiteSpace($global:BootstrapProfileContainerRegistryServer) -and -not $global:NetworkIsolatedClusterTestMode + if (-not $isNetworkIsolated) { + Write-Log "Requested CSEScriptsPackageUrl is $global:CSEScriptsPackageUrl" + if ($global:CSEScriptsPackageUrl.EndsWith("/")) { + if (-not $scriptsZip) { + Write-Log "Could not find windows cse package on VHD. Use remote version instead." + $WindowsCSEScriptsPackage = "aks-windows-cse-scripts-v0.0.52.zip" + } + Write-Log "WindowsCSEScriptsPackage is $WindowsCSEScriptsPackage" + $global:CSEScriptsPackageUrl = $global:CSEScriptsPackageUrl + $WindowsCSEScriptsPackage } - Write-Log "WindowsCSEScriptsPackage is $WindowsCSEScriptsPackage" - $global:CSEScriptsPackageUrl = $global:CSEScriptsPackageUrl + $WindowsCSEScriptsPackage + Write-Log "CSEScriptsPackageUrl used for provision is $global:CSEScriptsPackageUrl" + + # Download CSE function scripts + $downloadedFile = 'c:\csescripts.zip' + Logs-To-Event -TaskName "AKS.WindowsCSE.DownloadAndExpandCSEScriptPackageUrl" -TaskMessage "Start to get CSE scripts. CSEScriptsPackageUrl: $global:CSEScriptsPackageUrl" + DownloadFileOverHttp -Url $global:CSEScriptsPackageUrl -DestinationPath $downloadedFile -ExitCode $global:WINDOWS_CSE_ERROR_DOWNLOAD_CSE_PACKAGE + $scriptsZip = $downloadedFile + $shouldCleanup = $true + } else { + Write-Log "Network isolated cluster detected (BootstrapProfileContainerRegistryServer is set), skip CSE scripts download and use cached scripts" + if (-not $scriptsZip) { + Set-ExitCode -ExitCode $global:WINDOWS_CSE_ERROR_NETWORK_ISOLATED_CLUSTER_CSE_NOT_CACHED -ErrorMessage "Cached CSE scripts package '$WindowsCSEScriptsPackage' not found under cache directory '$global:CacheDir'" + } + } + + # Step 3: Extract scripts from the resolved zip + Write-Log "Extracting CSE scripts from $scriptsZip" + AKS-Expand-Archive -Path $scriptsZip -DestinationPath "C:\\AzureData\\windows" + if ($shouldCleanup) { + Remove-Item -Path $scriptsZip -Force } - Write-Log "CSEScriptsPackageUrl used for provision is $global:CSEScriptsPackageUrl" - - # Download CSE function scripts - Logs-To-Event -TaskName "AKS.WindowsCSE.DownloadAndExpandCSEScriptPackageUrl" -TaskMessage "Start to get CSE scripts. CSEScriptsPackageUrl: $global:CSEScriptsPackageUrl" - $tempfile = 'c:\csescripts.zip' - DownloadFileOverHttp -Url $global:CSEScriptsPackageUrl -DestinationPath $tempfile -ExitCode $global:WINDOWS_CSE_ERROR_DOWNLOAD_CSE_PACKAGE - AKS-Expand-Archive -Path $tempfile -DestinationPath "C:\\AzureData\\windows" - Remove-Item -Path $tempfile -Force } else { Write-Log "CSE scripts already exist, skipping download" } diff --git a/pkg/agent/testdata/AKSWindows23H2Gen2+NextGenNetworkingDisabled/CustomData b/pkg/agent/testdata/AKSWindows23H2Gen2+NextGenNetworkingDisabled/CustomData index c8ec723f8f1..1f80c63e1ea 100644 --- a/pkg/agent/testdata/AKSWindows23H2Gen2+NextGenNetworkingDisabled/CustomData +++ b/pkg/agent/testdata/AKSWindows23H2Gen2+NextGenNetworkingDisabled/CustomData @@ -188,7 +188,7 @@ $global:AKSAADServerAppID = "6dae42f8-4368-4678-94ff-3960e28e3630" $global:IsDisableWindowsOutboundNat = [System.Convert]::ToBoolean("false"); # Base64 representation of ZIP archive -$zippedFiles = "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" +$zippedFiles = "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" $global:KubeClusterConfigPath = "c:\k\kubeclusterconfig.json" $fipsEnabled = [System.Convert]::ToBoolean("false") @@ -217,6 +217,7 @@ $global:WindowsCiliumInstallPath = Join-Path -Path $global:WindowsCiliumNetworki # Network isolated cluster $global:BootstrapProfileContainerRegistryServer="" $global:MCRRepositoryBase="mcr.microsoft.com/" +$global:NetworkIsolatedClusterTestMode = [System.Convert]::ToBoolean("false"); # for ab e2e only for local ab test with remote cse package $global:OrasCacheDir="c:\aks-tools\oras\" # refer to components.json $global:OrasPath="c:\aks-tools\oras\oras.exe" @@ -240,36 +241,58 @@ try { $global:OperationId = New-Guid if (-not (Test-Path "C:\AzureData\windows\azurecnifunc.ps1")) { - # Determine the CSE package URL - $WindowsCSEScriptsPackage = "aks-windows-cse-scripts-current.zip" # CSEScriptsPackage is cached on VHD. Previously the cse package version was managed in components.json, whereas RP set the package URL which is a storage account. - # From 2025-06 The CSE packages is eleased on the VHD. RP can use fully qualified URL to download CSE scripts package when required out of VHD release cycle. + # From 2025-06 The CSE packages is released on the VHD. RP can use fully qualified URL to download CSE scripts package when required out of VHD release cycle. # In the transition period, it is important that when deal with older VHD versions, the agentbaker runtime provision script needs to be compatible with the latest known storage account package, 0.0.52. - Write-Log "Requested CSEScriptsPackageUrl is $global:CSEScriptsPackageUrl" - if ($global:CSEScriptsPackageUrl.EndsWith("/")) { - $search = @() - if ($global:CacheDir -and (Test-Path $global:CacheDir)) { - $search = [IO.Directory]::GetFiles($global:CacheDir, $WindowsCSEScriptsPackage, [IO.SearchOption]::AllDirectories) - # list files in the cache directory. - Write-Log "the directory $global:CacheDir contains the following files:" - Get-ChildItem -Path $global:CacheDir | ForEach-Object { Write-Log " $_" } + + $WindowsCSEScriptsPackage = "aks-windows-cse-scripts-current.zip" + $scriptsZip = $null + $shouldCleanup = $false + + # Step 1: Try to find cached scripts on VHD + if ($global:CacheDir -and (Test-Path $global:CacheDir)) { + $searchCachedScripts = [IO.Directory]::GetFiles($global:CacheDir, $WindowsCSEScriptsPackage, [IO.SearchOption]::AllDirectories) + Write-Log "the directory $global:CacheDir contains the following files:" + Get-ChildItem -Path $global:CacheDir | ForEach-Object { Write-Log " $_" } + if ($searchCachedScripts.Count -gt 0) { + $scriptsZip = $searchCachedScripts[0] + Write-Log "Found cached CSE scripts at $scriptsZip" } + } - if ($search.Count -eq 0) { - Write-Log "Could not find windows cse package on VHD. Use remote version instead." - $WindowsCSEScriptsPackage = "aks-windows-cse-scripts-v0.0.52.zip" + # Step 2: For non-network-isolated clusters, download scripts if needed (overrides cached version when appropriate) + $isNetworkIsolated = -not [string]::IsNullOrWhiteSpace($global:BootstrapProfileContainerRegistryServer) -and -not $global:NetworkIsolatedClusterTestMode + if (-not $isNetworkIsolated) { + Write-Log "Requested CSEScriptsPackageUrl is $global:CSEScriptsPackageUrl" + if ($global:CSEScriptsPackageUrl.EndsWith("/")) { + if (-not $scriptsZip) { + Write-Log "Could not find windows cse package on VHD. Use remote version instead." + $WindowsCSEScriptsPackage = "aks-windows-cse-scripts-v0.0.52.zip" + } + Write-Log "WindowsCSEScriptsPackage is $WindowsCSEScriptsPackage" + $global:CSEScriptsPackageUrl = $global:CSEScriptsPackageUrl + $WindowsCSEScriptsPackage } - Write-Log "WindowsCSEScriptsPackage is $WindowsCSEScriptsPackage" - $global:CSEScriptsPackageUrl = $global:CSEScriptsPackageUrl + $WindowsCSEScriptsPackage + Write-Log "CSEScriptsPackageUrl used for provision is $global:CSEScriptsPackageUrl" + + # Download CSE function scripts + $downloadedFile = 'c:\csescripts.zip' + Logs-To-Event -TaskName "AKS.WindowsCSE.DownloadAndExpandCSEScriptPackageUrl" -TaskMessage "Start to get CSE scripts. CSEScriptsPackageUrl: $global:CSEScriptsPackageUrl" + DownloadFileOverHttp -Url $global:CSEScriptsPackageUrl -DestinationPath $downloadedFile -ExitCode $global:WINDOWS_CSE_ERROR_DOWNLOAD_CSE_PACKAGE + $scriptsZip = $downloadedFile + $shouldCleanup = $true + } else { + Write-Log "Network isolated cluster detected (BootstrapProfileContainerRegistryServer is set), skip CSE scripts download and use cached scripts" + if (-not $scriptsZip) { + Set-ExitCode -ExitCode $global:WINDOWS_CSE_ERROR_NETWORK_ISOLATED_CLUSTER_CSE_NOT_CACHED -ErrorMessage "Cached CSE scripts package '$WindowsCSEScriptsPackage' not found under cache directory '$global:CacheDir'" + } + } + + # Step 3: Extract scripts from the resolved zip + Write-Log "Extracting CSE scripts from $scriptsZip" + AKS-Expand-Archive -Path $scriptsZip -DestinationPath "C:\\AzureData\\windows" + if ($shouldCleanup) { + Remove-Item -Path $scriptsZip -Force } - Write-Log "CSEScriptsPackageUrl used for provision is $global:CSEScriptsPackageUrl" - - # Download CSE function scripts - Logs-To-Event -TaskName "AKS.WindowsCSE.DownloadAndExpandCSEScriptPackageUrl" -TaskMessage "Start to get CSE scripts. CSEScriptsPackageUrl: $global:CSEScriptsPackageUrl" - $tempfile = 'c:\csescripts.zip' - DownloadFileOverHttp -Url $global:CSEScriptsPackageUrl -DestinationPath $tempfile -ExitCode $global:WINDOWS_CSE_ERROR_DOWNLOAD_CSE_PACKAGE - AKS-Expand-Archive -Path $tempfile -DestinationPath "C:\\AzureData\\windows" - Remove-Item -Path $tempfile -Force } else { Write-Log "CSE scripts already exist, skipping download" } diff --git a/pkg/agent/testdata/AKSWindows23H2Gen2+NextGenNetworkingNoConfig/CustomData b/pkg/agent/testdata/AKSWindows23H2Gen2+NextGenNetworkingNoConfig/CustomData index 8e9e5b3eba8..8d0639d5176 100644 --- a/pkg/agent/testdata/AKSWindows23H2Gen2+NextGenNetworkingNoConfig/CustomData +++ b/pkg/agent/testdata/AKSWindows23H2Gen2+NextGenNetworkingNoConfig/CustomData @@ -188,7 +188,7 @@ $global:AKSAADServerAppID = "6dae42f8-4368-4678-94ff-3960e28e3630" $global:IsDisableWindowsOutboundNat = [System.Convert]::ToBoolean("false"); # Base64 representation of ZIP archive -$zippedFiles = "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" +$zippedFiles = "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" $global:KubeClusterConfigPath = "c:\k\kubeclusterconfig.json" $fipsEnabled = [System.Convert]::ToBoolean("false") @@ -217,6 +217,7 @@ $global:WindowsCiliumInstallPath = Join-Path -Path $global:WindowsCiliumNetworki # Network isolated cluster $global:BootstrapProfileContainerRegistryServer="" $global:MCRRepositoryBase="mcr.microsoft.com/" +$global:NetworkIsolatedClusterTestMode = [System.Convert]::ToBoolean("false"); # for ab e2e only for local ab test with remote cse package $global:OrasCacheDir="c:\aks-tools\oras\" # refer to components.json $global:OrasPath="c:\aks-tools\oras\oras.exe" @@ -240,36 +241,58 @@ try { $global:OperationId = New-Guid if (-not (Test-Path "C:\AzureData\windows\azurecnifunc.ps1")) { - # Determine the CSE package URL - $WindowsCSEScriptsPackage = "aks-windows-cse-scripts-current.zip" # CSEScriptsPackage is cached on VHD. Previously the cse package version was managed in components.json, whereas RP set the package URL which is a storage account. - # From 2025-06 The CSE packages is eleased on the VHD. RP can use fully qualified URL to download CSE scripts package when required out of VHD release cycle. + # From 2025-06 The CSE packages is released on the VHD. RP can use fully qualified URL to download CSE scripts package when required out of VHD release cycle. # In the transition period, it is important that when deal with older VHD versions, the agentbaker runtime provision script needs to be compatible with the latest known storage account package, 0.0.52. - Write-Log "Requested CSEScriptsPackageUrl is $global:CSEScriptsPackageUrl" - if ($global:CSEScriptsPackageUrl.EndsWith("/")) { - $search = @() - if ($global:CacheDir -and (Test-Path $global:CacheDir)) { - $search = [IO.Directory]::GetFiles($global:CacheDir, $WindowsCSEScriptsPackage, [IO.SearchOption]::AllDirectories) - # list files in the cache directory. - Write-Log "the directory $global:CacheDir contains the following files:" - Get-ChildItem -Path $global:CacheDir | ForEach-Object { Write-Log " $_" } + + $WindowsCSEScriptsPackage = "aks-windows-cse-scripts-current.zip" + $scriptsZip = $null + $shouldCleanup = $false + + # Step 1: Try to find cached scripts on VHD + if ($global:CacheDir -and (Test-Path $global:CacheDir)) { + $searchCachedScripts = [IO.Directory]::GetFiles($global:CacheDir, $WindowsCSEScriptsPackage, [IO.SearchOption]::AllDirectories) + Write-Log "the directory $global:CacheDir contains the following files:" + Get-ChildItem -Path $global:CacheDir | ForEach-Object { Write-Log " $_" } + if ($searchCachedScripts.Count -gt 0) { + $scriptsZip = $searchCachedScripts[0] + Write-Log "Found cached CSE scripts at $scriptsZip" } + } - if ($search.Count -eq 0) { - Write-Log "Could not find windows cse package on VHD. Use remote version instead." - $WindowsCSEScriptsPackage = "aks-windows-cse-scripts-v0.0.52.zip" + # Step 2: For non-network-isolated clusters, download scripts if needed (overrides cached version when appropriate) + $isNetworkIsolated = -not [string]::IsNullOrWhiteSpace($global:BootstrapProfileContainerRegistryServer) -and -not $global:NetworkIsolatedClusterTestMode + if (-not $isNetworkIsolated) { + Write-Log "Requested CSEScriptsPackageUrl is $global:CSEScriptsPackageUrl" + if ($global:CSEScriptsPackageUrl.EndsWith("/")) { + if (-not $scriptsZip) { + Write-Log "Could not find windows cse package on VHD. Use remote version instead." + $WindowsCSEScriptsPackage = "aks-windows-cse-scripts-v0.0.52.zip" + } + Write-Log "WindowsCSEScriptsPackage is $WindowsCSEScriptsPackage" + $global:CSEScriptsPackageUrl = $global:CSEScriptsPackageUrl + $WindowsCSEScriptsPackage } - Write-Log "WindowsCSEScriptsPackage is $WindowsCSEScriptsPackage" - $global:CSEScriptsPackageUrl = $global:CSEScriptsPackageUrl + $WindowsCSEScriptsPackage + Write-Log "CSEScriptsPackageUrl used for provision is $global:CSEScriptsPackageUrl" + + # Download CSE function scripts + $downloadedFile = 'c:\csescripts.zip' + Logs-To-Event -TaskName "AKS.WindowsCSE.DownloadAndExpandCSEScriptPackageUrl" -TaskMessage "Start to get CSE scripts. CSEScriptsPackageUrl: $global:CSEScriptsPackageUrl" + DownloadFileOverHttp -Url $global:CSEScriptsPackageUrl -DestinationPath $downloadedFile -ExitCode $global:WINDOWS_CSE_ERROR_DOWNLOAD_CSE_PACKAGE + $scriptsZip = $downloadedFile + $shouldCleanup = $true + } else { + Write-Log "Network isolated cluster detected (BootstrapProfileContainerRegistryServer is set), skip CSE scripts download and use cached scripts" + if (-not $scriptsZip) { + Set-ExitCode -ExitCode $global:WINDOWS_CSE_ERROR_NETWORK_ISOLATED_CLUSTER_CSE_NOT_CACHED -ErrorMessage "Cached CSE scripts package '$WindowsCSEScriptsPackage' not found under cache directory '$global:CacheDir'" + } + } + + # Step 3: Extract scripts from the resolved zip + Write-Log "Extracting CSE scripts from $scriptsZip" + AKS-Expand-Archive -Path $scriptsZip -DestinationPath "C:\\AzureData\\windows" + if ($shouldCleanup) { + Remove-Item -Path $scriptsZip -Force } - Write-Log "CSEScriptsPackageUrl used for provision is $global:CSEScriptsPackageUrl" - - # Download CSE function scripts - Logs-To-Event -TaskName "AKS.WindowsCSE.DownloadAndExpandCSEScriptPackageUrl" -TaskMessage "Start to get CSE scripts. CSEScriptsPackageUrl: $global:CSEScriptsPackageUrl" - $tempfile = 'c:\csescripts.zip' - DownloadFileOverHttp -Url $global:CSEScriptsPackageUrl -DestinationPath $tempfile -ExitCode $global:WINDOWS_CSE_ERROR_DOWNLOAD_CSE_PACKAGE - AKS-Expand-Archive -Path $tempfile -DestinationPath "C:\\AzureData\\windows" - Remove-Item -Path $tempfile -Force } else { Write-Log "CSE scripts already exist, skipping download" }