88//! - A SHA256 hash of all build inputs for cache validation
99//! - The container image digest for visibility and tracking
1010
11+ use crate :: install_options:: InstallOptions ;
1112use cap_std_ext:: cap_std:: { self , fs:: Dir } ;
1213use cap_std_ext:: dirext:: CapStdExtDirExt ;
1314use color_eyre:: { eyre:: Context , Result } ;
@@ -35,6 +36,9 @@ struct CacheInputs {
3536 /// Root filesystem size if specified
3637 root_size : Option < String > ,
3738
39+ /// Whether to use composefs-native storage
40+ composefs_native : bool ,
41+
3842 /// Kernel arguments used during installation
3943 kernel_args : Vec < String > ,
4044
@@ -54,6 +58,9 @@ pub struct DiskImageMetadata {
5458 /// Root filesystem size if specified
5559 pub root_size : Option < String > ,
5660
61+ /// Whether to use composefs-native storage
62+ pub composefs_native : bool ,
63+
5764 /// Kernel arguments used during installation
5865 pub kernel_args : Vec < String > ,
5966
@@ -62,23 +69,13 @@ pub struct DiskImageMetadata {
6269}
6370
6471impl DiskImageMetadata {
65- /// Create new metadata for a disk image
66- pub fn new ( digest : & str ) -> Self {
67- Self {
68- version : 1 ,
69- digest : digest. to_owned ( ) ,
70- filesystem : None ,
71- root_size : None ,
72- kernel_args : Default :: default ( ) ,
73- }
74- }
75-
7672 /// Generate SHA256 hash of all build inputs
7773 fn compute_cache_hash ( & self ) -> String {
7874 let inputs = CacheInputs {
7975 image_digest : self . digest . clone ( ) ,
8076 filesystem : self . filesystem . clone ( ) ,
8177 root_size : self . root_size . clone ( ) ,
78+ composefs_native : self . composefs_native ,
8279 kernel_args : self . kernel_args . clone ( ) ,
8380 version : self . version ,
8481 } ;
@@ -154,12 +151,25 @@ impl DiskImageMetadata {
154151 }
155152}
156153
154+ impl DiskImageMetadata {
155+ /// Create new metadata from InstallOptions and image digest
156+ pub fn from ( options : & InstallOptions , image : & str , kernel_args : & [ String ] ) -> Self {
157+ Self {
158+ version : 1 ,
159+ digest : image. to_owned ( ) ,
160+ filesystem : options. filesystem . clone ( ) ,
161+ root_size : options. root_size . clone ( ) ,
162+ kernel_args : kernel_args. to_vec ( ) ,
163+ composefs_native : options. composefs_native ,
164+ }
165+ }
166+ }
167+
157168/// Check if a cached disk image can be reused by comparing cache hashes
158169pub fn check_cached_disk (
159170 path : & Path ,
160171 image_digest : & str ,
161- filesystem : Option < & str > ,
162- root_size : Option < & str > ,
172+ install_options : & InstallOptions ,
163173 kernel_args : & [ String ] ,
164174) -> Result < bool > {
165175 if !path. exists ( ) {
@@ -168,10 +178,7 @@ pub fn check_cached_disk(
168178 }
169179
170180 // Create metadata for the current request to compute expected hash
171- let mut expected_meta = DiskImageMetadata :: new ( image_digest) ;
172- expected_meta. filesystem = filesystem. map ( ToOwned :: to_owned) ;
173- expected_meta. root_size = root_size. map ( ToOwned :: to_owned) ;
174- expected_meta. kernel_args = Vec :: from ( kernel_args) ;
181+ let expected_meta = DiskImageMetadata :: from ( install_options, image_digest, kernel_args) ;
175182 let expected_hash = expected_meta. compute_cache_hash ( ) ;
176183
177184 // Read the cache hash from the disk image
@@ -221,15 +228,29 @@ mod tests {
221228
222229 #[ test]
223230 fn test_cache_hash_generation ( ) {
224- let mut metadata1 = DiskImageMetadata :: new ( "sha256:abc123" ) ;
225- metadata1. filesystem = Some ( "ext4" . to_string ( ) ) ;
226- metadata1. root_size = Some ( "20G" . to_string ( ) ) ;
227- metadata1. kernel_args = vec ! [ "console=ttyS0" . to_string( ) ] ;
231+ let install_options1 = InstallOptions {
232+ filesystem : Some ( "ext4" . to_string ( ) ) ,
233+ root_size : Some ( "20G" . to_string ( ) ) ,
234+ storage_path : None ,
235+ composefs_native : false ,
236+ } ;
237+ let metadata1 = DiskImageMetadata :: from (
238+ & install_options1,
239+ "sha256:abc123" ,
240+ & [ "console=ttyS0" . to_string ( ) ] ,
241+ ) ;
228242
229- let mut metadata2 = DiskImageMetadata :: new ( "sha256:abc123" ) ;
230- metadata2. filesystem = Some ( "ext4" . to_string ( ) ) ;
231- metadata2. root_size = Some ( "20G" . to_string ( ) ) ;
232- metadata2. kernel_args = vec ! [ "console=ttyS0" . to_string( ) ] ;
243+ let install_options2 = InstallOptions {
244+ filesystem : Some ( "ext4" . to_string ( ) ) ,
245+ root_size : Some ( "20G" . to_string ( ) ) ,
246+ storage_path : None ,
247+ composefs_native : false ,
248+ } ;
249+ let metadata2 = DiskImageMetadata :: from (
250+ & install_options2,
251+ "sha256:abc123" ,
252+ & [ "console=ttyS0" . to_string ( ) ] ,
253+ ) ;
233254
234255 // Same inputs should generate same hash
235256 assert_eq ! (
@@ -238,21 +259,35 @@ mod tests {
238259 ) ;
239260
240261 // Different inputs should generate different hashes
241- let mut metadata3 = DiskImageMetadata :: new ( "sha256:xyz789" ) ;
242- metadata3. filesystem = Some ( "ext4" . to_string ( ) ) ;
243- metadata3. root_size = Some ( "20G" . to_string ( ) ) ;
244- metadata3. kernel_args = vec ! [ "console=ttyS0" . to_string( ) ] ;
262+ let install_options3 = InstallOptions {
263+ filesystem : Some ( "ext4" . to_string ( ) ) ,
264+ root_size : Some ( "20G" . to_string ( ) ) ,
265+ storage_path : None ,
266+ composefs_native : false ,
267+ } ;
268+ let metadata3 = DiskImageMetadata :: from (
269+ & install_options3,
270+ "sha256:xyz789" ,
271+ & [ "console=ttyS0" . to_string ( ) ] ,
272+ ) ;
245273
246274 assert_ne ! (
247275 metadata1. compute_cache_hash( ) ,
248276 metadata3. compute_cache_hash( )
249277 ) ;
250278
251279 // Different filesystem should generate different hash
252- let mut metadata4 = DiskImageMetadata :: new ( "sha256:abc123" ) ;
253- metadata4. filesystem = Some ( "xfs" . to_string ( ) ) ;
254- metadata4. root_size = Some ( "20G" . to_string ( ) ) ;
255- metadata4. kernel_args = vec ! [ "console=ttyS0" . to_string( ) ] ;
280+ let install_options4 = InstallOptions {
281+ filesystem : Some ( "xfs" . to_string ( ) ) ,
282+ root_size : Some ( "20G" . to_string ( ) ) ,
283+ storage_path : None ,
284+ composefs_native : false ,
285+ } ;
286+ let metadata4 = DiskImageMetadata :: from (
287+ & install_options4,
288+ "sha256:abc123" ,
289+ & [ "console=ttyS0" . to_string ( ) ] ,
290+ ) ;
256291
257292 assert_ne ! (
258293 metadata1. compute_cache_hash( ) ,
@@ -267,6 +302,7 @@ mod tests {
267302 filesystem : Some ( "ext4" . to_string ( ) ) ,
268303 root_size : Some ( "20G" . to_string ( ) ) ,
269304 kernel_args : vec ! [ "console=ttyS0" . to_string( ) ] ,
305+ composefs_native : false ,
270306 version : 1 ,
271307 } ;
272308
0 commit comments