Skip to content

Commit 52fe14c

Browse files
authored
Merge pull request #139 from Dstack-TEE/teepod-compat
teepod: Compatible for v0.3.x images
2 parents 7bddcc0 + eb035bb commit 52fe14c

File tree

4 files changed

+86
-10
lines changed

4 files changed

+86
-10
lines changed

dstack-types/src/shared_filenames.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,8 @@ pub const DECRYPTED_ENV: &str = ".decrypted-env";
77
pub const DECRYPTED_ENV_JSON: &str = ".decrypted-env.json";
88
pub const INSTANCE_INFO: &str = ".instance_info";
99
pub const HOST_SHARED_DIR: &str = "/tapp/.host-shared";
10+
11+
pub mod compat_v3 {
12+
pub const SYS_CONFIG: &str = "config.json";
13+
pub const ENCRYPTED_ENV: &str = "encrypted-env";
14+
}

teepod/src/app.rs

Lines changed: 55 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use crate::config::{Config, ProcessNote, Protocol};
33
use anyhow::{bail, Context, Result};
44
use bon::Builder;
55
use 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
};
88
use fs_err as fs;
99
use 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

teepod/src/app/image.rs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,22 @@ pub struct ImageInfo {
2222
pub is_dev: bool,
2323
}
2424

25+
impl ImageInfo {
26+
pub fn version_tuple(&self) -> Option<(u16, u16, u16)> {
27+
let version = self
28+
.version
29+
.split('.')
30+
.take(3)
31+
.map(|v| v.parse::<u16>())
32+
.collect::<Result<Vec<_>, _>>()
33+
.ok()?;
34+
if version.len() < 3 {
35+
return None;
36+
}
37+
Some((version[0], version[1], version[2]))
38+
}
39+
}
40+
2541
impl ImageInfo {
2642
pub fn load(filename: impl AsRef<Path>) -> Result<Self> {
2743
let file = fs::File::open(filename.as_ref()).context("failed to open image info")?;

teepod/src/config.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,16 @@ pub struct CvmConfig {
101101
pub gpu: GpuConfig,
102102
/// Use sudo to run the VM
103103
pub user: String,
104+
105+
/// The CA certificate
106+
#[serde(default)]
107+
pub ca_cert: String,
108+
/// The tmp CA certificate
109+
#[serde(default)]
110+
pub tmp_ca_cert: String,
111+
/// The tmp CA key
112+
#[serde(default)]
113+
pub tmp_ca_key: String,
104114
}
105115

106116
#[derive(Debug, Clone, Deserialize)]

0 commit comments

Comments
 (0)