From 75a68ecf66350061641f5e4210ca01f7def03e46 Mon Sep 17 00:00:00 2001 From: Brian Fjeldstad Date: Sun, 12 Jul 2026 21:59:51 +0000 Subject: [PATCH 1/2] acl COSI files do not contain ospackages --- crates/trident/src/osimage/cosi/validation.rs | 34 +++++++++++-------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/crates/trident/src/osimage/cosi/validation.rs b/crates/trident/src/osimage/cosi/validation.rs index 224a9d7a5..934c4644e 100644 --- a/crates/trident/src/osimage/cosi/validation.rs +++ b/crates/trident/src/osimage/cosi/validation.rs @@ -82,22 +82,28 @@ impl CosiMetadata { } // Ensure osPackages are present and all required info is provided. - let Some(os_packages) = &self.os_packages else { - return mk_err(CosiMetadataErrorKind::V1_1OsPackagesRequired); - }; + match &self.os_packages { + Some(packages) => { + // Ensure both release and arch are provided. + for os_package in packages { + if os_package.release.is_none() { + return mk_err(CosiMetadataErrorKind::V1_1OsPackageMissingRelease( + os_package.name.clone(), + )); + } - // Ensure both release and arch are provided. - for os_package in os_packages { - if os_package.release.is_none() { - return mk_err(CosiMetadataErrorKind::V1_1OsPackageMissingRelease( - os_package.name.clone(), - )); + if os_package.arch.is_none() { + return mk_err(CosiMetadataErrorKind::V1_1OsPackageMissingArch( + os_package.name.clone(), + )); + } + } } - - if os_package.arch.is_none() { - return mk_err(CosiMetadataErrorKind::V1_1OsPackageMissingArch( - os_package.name.clone(), - )); + None => { + if self.os_release.variant_id != Some("azurecontainerlinux".to_string()) { + // if variant_id is not "azurecontainerlinux", osPackages are required + return mk_err(CosiMetadataErrorKind::V1_1OsPackagesRequired); + } } } } From 69dbec6be309a7ecf3b626d0f8631afa6363cfcd Mon Sep 17 00:00:00 2001 From: bfjelds Date: Mon, 13 Jul 2026 11:44:19 -0700 Subject: [PATCH 2/2] Use osrelease constant and add ACL osPackages test Compare variant_id against osutils::osrelease::AZURE_CONTAINER_LINUX_VARIANT_ID instead of a hard-coded, allocated string, and add a regression test covering Azure Container Linux images that omit osPackages. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- crates/trident/src/osimage/cosi/validation.rs | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/crates/trident/src/osimage/cosi/validation.rs b/crates/trident/src/osimage/cosi/validation.rs index 934c4644e..e2ce01939 100644 --- a/crates/trident/src/osimage/cosi/validation.rs +++ b/crates/trident/src/osimage/cosi/validation.rs @@ -2,6 +2,8 @@ use std::collections::{HashMap, HashSet}; use log::warn; +use osutils::osrelease::AZURE_CONTAINER_LINUX_VARIANT_ID; + use super::{ error::{CosiMetadataError, CosiMetadataErrorKind}, metadata::{ @@ -100,8 +102,10 @@ impl CosiMetadata { } } None => { - if self.os_release.variant_id != Some("azurecontainerlinux".to_string()) { - // if variant_id is not "azurecontainerlinux", osPackages are required + if self.os_release.variant_id.as_deref() + != Some(AZURE_CONTAINER_LINUX_VARIANT_ID) + { + // osPackages are required unless this is an Azure Container Linux image return mk_err(CosiMetadataErrorKind::V1_1OsPackagesRequired); } } @@ -432,6 +436,15 @@ mod tests { CosiMetadataErrorKind::V1_1OsPackagesRequired, ); + // Azure Container Linux images may omit osPackages. + let mut acl_no_os_packages = base.clone(); + acl_no_os_packages["osRelease"] = + json!("ID=azurelinux\nVERSION_ID=3.0\nVARIANT_ID=azurecontainerlinux\n"); + if let Some(obj) = acl_no_os_packages.as_object_mut() { + obj.remove("osPackages"); + } + parse_and_validate(acl_no_os_packages).unwrap(); + // v1.1 requires per-package release. let mut missing_release = base.clone(); missing_release["osPackages"][0]