Skip to content

Promote aclmain 1d0251d to release/3.0 - #83

Draft
SeanDougherty wants to merge 31 commits into
release/3.0from
users/sdougherty/promote-aclmain-1d0251d
Draft

SeanDougherty wants to merge 31 commits into
release/3.0from
users/sdougherty/promote-aclmain-1d0251d

Conversation

@SeanDougherty

Copy link
Copy Markdown

Summary

Promote aclmain through commit 1d0251d to release/3.0.

This brings the accumulated image-build, validation, packaging, SELinux, and documentation changes from aclmain into the release branch. The PR is draft while a targeted replay of two extension-advisory differences completes.

Change Log

  • Add SPDX package manifests for the base image and system extensions.
  • Add and refine SELinux container domains and validation coverage.
  • Move WALinuxAgent integration to the upstream package plus ACL configuration.
  • Improve Azure and ARM64 provisioning validation and diagnostics.
  • Add ACL Template test parity and related UKI/LUKS image-layout updates.
  • Update container-runtime packaging, SDK support, and project documentation.
  • Remove the legacy Flannel wrapper after disabling its obsolete enforcement entries.

Type of Change

  • Image build change (base image, sysexts, OEM images)
  • Package/SPEC update
  • CI/automation change
  • SDK/toolchain update
  • Configuration change
  • Documentation update
  • Bug fix

Does this affect the image build?

  • Yes
  • No

Test Methodology

Validation compared this candidate with a contemporaneous release/3.0 build from commit c915c68. Full test selection includes enforcing, non-enforcing, and context-exempt tests.

Image and Kola validation

Category Candidate Release comparison Result
Azure smoke, AMD64 7/7 7/7 Parity
Azure smoke, ARM64 7/7 7/7 Parity
QEMU smoke, AMD64 5/5 5/5 Parity
QEMU smoke, ARM64 5/5 5/5 Parity
Azure Kola, AMD64 118/124 117/124 Candidate +1
Azure Kola, ARM64 118/124 117/124 Candidate +1
QEMU Kola, AMD64 146/151 145/151 Candidate +1
QEMU Kola, ARM64 119/130 121/134 No candidate-only failure among common identities
GPU validation 2/2 2/2 Parity

Across 529 common Kola identities, 497 passed on both, 28 failed on both, four passed only on the candidate, and none failed only on the candidate.

Kubernetes validation

Category Candidate Release comparison Result
Kubernetes E2E 111/111 112/112 All common identities passed
Candidate-image conformance 444/444 444/444 Parity
Production-image conformance control 444/444 444/444 Parity
Overlay, ARM64 16/16 16/16 Parity
Kubenet, AMD64 15/15 15/15 Parity
Kubenet, ARM64 15/15 15/15 Parity
Custom node, AMD64 16/16 16/16 Parity
Custom node, ARM64 16/16 16/16 Parity
Production route, AMD64 18/18 18/18 Parity
Production route, ARM64 15/15 15/15 Parity

Advisory validation

Category Candidate Release comparison Status
Production-route extension advisories 16/26 16/26 Exact outcome parity
Overlay extension advisories 6/21 8/21 Targeted replay in progress for two differences
Overlay extension functional checks 5/7 5/7 Exact outcome parity

The PR remains draft until the targeted advisory replay completes and the two differing extension checks are classified.

Merge Checklist

  • Image builds successfully with this change
  • Updated packages/SPECs build successfully
  • Relevant Kola tests pass
  • All package sources are available
  • Source files have up-to-date hashes/manifests
  • Documentation has been updated to match changes
  • Ready to merge

Jiri Appl (jiria) and others added 30 commits July 2, 2026 08:10
Adds a docs page covering how to enable kdump on ACL, and fixes an
inaccurate addon path in the build script comments.

- Add `acl/docs/kdump.md` — enable/disable steps, verification, dump
  collection, and how kdump is wired into the image.
- Link the new page from `acl/docs/README.md`.
- Fix stale comments in `build_library/rpm/uki_install.sh` that pointed
  at the non-existent `EFI/Linux/acl.efi.extra.d/`. The ACL UKI is
  `vmlinuz-<kernel_version>.efi`, so the addon must go in the
  version-specific `EFI/Linux/vmlinuz-<kver>.efi.extra.d/`.

Original-PR: 27971

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…-reset (#21)

The support-UKI-mode-by-restoring-firstboot-addon patch hardcoded the UKI
addon dir as /boot/EFI/Linux/acl.efi.extra.d. ACL UKIs now use UAPI naming
(vmlinuz-<version>.efi), so that path never exists - is_uki_mode() always
returned false and flatcar-reset silently skipped re-arming the firstboot
(Ignition) addon on UKI images.

Derive the dir from $(uname -r) so it matches the actual UKI name. All three
uses (is_uki_mode, --stop cleanup, restore) reference the variable, so the
single change fixes the whole flow. Bump coreos-init.spec Release 3 -> 4.

Original-PR: 27985

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Select the QEMU VM boot timeout by architecture instead of a single fixed
180s, fixing flaky arm64 QEMU smoke-test boot failures.

Emulated arm64 (TCG) VMs boot far slower than native amd64. Across recent
builds the "Qemu VM Boot" smoke test runs ~19-28s on amd64 but clusters near
180-250s on arm64, producing marginal-timeout boot failures at the 180s ceiling.

- validate/validate_common.sh: add per-arch defaults VM_BOOT_TIMEOUT_AMD64=100
  and VM_BOOT_TIMEOUT_ARM64=300; VM_BOOT_TIMEOUT now defaults to empty and a new
  resolve_boot_timeout() (called at the top of validate_main) picks the value
  from BOARD. An explicit VM_BOOT_TIMEOUT env var or --boot-timeout flag still
  overrides.
- build_rpm_image.sh: default left empty; only forwards --boot-timeout to the
  validate script when explicitly set, keeping validate_common.sh the single
  source of truth.
- Update help/usage docs in the three affected scripts.

Original-PR: 27944

Co-authored-by: Jiri Appl <Jiri.Appl@microsoft.com>
…23)

Enable acl.kdump and acl.kdump.grub as enforcing kola tests, with
bootloader/platform exceptions: acl.kdump requires UKI boot (addon-based
crashkernel, so GRUB is excepted), and acl.kdump.grub targets GRUB images
only (excepted on UKI and on azure where /oem/grub.cfg does not persist).

Also harden the crash kernel config in build_image_util.sh:
- dracut_args now exclude "setup-root ignition" so the crash kernel avoids
  dm-verity /usr mounts that trigger emergency.target on aarch64.
- Add KDUMP_COMMANDLINE_APPEND="irqpoll nr_cpus=1 reset_devices" to avoid
  SMP hang on aarch64 and ensure stable device access post-panic.

Original-PR: 27990

Co-authored-by: Mayank Singh <mayansingh@microsoft.com>
… cleaned up (#24)

The Azure smoke test provisions a throwaway VM in its own resource group
and is meant to delete it when the run ends. That delete was silently a
no-op, so RGs leaked.

The pipeline passes buildId / adoProject / arch as --tag values, which
validate_common.sh parses into RESOURCE_TAGS. It then sources
validate_azure.sh, whose top-level `RESOURCE_TAGS=(createdBy=...)` line
overwrote that list, so the RG was tagged only createdBy / purpose /
creationTime. The per-run cleanup deletes RGs matching
buildId && adoProject && arch, matched nothing, and the RG survived.

Make the default assignment conditional so it only seeds createdBy when
no tags were parsed instead of overwriting. The buildId / adoProject /
arch tags now stay on the RG, so the per-run cleanup deletes it
immediately. Standalone use (no --tag) still gets the createdBy default.

Original-PR: 28041

Co-authored-by: Aadhar Agarwal <aadagarwal@microsoft.com>
Add GitHub templates following the pattern used in microsoft/azurelinux:
- PR template with summary, changelog, type of change, test methodology, and merge checklist
- Bug report issue template with environment details
- Feature request issue template

Co-authored-by: Mayank Singh <mayansingh@microsoft.com>
)

- Convert bug report and feature request to GitHub issue forms (.yml) with
  required, structured fields (arch/platform dropdowns, regression, severity)
- Fix feature request label: feature-request (nonexistent) -> enhancement
- Add config.yml with blank_issues_enabled: false to require picking a template
- PR template unchanged

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
#30)

Co-authored-by: Mayank Singh <mayansingh@microsoft.com>
#37)

mantle PR microsoft/azure-container-linux-mantle#32 adds ExcludeDistros: [acl]
to acl.kdump and acl.kdump.grub (AB#22249), so kola no longer selects them on
ACL. kola_enforcing.yaml still listed acl.kdump as enforced with only a
bootloader: [grub] exception, so on the QEMU/amd64 UKI leg with the 'default'
kola filter evaluate_test_results.sh reported it as an enforced test NOT
SELECTED and failed the stage.

Comment out both entries (with the original exception rules preserved) so they
can be restored once the mantle-side ExcludeDistros is dropped.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The pr: trigger only matched aclmain, so PRs targeting release branches
(e.g. release/3.0) got no validation build. Add a release/* wildcard to
the branch include list.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: b2e9b3a2-6af7-4aec-b523-faac80674783
* rpm: skip build-time-only mercurial, subversion and go-md2man

These three are mapped to RPM names in the package catalog but are
installed in no image and no sysext - mercurial and subversion are
version control clients only ever used at build time, and go-md2man
generates man pages during package builds.

Confirmed against the packages.txt artefacts of a production build
(amd64 and arm64, base image plus every sysext): none of the three
appears in any of them.

Map them to SKIP so the catalog reflects reality.

No functional change to any shipped artefact.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: fab45d77-734c-40d0-88ab-1a4d1ac60611

* rpm: drop ncompress and gflags from the image

Both are installed in the production base image today, and neither is
used.

ncompress provides the legacy .Z compress/uncompress pair. It is a
direct RDEPEND of Flatcar's coreos-base/coreos manifest, which is how it
reaches the image, but nothing in ACL invokes it. The only reverse
dependency in Azure Linux is perl-Archive-Extract-Z-uncompress in the
extended repository, which we do not ship.

gflags reaches the image only through coreos-base/update_engine, which
is already SKIPped in this catalog because ACL does not ship
update_engine. Its only Azure Linux reverse dependencies are rocksdb and
glog, neither of which is installed.

This removes two packages from the base image. Nothing else in the
catalog or in acl/ references either name.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: fab45d77-734c-40d0-88ab-1a4d1ac60611

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: fab45d77-734c-40d0-88ab-1a4d1ac60611
The package catalog maps app-admin/ignition and sys-apps/ignition to the
RPM name "ignition", but Azure Linux 3 ships no package by that name -
only ignition-flatcar. Nothing provides, obsoletes or requires the name
"ignition" in any of the base, ms-oss, extended, cloud-native or
ms-non-oss repositories.

The build still works today only because dnf5 resolves the unmatched
spec to the single available ignition-* package. That is incidental
behaviour, not something the catalog should depend on: it hides the
mistake, and it stops being correct on any release where a package
literally named "ignition" exists.

Name the RPM explicitly.

Verified against a production build: build_image passes the literal
string "ignition" to dnf5, and ignition-flatcar-2.22.0-5 is listed under
the transaction's top-level "Installing:" section, so the substitution is
performed by dnf5 rather than by a dependency or a Provides.

No functional change - the same package is installed either way.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: fab45d77-734c-40d0-88ab-1a4d1ac60611
Azure Linux ships xz-compressed RPM payloads, but rpm only advertises the
rpmlib(PayloadIsXz) capability when built with the lzma USE flag, which is
off by default upstream. Without it, installing those packages fails with a
missing-dependency error.

Set the flags in the SDK target profile rather than in Dockerfile.sdk-update
so they apply both when a fresh SDK image is bootstrapped and when an
existing one is updated. Also enable bzip2 for rpmlib(PayloadIsBzip2), and
pin caps, which is needed to apply file capabilities from Azure Linux
packages.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8d938d41-62cb-43ad-9422-864d07815eb2
* fix: use Azure Linux containerd config for RPM images

Use the containerd2 RPM configuration as the containerd configuration
source in RPM builds, so containerd no longer ignores the intended config.

- Preserve the Flatcar configuration asset for Portage builds.
- Relocate the Azure Linux config from /etc/containerd/config.toml to
  /usr/share/containerd/config.toml (only /usr survives sysext capture).
- Enable SELinux in the relocated CRI configuration.
- Keep RPM-specific behavior in a dedicated mangle helper.

Original-PR: 28557

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 19b38196-b3d5-473a-9aea-e1d53bdb495e

* fix: keep the Azure Linux containerd unit in RPM mode

RPM-mode sysexts were copying the Flatcar containerd files over the ones
installed by the Azure Linux RPM, which replaced the RPM unit and dropped
its OOMScoreAdjust=-999. The previous commit then replaced the Flatcar
config too, so neither the unit-level nor the config-level (oom_score)
OOM protection survived.

Stop copying any Flatcar files in RPM mode and keep the unit and config
shipped by the RPM. The ACL-specific behaviour the Flatcar unit provided
is layered back on as a containerd.service.d/10-acl.conf drop-in:

  - point ExecStart at the config relocated under /usr/share, since a
    sysext cannot provide /etc/containerd/config.toml, and keep the
    CONTAINERD_CONFIG indirection so tests can swap in the cgroupfs
    variant via their own drop-in
  - Type=notify and RestartSec=5
  - the /run/docker/libcontainerd socket symlink docker.service expects
  - the resource limits from the upstream unit

The RPM does not run its %post at sysext build time, so the
multi-user.target.wants enablement symlink is created explicitly, and
config-cgroupfs.toml is generated from the relocated config to match
PORTAGE mode.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 67c6760b-2405-49a6-af7c-d9a536a77ac3

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 19b38196-b3d5-473a-9aea-e1d53bdb495e
Copilot-Session: 67c6760b-2405-49a6-af7c-d9a536a77ac3
)

* acl/docs: add guide for preloading container images into ACL images

Documents how to bake OCI container images into the containerd content
store of an ACL image with the Azure Linux Image Customizer, so they are
present on first boot without a registry pull.

The primary flow runs the image's own containerd inside the
postCustomization chroot to pull and pin the images directly, requiring no
host-side containerd, no version matching, and no intermediate tarball. An
offline variant that hydrates a data root out of band is documented for
air-gapped builds.

The guide lists the x64 and Arm64 ACL Marketplace SKUs and links to the
Image Customizer documentation for exporting an image version as a VHD.

The output is emitted as vhd-fixed so it can be uploaded into a managed
disk and published as an Azure Compute Gallery image version, which the
guide also covers.

It also records the workarounds needed for ACL: a separate build directory
to avoid an overlayfs ELOOP, a pinned Image Customizer tag, SSL_CERT_FILE
pointing at the trust bundle in /usr, and numeric chown.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8602e313-44cf-4c87-a245-27e7b542e2b5

* acl/docs: address review feedback on containerd preload guide

- Replace fixed sleeps with check-loops when starting and stopping
  containerd, and fail fast if it exits during startup.
- Explain why the chown/chmod on the containerd data root are
  deliberately non-recursive.
- Clarify that ACL's factory passwd lives under /usr/share/distro/etc
  and is not materialized at /etc until first boot.
- Reframe the verification section around cost, and state the
  concessions the local boot check makes.
- Publish to a gallery via a page blob and --os-vhd-uri rather than an
  intermediate managed disk.
- Inline the offline variant's host-side hydration steps and use an
  inline content: script instead of referring to an unnamed file.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8602e313-44cf-4c87-a245-27e7b542e2b5

* acl/docs: correct first-boot claim in containerd preload guide

The local boot check does not exercise ACL's provisioning path. The UKI's
baked-in command line carries neither ignition.firstboot nor
flatcar.oem.id=azure -- both come from UKI addons on the ESP that booting with
-kernel/-initrd bypasses -- so the boot takes the subsequent-boot path and no
provisioning agent runs.

Drop the unsupported claim that surviving images prove /var is not reset during
provisioning, and note that forcing the two arguments does not help either:
waagent starts but cannot mount the OVF DVD or reach the wireserver, so
provisioning still never completes.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8602e313-44cf-4c87-a245-27e7b542e2b5

* acl/docs: correct local boot check caveat with verified addon behaviour

The previous note named the wrong kernel argument. ACL uses Flatcar's
flatcar.first_boot=detected, not ignition.firstboot, so the earlier experiment
never actually triggered Ignition.

Verified against the ESP of a customized image: firstboot.addon.efi and
oem.addon.efi are installed in EFI/Linux/<uki>.efi.extra.d/ and inject
flatcar.first_boot=detected and flatcar.oem.id=azure respectively. They are
intact after customization; -kernel/-initrd simply bypasses systemd-stub, which
is what merges them.

Driving the real first-boot path locally does not work: Ignition resolves the
azure platform and blocks on IMDS, and ignition-fetch.service has no timeout, so
the boot hangs in the initrd and never reaches multi-user.target. Document that
bypassing the addons is what makes the local check usable.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8602e313-44cf-4c87-a245-27e7b542e2b5

* acl/docs: correct the stale-image cause for rootfs detection failure

The MCR :latest tag does point at a current release (1.5.0-2). The failure was
a locally cached image -- docker run does not re-pull a tag that is already
present. Recommend docker pull, or pinning, rather than blaming the registry.

Also note that a fix for the ELOOP mount overlap is in flight upstream.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8602e313-44cf-4c87-a245-27e7b542e2b5

* acl/docs: use the latest Image Customizer tag instead of pinning

The latest tag on MCR points at a current release, so pinning is unnecessary.
Add an explicit docker pull, since docker run reuses a cached tag, and note
that 1.5.0 is the minimum for ACL support if a pin is wanted for
reproducibility.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8602e313-44cf-4c87-a245-27e7b542e2b5

* docs(acl): read preload image list from a separate file

Move the container image references out of preload.sh and into
staging/images.txt, one reference per line with support for blank
lines and # comments.

The Image Customizer bind-mounts the config file's parent directory
at /_imageconfigs inside the chroot while scripts run, so the list is
read from there directly -- no additionalFiles entry or in-image
cleanup is needed.

Applied to both the online script and the offline appendix variant.

Verified with an Image Customizer run against the ACL production
image: both listed images land in the output image's containerd
metadata store.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8602e313-44cf-4c87-a245-27e7b542e2b5

* docs(acl): clarify debug log shows cached images

Co-authored-by: jiria <18746096+jiria@users.noreply.github.com>

* docs(acl): address review feedback on containerd preload guide

- Note that the containerd store is keyed by image reference, so the
  sandbox (pause) image must match what the runtime requests; ACL ships
  no sandbox_image setting, so document how to check the effective value.
- Use consistent staging/out/ host paths for the artifact throughout.
- Create mount points with mkdir -p before mounting.
- Run the offline hydration block under a single sudo shell so that $! is
  containerd's own PID; backgrounding sudo made the shutdown wait hang
  because sudo kill does not terminate the wrapper.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8602e313-44cf-4c87-a245-27e7b542e2b5

* docs(acl): note containerd's default pause image reference

Co-authored-by: jiria <18746096+jiria@users.noreply.github.com>

* docs(acl): correct sandbox image lookup for containerd 2.x

containerd 2.x removed the sandbox_image key under io.containerd.grpc.v1.cri,
so the documented grep returned nothing on ACL. The setting is now
pinned_images.sandbox under io.containerd.cri.v1.images. ACL does not pin it,
so the effective value is containerd's compiled-in default
registry.k8s.io/pause:3.10.1 rather than an MCR reference.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8602e313-44cf-4c87-a245-27e7b542e2b5

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: jiria <18746096+jiria@users.noreply.github.com>
Copilot-Session: 8602e313-44cf-4c87-a245-27e7b542e2b5
…g, LUKS initramfs modules (#33)

* ado: Readd es-metadata.yml

* feat(acl-t): add parallel ACL Template build path

* Comments addressed.

* Testing verification 0722

* Exempt nfs

* 0723 verifications.

* Comments addressed.

* Correct linux.ntp exemption reason: timesyncd loses via unit Conflicts, not %post

The AzL 3.0 chrony.spec %post only runs daemon-reload/systemd_post/start;
the actual suppression mechanism is Conflicts=systemd-timesyncd.service in
the upstream chronyd.service that AzL packages verbatim.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* Document imageVariants matching and selection semantics in the schema header

Two non-obvious behaviors now spelled out where contributors copy from:
imageVariants values match exactly (unlike the other list keys; 'acl' is
a substring of 'acl-t'), and a rule constrained only by imageVariants
drops the test from kola selection on that variant rather than just
forgiving it at evaluation.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* Comments addressed.

---------

Co-authored-by: Jiri Appl <jiria@microsoft.com>
Co-authored-by: Lanze Liu <lanzeliu@microsoft.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* Harden ARM64 Azure provisioning validation

* Validate repro resource group names

* Address Azure provisioning review feedback

* Scope Azure VM cleanup to subscription

* Skip diagnostics for SKU fallback

* fix: validate full Azure gallery image IDs

* refactor: narrow Azure provisioning hardening scope
Request TSV output from Azure CLI so serial-console newlines are emitted as real line breaks instead of JSON escape sequences.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* fix(validate): retry transient Azure VM provisioning errors

Classify provisioning timeouts, allocation failures, and quota exhaustion as retryable VM creation errors so the SKU/region fallback advances to the next candidate. Keep unrelated Azure failures fatal and add focused classifier coverage.

Signed-off-by: Sean Dougherty <sdougherty@microsoft.com>

* fix(validate): isolate Azure VM fallback attempts

Provision each retryable candidate in a fresh resource group so failed VM, NIC, disk, deployment, and public-IP resources cannot race the next attempt. Add orchestration coverage for cleanup, exhaustion, region transitions, and sourced-test isolation.

Signed-off-by: Sean Dougherty <sdougherty@microsoft.com>

* fix(validate): capture failed Azure VM boot logs

Before deleting a retryable failed VM resource group, best-effort enable managed boot diagnostics and print a bounded serial-log tail. Keep diagnostics non-fatal so missing VM resources or unavailable logs cannot block fallback.

Signed-off-by: Sean Dougherty <sdougherty@microsoft.com>

* fix(validate): bound Azure provisioning timeouts

Track OS provisioning timeouts separately from capacity errors, stop after two distinct Azure SKU families, and preserve accurate mixed-failure reporting. Make failed boot-log capture jq-free and robust to Azure CLI warnings, simplify region setup, and isolate stateful tests.

Signed-off-by: Sean Dougherty <sdougherty@microsoft.com>

* fix(validate): refine Azure VM fallback retries

* fix(validate): preserve create-time boot diagnostics

* fix(validate): parse diagnostics storage hash

* fix(validate): harden Azure fallback cleanup

* refactor(validate): simplify Azure fallback flow

Consolidate boot diagnostics on the create-time storage path, split fallback state handling into focused helpers, and document the regression test suite.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix(validate): scope exhausted fallback cleanup

Target asynchronous resource-group deletion to AZ_SUB_ID and clean the final reused resource group when all VM candidates are exhausted.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix(validate): preserve cleanup diagnostics

Capture and log Azure CLI stderr when resource-group cleanup scheduling fails so authorization and subscription errors remain actionable.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix(validate): address fallback review feedback

Restore direct VM creation calls and explicit result state, preserve no-cleanup fallback behavior, skip timed-out SKU families immediately, harden boot diagnostics SAS handling, and avoid cleanup of uncreated resource groups.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix(validate): scope Azure VM resources

Pass AZ_SUB_ID explicitly when creating the VM resource group, public IP, and boot diagnostics storage account so provisioning and cleanup use the same subscription.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Signed-off-by: Sean Dougherty <sdougherty@microsoft.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…t SBOMs (#51)

* fix(rpm): emit NEVRA and drop gpg-pubkey from the image package list

* fix(rpm): route build_sysext package lists through rpm_query_packages

* fix comment drift

* address review comments

- rpm_query_manifest: wrap RPM_MANIFEST_QUERY_FORMAT in the same
  %|ARCH?{...}:{}| guard used by rpm_query_packages, so gpg-pubkey no longer
  reaches the SPDX SBOM as a package with (none) for VENDOR, EPOCH, ARCH and
  SOURCERPM. Both producers now apply one rule for what counts as a package.

- build_sysext cleanup(): also remove .rpm-base.tmp and .rpm-all.tmp. cleanup
  runs at L168 before either snapshot is taken, so a stale NVRA-format base
  left behind by a crashed run can no longer be diffed against a NEVRA-format
  .rpm-all.tmp and report every epoch-bearing package as sysext-added.

- rpm_query_packages: replace the hedge in the comment with rpm's own test.
  Pubkey headers carry no ARCH tag, and rpm rejects a gpg-pubkey entry that
  does have one (lib/keystore.cc). Also drop the needless line continuation.
Add an opt-in container_logreader_t domain for log collectors that need read-only access to host and audit logs without using spc_t. Keep container_t as the default and deny log mutation permissions.

Signed-off-by: Sean Dougherty <sdougherty@microsoft.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…#53)

* fix(sdk): return a single version tag when a commit has multiple tags

`get_git_version()` used the raw output of `git tag --points-at HEAD`,
which prints one line per tag. Two ACL releases were cut from the same
`aclmain` commit (3.0.20260706-3.0-1153684 and 3.0.20260809-3.0-1179296),
so the OS version became a two-line string.

That multi-line value flowed into `create_versionfile` and into the
container name derived by `run_sdk_container`, producing:

  Error response from daemon: Invalid container name
  (flatcar-sdk-all-4459.0.0_os-3.0.20260706-3.0-1153684
  3.0.20260809-3.0-1179296), only [a-zA-Z0-9][a-zA-Z0-9_.-] are allowed

which failed "Build ACL Base Image" on every RPM image leg (amd64 and
aarch64, Azure and QEMU).

Pick the highest version tag deterministically with `sort -V | tail -n 1`,
and clamp `git describe` to one line. Also clamp `vernum_from_version` and
`build_id_from_version`, whose `sed -n ...p` emits one line per match, so
no caller-supplied version can reintroduce a multi-line container name.

Single-tag behaviour is unchanged.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix(sdk): select the version tag without a pipeline

Review feedback: `git describe --tags | head -n 1` made the fallback branch
always exit 0, so a `git describe` failure (rc 128) would no longer abort
callers such as `run_sdk_container`, which runs under `set -e` and does a
plain `os_version=$(get_git_version)` assignment.

Use `git for-each-ref --count=1 --sort=-v:refname` to pick the highest tag
directly, and leave `git describe --tags` unpiped so its exit status still
propagates. `git describe` only ever prints one line, so the `head -n 1`
clamp was unnecessary.

Verified `for-each-ref` returns the same tag as `sort -V | tail -n 1` for
the real failing tag pair (3.0.20260706-3.0-1153684 and
3.0.20260809-3.0-1179296), that single-tag and untagged-HEAD behaviour is
unchanged, and that a git failure now yields rc 128 again.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Add read-only systemd journal mmap support, retain canonical container-selinux audit-log semantics, document safe mounts and MCS behavior, and clarify enforcing-by-default configuration. Tracks automated validation in AB#23492.
Add a customer-facing reference for ACL container workload domains, privilege boundaries, CRI and MCS requirements, journal DAC, audit behavior, and troubleshooting guidance. Includes the reviewed follow-ups previously tracked in #63.\n\nAB#23415
Signed-off-by: Sean Dougherty <sdougherty@microsoft.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Dan Fiedler <danfiedler@microsoft.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

This branch was successfully deployed

1 active deployment
development — 2372781e Deployed Sep 24, 2026 by SeanDougherty via Check if we need to update the SDK #51
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants