Skip to content

Commit 662f79f

Browse files
Xynnn007mythi
authored andcommitted
CDH: add log to configuration
Related to confidential-containers#1324 Signed-off-by: Xynnn007 <xynnn@linux.alibaba.com>
1 parent 1003a2b commit 662f79f

7 files changed

Lines changed: 249 additions & 160 deletions

File tree

confidential-data-hub/example.config.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,5 +65,8 @@
6565
"-----BEGIN CERTIFICATE-----\nMIIFTDCCAvugAwIBAgIBADBGBgkqhkiG9w0BAQowOaAPMA0GCWCGSAFlAwQCAgUA\noRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAgUAogMCATCjAwIBATB7MRQwEgYD\nVQQLDAtFbmdpbmVlcmluZzELMAkGA1UEBhMCVVMxFDASBgNVBAcMC1NhbnRhIENs\nYXJhMQswCQYDVQQIDAJDQTEfMB0GA1UECgwWQWR2YW5jZWQgTWljcm8gRGV2aWNl\nczESMBAGA1UEAwwJU0VWLU1pbGFuMB4XDTIzMDEyNDE3NTgyNloXDTMwMDEyNDE3\nNTgyNlowejEUMBIGA1UECwwLRW5naW5lZXJpbmcxCzAJBgNVBAYTAlVTMRQwEgYD\nVQQHDAtTYW50YSBDbGFyYTELMAkGA1UECAwCQ0ExHzAdBgNVBAoMFkFkdmFuY2Vk\nIE1pY3JvIERldmljZXMxETAPBgNVBAMMCFNFVi1WQ0VLMHYwEAYHKoZIzj0CAQYF\nK4EEACIDYgAExmG1ZbuoAQK93USRyZQcsyobfbaAEoKEELf/jK39cOVJt1t4s83W\nXM3rqIbS7qHUHQw/FGyOvdaEUs5+wwxpCWfDnmJMAQ+ctgZqgDEKh1NqlOuuKcKq\n2YAWE5cTH7sHo4IBFjCCARIwEAYJKwYBBAGceAEBBAMCAQAwFwYJKwYBBAGceAEC\nBAoWCE1pbGFuLUIwMBEGCisGAQQBnHgBAwEEAwIBAzARBgorBgEEAZx4AQMCBAMC\nAQAwEQYKKwYBBAGceAEDBAQDAgEAMBEGCisGAQQBnHgBAwUEAwIBADARBgorBgEE\nAZx4AQMGBAMCAQAwEQYKKwYBBAGceAEDBwQDAgEAMBEGCisGAQQBnHgBAwMEAwIB\nCDARBgorBgEEAZx4AQMIBAMCAXMwTQYJKwYBBAGceAEEBEDDhCejDUx6+dlvehW5\ncmmCWmTLdqI1L/1dGBFdia1HP46MC82aXZKGYSutSq37RCYgWjueT+qCMBE1oXDk\nd1JOMEYGCSqGSIb3DQEBCjA5oA8wDQYJYIZIAWUDBAICBQChHDAaBgkqhkiG9w0B\nAQgwDQYJYIZIAWUDBAICBQCiAwIBMKMDAgEBA4ICAQACgCai9x8DAWzX/2IelNWm\nituEBSiq9C9eDnBEckQYikAhPasfagnoWFAtKu/ZWTKHi+BMbhKwswBS8W0G1ywi\ncUWGlzigI4tdxxf1YBJyCoTSNssSbKmIh5jemBfrvIBo1yEd+e56ZJMdhN8e+xWU\nbvovUC2/7Dl76fzAaACLSorZUv5XPJwKXwEOHo7FIcREjoZn+fKjJTnmdXce0LD6\n9RHr+r+ceyE79gmK31bI9DYiJoL4LeGdXZ3gMOVDR1OnDos5lOBcV+quJ6JujpgH\nd9g3Sa7Du7pusD9Fdap98ocZslRfFjFi//2YdVM4MKbq6IwpYNB+2PCEKNC7SfbO\nNgZYJuPZnM/wViES/cP7MZNJ1KUKBI9yh6TmlSsZZOclGJvrOsBZimTXpATjdNMt\ncluKwqAUUzYQmU7bf2TMdOXyA9iH5wIpj1kWGE1VuFADTKILkTc6LzLzOWCofLxf\nonhTtSDtzIv/uel547GZqq+rVRvmIieEuEvDETwuookfV6qu3D/9KuSr9xiznmEg\nxynud/f525jppJMcD/ofbQxUZuGKvb3f3zy+aLxqidoX7gca2Xd9jyUy5Y/83+ZN\nbz4PZx81UJzXVI9ABEh8/xilATh1ZxOePTBJjN7lgr0lXtKYjV/43yyxgUYrXNZS\noLSG2dLCK9mjjraPjau34Q==\n-----END CERTIFICATE-----"
6666
],
6767
"work_dir": "/run/image-rs"
68+
},
69+
"log": {
70+
"level": "info"
6871
}
6972
}

confidential-data-hub/example.config.toml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -245,3 +245,7 @@ http_proxy = "http://127.0.0.1:5432"
245245
#
246246
# By default this value is not set.
247247
no_proxy = "192.168.0.1,localhost"
248+
249+
[log]
250+
# log level
251+
level = "info"

confidential-data-hub/hub/src/bin/cdh-oneshot.rs

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,11 @@
99

1010
use base64::{engine::general_purpose::STANDARD, Engine};
1111
use clap::{Args, Parser, Subcommand};
12-
use confidential_data_hub::{hub::Hub, storage::volume_type::Storage, CdhConfig, DataHub};
13-
use tracing::warn;
12+
use confidential_data_hub::{hub::Hub, storage::volume_type::Storage, DataHub};
13+
use tracing::{debug, info, warn};
14+
use tracing_subscriber::{fmt::Subscriber, EnvFilter};
1415

16+
mod config;
1517
#[derive(Parser)]
1618
#[command(name = "cdh_oneshot")]
1719
#[command(bin_name = "cdh_oneshot")]
@@ -94,14 +96,24 @@ struct PullImageArgs {
9496

9597
#[tokio::main]
9698
async fn main() {
97-
let args = Cli::parse();
98-
let config = CdhConfig::new(args.config).expect("failed to initialize cdh config");
99-
config.set_configuration_envs();
99+
let cli = Cli::parse();
100100

101+
let (config, config_log) = config::read_config(cli.config).expect("failed to read config");
102+
103+
let env_filter = match std::env::var_os("RUST_LOG") {
104+
Some(_) => EnvFilter::try_from_default_env().expect("RUST_LOG is present but invalid"),
105+
None => EnvFilter::try_new(&config.log.level)
106+
.unwrap_or_else(|_| panic!("Invalid log level: {}", config.log.level)),
107+
};
108+
109+
Subscriber::builder().with_env_filter(env_filter).init();
110+
111+
info!("{config_log}");
112+
debug!(config = ?config, "Using config");
101113
let cdh = Hub::new(config).await.expect("failed to start CDH");
102114

103115
let mut tried = 1;
104-
match args.operation {
116+
match cli.operation {
105117
Operation::UnsealSecret(op_args) => {
106118
let secret = tokio::fs::read(op_args.secret_path)
107119
.await
@@ -114,7 +126,7 @@ async fn main() {
114126
break;
115127
}
116128
Err(e) => {
117-
if tried > args.retry {
129+
if tried > cli.retry {
118130
let error = format!("failed to unseal secret, {e:?}");
119131
panic!("{error}");
120132
}
@@ -136,7 +148,7 @@ async fn main() {
136148
break;
137149
}
138150
Err(e) => {
139-
if tried > args.retry {
151+
if tried > cli.retry {
140152
panic!("failed to unwrap key");
141153
}
142154
warn!("Tried {tried} times... failed to unwrap key: {e}.");
@@ -153,7 +165,7 @@ async fn main() {
153165
break;
154166
}
155167
Err(e) => {
156-
if tried > args.retry {
168+
if tried > cli.retry {
157169
let error = format!("failed to get resource, {e:?}");
158170
panic!("{error}");
159171
}
Lines changed: 141 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,141 @@
1+
// Copyright (c) 2026 Alibaba Cloud
2+
//
3+
// SPDX-License-Identifier: Apache-2.0
4+
//
5+
6+
use std::env;
7+
8+
use anyhow::{Context, Result};
9+
use confidential_data_hub::CdhConfig;
10+
use tracing::info;
11+
12+
const CDH_DEFAULT_IMAGE_AUTHENTICATED_REGISTRY_CREDENTIALS: &str =
13+
"CDH_DEFAULT_IMAGE_AUTHENTICATED_REGISTRY_CREDENTIALS";
14+
15+
pub fn read_config(config_path: Option<String>) -> Result<(CdhConfig, String)> {
16+
let (mut config, config_log) = match config_path {
17+
Some(config_path) => {
18+
let config = CdhConfig::from_file(&config_path[..])
19+
.with_context(|| format!("failed to read config file {config_path}"))?;
20+
let log = format!("Using config file: {config_path}");
21+
(config, log)
22+
}
23+
None => {
24+
if let std::result::Result::Ok(env_path) = env::var("CDH_CONFIG_PATH") {
25+
let log = format!("Read CDH's config path from env: {env_path}");
26+
let config = CdhConfig::from_file(&env_path[..])
27+
.with_context(|| format!("failed to read config file {env_path}"))?;
28+
(config, log)
29+
} else {
30+
let log = "No CDH config path specified. Using default configuration.".to_string();
31+
let config = CdhConfig::default_with_kernel_cmdline()
32+
.with_context(|| "failed to read default configuration".to_string())?;
33+
(config, log)
34+
}
35+
}
36+
};
37+
38+
if let std::result::Result::Ok(env) =
39+
env::var(CDH_DEFAULT_IMAGE_AUTHENTICATED_REGISTRY_CREDENTIALS)
40+
{
41+
info!("Read authenticated registry credentials URI from env: {env}");
42+
config.image.authenticated_registry_credentials_uri = Some(env);
43+
}
44+
45+
config.extend_credentials_from_kernel_cmdline()?;
46+
47+
Ok((config, config_log))
48+
}
49+
50+
#[cfg(test)]
51+
mod tests {
52+
use std::{env, io::Write};
53+
54+
use anyhow::anyhow;
55+
use confidential_data_hub::{CdhConfig, KbsConfig, LogConfig, DEFAULT_CDH_SOCKET_ADDR};
56+
use image_rs::config::ImageConfig;
57+
use serial_test::serial;
58+
59+
use crate::config::read_config;
60+
61+
#[test]
62+
#[serial]
63+
fn test_config_auth_override_by_env() {
64+
let config = r#"
65+
[kbc]
66+
name = "offline_fs_kbc"
67+
68+
[image]
69+
authenticated_registry_credentials_uri = "kbs:///default/auth/1"
70+
"#;
71+
let mut file = tempfile::Builder::new()
72+
.append(true)
73+
.suffix(".toml")
74+
.tempfile()
75+
.unwrap();
76+
file.write_all(config.as_bytes()).unwrap();
77+
78+
// without env and from config file
79+
let config_path = file.path().to_str().unwrap().to_string();
80+
let (config, _) = read_config(Some(config_path.clone())).expect("Must be successful");
81+
assert_eq!(
82+
config.image.authenticated_registry_credentials_uri,
83+
Some("kbs:///default/auth/1".into())
84+
);
85+
86+
// overrided by env
87+
env::set_var(
88+
"CDH_DEFAULT_IMAGE_AUTHENTICATED_REGISTRY_CREDENTIALS",
89+
"file:///test",
90+
);
91+
let (config, _) = read_config(Some(config_path.clone())).unwrap();
92+
assert_eq!(
93+
config.image.authenticated_registry_credentials_uri,
94+
Some("file:///test".to_string())
95+
);
96+
env::remove_var("CDH_DEFAULT_IMAGE_AUTHENTICATED_REGISTRY_CREDENTIALS");
97+
98+
// no env again
99+
let (config, _) = read_config(Some(config_path)).unwrap();
100+
assert_eq!(
101+
config.image.authenticated_registry_credentials_uri,
102+
Some("kbs:///default/auth/1".into())
103+
);
104+
}
105+
106+
#[test]
107+
#[serial]
108+
fn test_config_path() {
109+
// --config takes precedence,
110+
// then env.CDH_CONFIG_PATH
111+
112+
let config = CdhConfig::default_with_kernel_cmdline().expect("Must be successful");
113+
let expected = CdhConfig {
114+
log: LogConfig::default(),
115+
kbc: KbsConfig {
116+
name: "offline_fs_kbc".into(),
117+
url: "".into(),
118+
kbs_cert: None,
119+
},
120+
credentials: Vec::new(),
121+
socket: DEFAULT_CDH_SOCKET_ADDR.into(),
122+
image: ImageConfig::from_kernel_cmdline(),
123+
skip_sealed_secret_verification: false,
124+
};
125+
assert_eq!(config, expected);
126+
127+
let config = CdhConfig::from_file("/thing").unwrap_err();
128+
let expected = anyhow!("configuration file \"/thing\" not found");
129+
assert_eq!(format!("{config}"), format!("{expected}"));
130+
131+
env::set_var("CDH_CONFIG_PATH", "/byenv");
132+
let result = read_config(None).unwrap_err();
133+
let expected = anyhow!("failed to read config file /byenv");
134+
assert_eq!(format!("{result}"), format!("{expected}"));
135+
env::remove_var("CDH_CONFIG_PATH");
136+
137+
let config = CdhConfig::from_file("/thing").unwrap_err();
138+
let expected = anyhow!("configuration file \"/thing\" not found");
139+
assert_eq!(format!("{config}"), format!("{expected}"));
140+
}
141+
}

confidential-data-hub/hub/src/bin/grpc-cdh.rs

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,19 @@
33
// SPDX-License-Identifier: Apache-2.0
44
//
55

6-
use std::{env, net::SocketAddr};
6+
use std::net::SocketAddr;
77

88
use anyhow::{Context, Result};
99
use clap::Parser;
10-
use confidential_data_hub::{hub::Hub, CdhConfig};
10+
use confidential_data_hub::hub::Hub;
1111
use shadow_rs::shadow;
1212
use tokio::signal::unix::{signal, SignalKind};
13-
use tracing::info;
13+
use tracing::{debug, info};
1414
use tracing_subscriber::{fmt::Subscriber, EnvFilter};
1515

1616
shadow!(build);
1717

18+
mod config;
1819
mod grpc_server;
1920
mod message;
2021

@@ -32,9 +33,14 @@ struct Cli {
3233

3334
#[tokio::main]
3435
async fn main() -> Result<()> {
36+
let cli = Cli::parse();
37+
38+
let (config, config_log) = config::read_config(cli.config).context("failed to read config")?;
39+
3540
let env_filter = match std::env::var_os("RUST_LOG") {
36-
Some(_) => EnvFilter::try_from_default_env().expect("RUST_LOG is present but invalid"),
37-
None => EnvFilter::new("info"),
41+
Some(_) => EnvFilter::try_from_default_env().context("RUST_LOG is present but invalid")?,
42+
None => EnvFilter::try_new(&config.log.level)
43+
.context(format!("Invalid log level: {}", config.log.level))?,
3844
};
3945

4046
let version = format!(
@@ -60,17 +66,11 @@ rpc: grpc
6066
Subscriber::builder().with_env_filter(env_filter).init();
6167

6268
info!("Welcome to Confidential Containers Confidential Data Hub (gRPC version)!\n\n{version}");
63-
let cli = Cli::parse();
64-
65-
let config = CdhConfig::new(cli.config)?;
69+
info!("{config_log}");
70+
debug!(config = ?config, "Using config");
6671

6772
let cdh_socket = config.socket.parse::<SocketAddr>()?;
6873

69-
info!(
70-
"[gRPC] Confidential Data Hub starts to listen to request: {}",
71-
config.socket
72-
);
73-
7474
let cdh = Hub::new(config).await.context("start CDH")?;
7575

7676
let mut interrupt = signal(SignalKind::interrupt())?;

confidential-data-hub/hub/src/bin/ttrpc-cdh.rs

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,11 @@
33
// SPDX-License-Identifier: Apache-2.0
44
//
55

6-
use std::{env, path::Path, sync::Arc};
6+
use std::{path::Path, sync::Arc};
77

88
use anyhow::{anyhow, Context, Result};
99
use clap::Parser;
10-
use confidential_data_hub::CdhConfig;
11-
use tracing::info;
10+
use tracing::{debug, info};
1211

1312
use protos::ttrpc::cdh::{
1413
api_ttrpc::{
@@ -28,6 +27,7 @@ use ttrpc_server::Server;
2827

2928
shadow!(build);
3029

30+
mod config;
3131
mod message;
3232
mod ttrpc_server;
3333

@@ -47,9 +47,14 @@ struct Cli {
4747

4848
#[tokio::main]
4949
async fn main() -> Result<()> {
50+
let cli = Cli::parse();
51+
52+
let (config, config_log) = config::read_config(cli.config).context("failed to read config")?;
53+
5054
let env_filter = match std::env::var_os("RUST_LOG") {
51-
Some(_) => EnvFilter::try_from_default_env().expect("RUST_LOG is present but invalid"),
52-
None => EnvFilter::new("info"),
55+
Some(_) => EnvFilter::try_from_default_env().context("RUST_LOG is present but invalid")?,
56+
None => EnvFilter::try_new(&config.log.level)
57+
.context(format!("Invalid log level: {}", config.log.level))?,
5358
};
5459

5560
let version = format!(
@@ -75,9 +80,8 @@ rpc: ttrpc
7580
Subscriber::builder().with_env_filter(env_filter).init();
7681

7782
info!("Welcome to Confidential Containers Confidential Data Hub (ttRPC version)!\n\n{version}");
78-
let cli = Cli::parse();
79-
80-
let config = CdhConfig::new(cli.config)?;
83+
info!("{config_log}");
84+
debug!(config = ?config, "Using config");
8185

8286
let unix_socket_path = config
8387
.socket

0 commit comments

Comments
 (0)