@@ -3,7 +3,7 @@ use crate::config::{Config, ProcessNote, Protocol};
33use anyhow:: { bail, Context , Result } ;
44use bon:: Builder ;
55use dstack_types:: shared_filenames:: {
6- APP_COMPOSE , ENCRYPTED_ENV , INSTANCE_INFO , SYS_CONFIG , USER_CONFIG ,
6+ compat_v3 , APP_COMPOSE , ENCRYPTED_ENV , INSTANCE_INFO , SYS_CONFIG , USER_CONFIG ,
77} ;
88use fs_err as fs;
99use guest_api:: client:: DefaultClient as GuestClient ;
@@ -475,19 +475,64 @@ impl App {
475475 . context ( "Failed to load image info" ) ?;
476476 let rootfs_hash = image_info
477477 . rootfs_hash
478+ . as_ref ( )
478479 . context ( "Rootfs hash not found in image info" ) ?;
479- let sys_config = serde_json:: json!( {
480- "rootfs_hash" : rootfs_hash,
481- "kms_urls" : cfg. cvm. kms_urls,
482- "tproxy_urls" : cfg. cvm. tproxy_urls,
483- "pccs_url" : cfg. cvm. pccs_url,
484- "docker_registry" : cfg. cvm. docker_registry,
485- "host_api_url" : format!( "vsock://2:{}/api" , cfg. host_api. port) ,
486- } ) ;
480+ let img_ver = image_info. version_tuple ( ) . unwrap_or ( ( 0 , 0 , 0 ) ) ;
481+ let sys_config = if img_ver >= ( 0 , 4 , 0 ) {
482+ serde_json:: json!( {
483+ "rootfs_hash" : rootfs_hash,
484+ "kms_urls" : cfg. cvm. kms_urls,
485+ "tproxy_urls" : cfg. cvm. tproxy_urls,
486+ "pccs_url" : cfg. cvm. pccs_url,
487+ "docker_registry" : cfg. cvm. docker_registry,
488+ "host_api_url" : format!( "vsock://2:{}/api" , cfg. host_api. port) ,
489+ } )
490+ } else {
491+ serde_json:: json!( {
492+ "rootfs_hash" : rootfs_hash,
493+ "kms_url" : cfg. cvm. kms_urls. first( ) ,
494+ "tproxy_url" : cfg. cvm. tproxy_urls. first( ) ,
495+ "pccs_url" : cfg. cvm. pccs_url,
496+ "docker_registry" : cfg. cvm. docker_registry,
497+ "host_api_url" : format!( "vsock://2:{}/api" , cfg. host_api. port) ,
498+ } )
499+ } ;
487500 let sys_config_str =
488501 serde_json:: to_string ( & sys_config) . context ( "Failed to serialize vm config" ) ?;
489- fs:: write ( shared_dir. join ( SYS_CONFIG ) , sys_config_str)
502+ let config_file = if img_ver >= ( 0 , 4 , 0 ) {
503+ SYS_CONFIG
504+ } else {
505+ compat_v3:: SYS_CONFIG
506+ } ;
507+ fs:: write ( shared_dir. join ( config_file) , sys_config_str)
490508 . context ( "Failed to write vm config" ) ?;
509+ if img_ver < ( 0 , 4 , 0 ) {
510+ // Sync .encrypted-env to encrypted-env
511+ let compat_encrypted_env_path = shared_dir. join ( compat_v3:: ENCRYPTED_ENV ) ;
512+ let encrypted_env_path = shared_dir. join ( ENCRYPTED_ENV ) ;
513+ if compat_encrypted_env_path. exists ( ) {
514+ fs:: remove_file ( & compat_encrypted_env_path) ?;
515+ }
516+ if encrypted_env_path. exists ( ) {
517+ fs:: copy ( & encrypted_env_path, & compat_encrypted_env_path) ?;
518+ }
519+
520+ // Sync certs
521+ let certs_dir = shared_dir. join ( "certs" ) ;
522+ fs:: create_dir_all ( & certs_dir) . context ( "Failed to create certs directory" ) ?;
523+ if cfg. cvm . ca_cert . is_empty ( )
524+ || cfg. cvm . tmp_ca_cert . is_empty ( )
525+ || cfg. cvm . tmp_ca_key . is_empty ( )
526+ {
527+ bail ! ( "Certificates are required for older images" ) ;
528+ }
529+ fs:: copy ( & cfg. cvm . ca_cert , certs_dir. join ( "ca.cert" ) )
530+ . context ( "Failed to copy ca cert" ) ?;
531+ fs:: copy ( & cfg. cvm . tmp_ca_cert , certs_dir. join ( "tmp-ca.cert" ) )
532+ . context ( "Failed to copy tmp ca cert" ) ?;
533+ fs:: copy ( & cfg. cvm . tmp_ca_key , certs_dir. join ( "tmp-ca.key" ) )
534+ . context ( "Failed to copy tmp ca key" ) ?;
535+ }
491536 Ok ( ( ) )
492537 }
493538
0 commit comments