feat(acl): convert ACL VHDs to COSI and publish to PMC#8848
feat(acl): convert ACL VHDs to COSI and publish to PMC#8848adamsanaglo wants to merge 26 commits into
Conversation
Add a post-build pipeline step that converts AzureContainerLinux (ACL) VHD images to COSI format using ImageCustomizer's convert command (v1.2.0-2). Changes: - New script: convert-vhd-to-cosi.sh downloads ACL VHD from blob storage, runs ImageCustomizer convert (VHD -> COSI), and uploads the COSI file - New make target: convert-vhd-to-cosi in packer.mk - Pipeline vars: set IMG_CUSTOMIZER_CONTAINER and IMG_CUSTOMIZER_VERSION on ACL build jobs in both PR and release pipelines - Builder template: add Convert ACL VHD to COSI step after SIG->classic conversion, conditioned on OS_SKU=AzureContainerLinux - Immutable copy: updated to also copy/remove .cosi files for ACL builds Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Move the ACL COSI 'az storage blob copy start' from the VHD immutable copy task into a dedicated task with its own condition gating on OS_SKU=AzureContainerLinux, rather than using a bash if-block inside the VHD copy step. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Move 'Convert ACL VHD to COSI' task to after 'Copy to Immutable Storage Container' so the VHD is safely in immutable storage before conversion. Revert echo to original 'Successfully copied to immutable container'. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Move 'Copy to Immutable Storage Container' (VHD) after 'Copy COSI to Immutable Storage Container'. New order: 1. Convert ACL VHD to COSI 2. Copy COSI to Immutable Storage Container 3. Copy to Immutable Storage Container (VHD) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Use less specific version tag to pick up patch releases automatically. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
SIG_SOURCE_GALLERY_UNIQUE_NAME, SIG_SOURCE_IMAGE_NAME, and SIG_SOURCE_IMAGE_VERSION are set but never consumed by any script or template in the repo. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
FIPS jobs were missing IMG_CUSTOMIZER_CONTAINER and IMG_CUSTOMIZER_VERSION, which are required for the COSI conversion step. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Create generate-cosi-publishing-info.sh that writes cosi-publishing-info.json
with the immutable storage URL and image metadata, paralleling
generate-vhd-publishing-info.sh for VHDs.
Pipeline steps added after 'Copy COSI to Immutable Storage Container':
- Generate COSI Publishing Info (bash, no az-login needed)
- Publish COSI Publishing Info (artifact: cosi-publishing-info-{artifactName})
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Generate cosi-publishing-info.json (with sha256, size, cosi_url, and image metadata) directly in convert-vhd-to-cosi.sh while the COSI artifact is still on disk. Remove the standalone script and make target. Pipeline order: Convert + generate info -> Publish artifact -> Copy to immutable. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
OS_NAME was referenced in cosi-publishing-info.json but never set. ACL COSI artifacts are always Linux, so hardcode it. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The container entrypoint is already 'imagecustomizer', so the first argument should be the subcommand 'convert' directly. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Add an opt-in fallback to convert-vhd-to-cosi.sh so that when the MCR ImageCustomizer image for the requested version is unavailable, the script can pull from a configurable fallback registry (IMG_CUSTOMIZER_CONTAINER_FALLBACK, e.g. ghcr.io/microsoft/imagecustomizer). The fallback is gated by a script param defaulting to off, normalizes major.minor versions to major.minor.0 for GHCR's full semver tags, and is enabled for the ACL COSI conversion step. Bump IMG_CUSTOMIZER_VERSION from 1.4 to 1.5 for ACL jobs. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Include the tag directly in IMG_CUSTOMIZER_CONTAINER (mcr.microsoft.com/azurelinux/imagecustomizer:1.5) and IMG_CUSTOMIZER_CONTAINER_FALLBACK (ghcr.io/microsoft/imagecustomizer:1.5.0) for the ACL COSI conversion. Drop the separate IMG_CUSTOMIZER_VERSION variable and the major.minor to major.minor.0 normalization from convert-vhd-to-cosi.sh, since both registries now carry fully-qualified tags. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…nnection - convert-vhd-to-cosi.sh: convert+stage only; emit AFD cosi_url + sha1 for aks-rp cosi register - upload-cosi-to-pmc.sh (new) + make target: upload staged COSI under PMC's SC (no az-login dep) - pipeline: Upload COSI to PMC task under COSI_PMC_SERVICE_CONNECTION; drop obsolete COSI immutable-copy step - fix azExitCode masking + set -u guards
…y ADO compile-time authz
…copy azcopy cannot infer the service type for a custom *.azurefd.net host and won't send the AAD token to a non-default trusted suffix. Mint a storage-scoped token and PUT the staged .cosi directly to PMC's AFD upload endpoint (AFD passthrough-forwards the Bearer token to the blob origin), matching the proven Nebraska POC. Stream with curl -T to avoid loading a multi-GB COSI into memory.
A single Blob REST PUT is capped at 5000 MiB, so the real converted COSI (>5 GiB) failed with HTTP 413 RequestBodyTooLarge. Replace the curl PUT with a small cmd/cosi-upload Go tool that uses the Azure Blob SDK's UploadFile (16 MiB blocks, concurrency 8), which chunks via Put Block + Put Block List and is not subject to the single-PUT limit. Auth is unchanged (Microsoft Entra via the AzureCLI@2 login); AFD forwards the bearer token to the blob origin. azblob/azidentity are pinned to the versions already used by the e2e module.
|
@adamsanaglo please read the following Contributor License Agreement(CLA). If you agree with the CLA, please reply with the following information.
Contributor License AgreementContribution License AgreementThis Contribution License Agreement (“Agreement”) is agreed to by the party signing below (“You”),
|
There was a problem hiding this comment.
Pull request overview
This PR extends the Azure Container Linux (ACL) VHD → COSI flow by adding a dedicated upload path to PMC via an Azure Front Door (AFD) upload endpoint, wiring the new conversion + upload steps into the VHD builder release pipeline, and introducing a small Go-based uploader that uses Azure Blob SDK block uploads to avoid single-request size limits.
Changes:
- Add an ImageCustomizer-based VHD→COSI conversion script that stages the artifact and emits
cosi-publishing-info.json(includingsha1). - Add a Go CLI (
cmd/cosi-upload) plus a wrapper script to upload large COSI artifacts via chunked block-blob upload using Azure CLI (Entra ID) auth. - Wire new “Convert ACL VHD to COSI” and “Upload COSI to PMC” steps into the builder release template and set ImageCustomizer image variables in pipeline definitions.
Reviewed changes
Copilot reviewed 8 out of 10 changed files in this pull request and generated 2 comments.
Show a summary per file
| File | Description |
|---|---|
vhdbuilder/packer/imagecustomizer/scripts/convert-vhd-to-cosi.sh |
Downloads the staged ACL VHD, converts it to COSI via ImageCustomizer, stages the COSI, and generates cosi-publishing-info.json with hashes. |
vhdbuilder/packer/imagecustomizer/scripts/upload-cosi-to-pmc.sh |
Validates expected environment + artifacts and invokes the Go uploader to push to the PMC AFD upload endpoint. |
cmd/cosi-upload/main.go |
Implements block/chunked upload using azblob with Azure CLI credential for pipeline auth. |
packer.mk |
Adds convert-vhd-to-cosi, build-cosi-upload, and upload-cosi-to-pmc targets used by pipeline steps. |
.pipelines/templates/.builder-release-template.yaml |
Adds pipeline tasks to convert ACL VHD to COSI and upload COSI to PMC, and publishes cosi-publishing-info.json. |
.pipelines/.vsts-vhd-builder.yaml |
Sets ImageCustomizer container image variables (primary + GHCR fallback) for relevant stages. |
.pipelines/.vsts-vhd-builder-release.yaml |
Sets ImageCustomizer container image variables (primary + GHCR fallback) for relevant stages. |
go.mod |
Adds Azure Blob SDK + Azure Identity dependencies required by the new uploader tool. |
go.sum |
Updates module checksums for newly introduced Go dependencies. |
| build-cosi-upload: setup-golang | ||
| @go build -o bin/cosi-upload ./cmd/cosi-upload |
| - task: AzureCLI@2 | ||
| inputs: | ||
| azureSubscription: $(COSI_PMC_SERVICE_CONNECTION) | ||
| scriptType: bash | ||
| scriptLocation: inlineScript |
| required_env_vars=( | ||
| "CAPTURED_SIG_VERSION" | ||
| "AFD_UPLOAD_ENDPOINT" | ||
| "COSI_CONTAINER" | ||
| ) | ||
|
|
||
| for v in "${required_env_vars[@]}" | ||
| do | ||
| if [ -z "${!v:-}" ]; then | ||
| echo "$v was not set!" | ||
| exit 1 | ||
| fi | ||
| done |
| required_env_vars=( | ||
| "DESTINATION_STORAGE_CONTAINER" | ||
| "CAPTURED_SIG_VERSION" | ||
| "IMG_CUSTOMIZER_CONTAINER" | ||
| "AFD_DOWNLOAD_HOSTNAME" | ||
| "COSI_CONTAINER" | ||
| ) | ||
|
|
||
| for v in "${required_env_vars[@]}" | ||
| do | ||
| if [ -z "${!v:-}" ]; then | ||
| echo "$v was not set!" | ||
| exit 1 | ||
| fi | ||
| done |
| shopt -s nullglob | ||
| for f in "${AZCOPY_LOG_LOCATION}"/*.log; do | ||
| echo "Azcopy log file: $f" | ||
| echo "##vso[build.uploadlog]$f" | ||
| if grep -q '"level":"Error"' "$f"; then | ||
| echo "log file $f contains errors" | ||
| echo "##vso[task.logissue type=error]Azcopy log file $f contains errors" | ||
| cat "$f" | ||
| fi | ||
| done | ||
| shopt -u nullglob |
|
|
||
| echo "Pulling ImageCustomizer image ${IMG_CUSTOMIZER_REF}" | ||
| if ! docker pull "${IMG_CUSTOMIZER_REF}"; then | ||
| if [ "${ALLOW_GHCR_FALLBACK,,}" != "true" ]; then |
| fi | ||
|
|
||
| ARCH_LOWER="${ARCHITECTURE:-}" | ||
| if [ "${ARCH_LOWER,,}" = "arm64" ]; then |
| - task: AzureCLI@2 | ||
| inputs: | ||
| azureSubscription: $(VHD_ARM_SERVICE_CONNECTION) | ||
| scriptType: bash | ||
| scriptLocation: inlineScript | ||
| inlineScript: | | ||
| make -f packer.mk convert-vhd-to-cosi | ||
| condition: | |
What this PR does / why we need it:
Builds on the ACL VHD->COSI conversion work to upload the COSI directly to PMC via its AFD upload endpoint under PMC's service connection.
cmd/cosi-upload, a Go tool that uploads via the Azure Blob SDK's chunked block-blob upload to avoid the single Put Blob size limit on large COSI images.upload-cosi-to-pmc.shandpacker.mktargets.convert-vhd-to-cosi.shstages the COSI for upload;cosi-publishing-info.jsonuses the AFD download URL and addssha1.azblobandazidentitydependencies.Which issue(s) this PR fixes:
Fixes #