Skip to content

Commit 90aaa95

Browse files
committed
it compiles. still missing metrics
1 parent 9e271a6 commit 90aaa95

File tree

24 files changed

+755
-128
lines changed

24 files changed

+755
-128
lines changed

Cargo.lock

Lines changed: 50 additions & 15 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,8 @@ similar_names = "allow"
3131
too_many_lines = "allow"
3232

3333
[workspace.dependencies]
34-
ndc-models = { git = "https://github.com/hasura/ndc-spec.git", tag = "v0.2.3" }
35-
ndc-sdk = { git = "https://github.com/hasura/ndc-sdk-rs.git", rev = "e2a1aeb" }
34+
ndc-models = { git = "https://github.com/hasura/ndc-spec.git", tag = "v0.2.4" }
35+
ndc-sdk = { git = "https://github.com/hasura/ndc-sdk-rs.git", rev = "v0.7.0" }
3636
ndc-test = { git = "https://github.com/hasura/ndc-spec.git", tag = "v0.2.3" }
3737

3838
anyhow = "1"

crates/configuration/src/configuration.rs

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,18 @@
11
//! Configuration for the connector.
22
3+
use std::collections::BTreeMap;
34
use std::path::Path;
45

56
use query_engine_metadata::metadata;
7+
use sqlx::postgres::PgConnectOptions;
68

9+
use crate::connect::SslInfo;
710
use crate::environment::Environment;
811
use crate::error::{
912
MakeRuntimeConfigurationError, MultiError, ParseConfigurationError,
1013
WriteParsedConfigurationError,
1114
};
12-
use crate::values::{IsolationLevel, PoolSettings};
15+
use crate::values::{IsolationLevel, PoolSettings, Redacted};
1316
use crate::version3;
1417
use crate::version4;
1518
use crate::version5;
@@ -72,11 +75,35 @@ pub struct Configuration {
7275
pub metadata: metadata::Metadata,
7376
pub configuration_version_tag: VersionTag,
7477
pub pool_settings: PoolSettings,
75-
pub connection_uri: String,
78+
pub connection_settings: ConnectionSettings,
7679
pub isolation_level: IsolationLevel,
7780
pub mutations_version: Option<metadata::mutations::MutationsVersion>,
7881
pub mutations_prefix: Option<String>,
7982
}
83+
84+
type ConnectionName = String;
85+
type ConnectionString = String;
86+
87+
#[derive(Debug)]
88+
pub enum ConnectionSettings {
89+
Static {
90+
connection_uri: Redacted<ConnectionString>,
91+
ssl: Redacted<SslInfo>,
92+
},
93+
Named {
94+
fallback_connection_uri: Redacted<ConnectionString>,
95+
fallback_to_static: bool,
96+
ssl: Redacted<SslInfo>,
97+
connection_uris: BTreeMap<ConnectionName, Redacted<ConnectionString>>,
98+
eager_connections: bool,
99+
},
100+
Dynamic {
101+
fallback_connection_uri: Redacted<ConnectionString>,
102+
fallback_to_static: bool,
103+
ssl: Redacted<SslInfo>,
104+
},
105+
}
106+
80107
pub async fn introspect(
81108
input: ParsedConfiguration,
82109
environment: impl Environment,

crates/configuration/src/connect.rs

Lines changed: 12 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -10,47 +10,40 @@ use crate::values::{ConnectionUri, Secret};
1010

1111
/// Get the connect options from the connection string and environment.
1212
pub fn get_connect_options(
13-
connection_uri: &ConnectionUri,
14-
environment: impl Environment,
13+
connection_uri: &str,
14+
ssl: &SslInfo,
1515
) -> anyhow::Result<PgConnectOptions> {
16-
let uri = match &connection_uri {
17-
ConnectionUri(Secret::Plain(value)) => Cow::Borrowed(value),
18-
ConnectionUri(Secret::FromEnvironment { variable }) => {
19-
Cow::Owned(environment.read(variable)?)
20-
}
21-
};
22-
23-
let connect_options = PgConnectOptions::from_url(&uri.parse()?)?;
24-
25-
let ssl = read_ssl_info(environment);
16+
let connect_options = PgConnectOptions::from_url(&connection_uri.parse()?)?;
2617

2718
// Add ssl client info if present.
28-
let connect_options = match ssl.client {
19+
let connect_options = match &ssl.client {
2920
None => connect_options,
3021
Some(client) => connect_options
31-
.ssl_client_cert_from_pem(client.certificate)
32-
.ssl_client_key_from_pem(client.key),
22+
.ssl_client_cert_from_pem(&client.certificate)
23+
.ssl_client_key_from_pem(&client.key),
3324
};
3425
// Add ssl root certificate if present.
35-
Ok(match ssl.root_certificate {
26+
Ok(match &ssl.root_certificate {
3627
None => connect_options,
37-
Some(root_certificate) => connect_options.ssl_root_cert_from_pem(root_certificate),
28+
Some(root_certificate) => connect_options.ssl_root_cert_from_pem(root_certificate.clone()),
3829
})
3930
}
4031

4132
/// SSL certificate information.
42-
struct SslInfo {
33+
#[derive(Clone)]
34+
pub struct SslInfo {
4335
client: Option<SslClientInfo>,
4436
root_certificate: Option<Vec<u8>>,
4537
}
4638
/// SSL client certificate information.
39+
#[derive(Clone)]
4740
struct SslClientInfo {
4841
certificate: String,
4942
key: String,
5043
}
5144

5245
/// Read ssl certificate and key from the environment.
53-
fn read_ssl_info(environment: impl Environment) -> SslInfo {
46+
pub fn read_ssl_info(environment: impl Environment) -> SslInfo {
5447
// read ssl info
5548
let certificate = environment.read(&Variable::from("CLIENT_CERT")).ok();
5649
let key = environment.read(&Variable::from("CLIENT_KEY")).ok();

crates/configuration/src/error.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,4 +71,9 @@ pub enum MakeRuntimeConfigurationError {
7171
file_path: std::path::PathBuf,
7272
message: String,
7373
},
74+
#[error("malformed environment variable value when processing {file_path}: {message}")]
75+
MalformedEnvironmentVariableValue {
76+
file_path: std::path::PathBuf,
77+
message: String,
78+
},
7479
}

crates/configuration/src/lib.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,14 @@ pub mod version5;
1212

1313
pub use configuration::{
1414
generate_latest_schema, introspect, make_runtime_configuration, parse_configuration,
15-
upgrade_to_latest_version, write_parsed_configuration, Configuration, ParsedConfiguration,
16-
DEFAULT_CONNECTION_URI_VARIABLE,
15+
upgrade_to_latest_version, write_parsed_configuration, Configuration, ConnectionSettings,
16+
ParsedConfiguration, DEFAULT_CONNECTION_URI_VARIABLE,
1717
};
18-
pub use values::{ConnectionUri, IsolationLevel, PoolSettings, Secret};
18+
pub use values::{ConnectionUri, IsolationLevel, PoolSettings, Redacted, Secret};
1919

2020
pub use metrics::Metrics;
2121

22-
pub use connect::get_connect_options;
22+
pub use connect::{get_connect_options, SslInfo};
2323

2424
#[derive(Debug, Copy, Clone)]
2525
pub enum VersionTag {
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
mod isolation_level;
22
mod pool_settings;
3+
mod redacted;
34
mod secret;
45
mod uri;
56

67
pub use isolation_level::IsolationLevel;
78
pub use pool_settings::PoolSettings;
9+
pub use redacted::Redacted;
810
pub use secret::Secret;
911
pub use uri::ConnectionUri;
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
use serde::Deserialize;
2+
3+
/// A struct use to store sensitive information in configuration
4+
/// If printed out for any reason, will redact the inner value
5+
/// While we should not intentionally print out this information anyways, this is more of a safety measure that cannot hurt
6+
/// This also helps us mark the sensitive nature of the value.
7+
#[derive(Clone, PartialEq, Eq, Deserialize)]
8+
pub struct Redacted<T>(T);
9+
10+
impl<T> Redacted<T> {
11+
pub fn new(value: T) -> Self {
12+
Self(value)
13+
}
14+
15+
pub fn into_inner(self) -> T {
16+
self.0
17+
}
18+
19+
pub fn inner(&self) -> &T {
20+
&self.0
21+
}
22+
}
23+
24+
impl<T> std::fmt::Debug for Redacted<T> {
25+
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
26+
f.write_str("[REDACTED]")
27+
}
28+
}

crates/configuration/src/version3/mod.rs

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,13 @@ use tracing::{info_span, Instrument};
1919

2020
use metadata::database;
2121

22+
use crate::configuration::ConnectionSettings;
23+
use crate::connect::read_ssl_info;
2224
use crate::environment::Environment;
2325
use crate::error::{
2426
MakeRuntimeConfigurationError, ParseConfigurationError, WriteParsedConfigurationError,
2527
};
26-
use crate::values::{ConnectionUri, Secret};
28+
use crate::values::{ConnectionUri, Redacted, Secret};
2729
use crate::VersionTag;
2830

2931
const CONFIGURATION_FILENAME: &str = "configuration.json";
@@ -594,10 +596,20 @@ pub fn make_runtime_configuration(
594596
})
595597
}
596598
}?;
599+
600+
let connection_uri = Redacted::new(connection_uri);
601+
let ssl = read_ssl_info(&environment);
602+
let ssl = Redacted::new(ssl);
603+
604+
let connection_settings = ConnectionSettings::Static {
605+
connection_uri,
606+
ssl,
607+
};
608+
597609
Ok(crate::Configuration {
598610
metadata: convert_metadata(configuration.metadata),
599611
pool_settings: configuration.connection_settings.pool_settings,
600-
connection_uri,
612+
connection_settings,
601613
isolation_level: configuration.connection_settings.isolation_level,
602614
mutations_version: convert_mutations_version(configuration.mutations_version),
603615
configuration_version_tag: VersionTag::Version3,

0 commit comments

Comments
 (0)