Skip to content

Commit cd3c53c

Browse files
Fix loading of environment variables through config-rs crates
* Use std::env::var instead of `config::Environment` * Load environment variables even if configuration file is provided Signed-off-by: Florentin Dubois <florentin.dubois@clever-cloud.com>
1 parent 4038e45 commit cd3c53c

File tree

3 files changed

+141
-31
lines changed

3 files changed

+141
-31
lines changed

src/main.rs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ pub enum Error {
3434
Configuration(svc::cfg::Error),
3535
#[error("failed to set subscriber, {0}")]
3636
Subscriber(tracing::subscriber::SetGlobalDefaultError),
37+
#[cfg(feature = "trace")]
3738
#[error("failed to build tracing subscription")]
3839
Subscription(opentelemetry::trace::TraceError),
3940
}
@@ -62,6 +63,7 @@ impl From<tracing::subscriber::SetGlobalDefaultError> for Error {
6263
}
6364
}
6465

66+
#[cfg(feature = "trace")]
6567
impl From<opentelemetry::trace::TraceError> for Error {
6668
fn from(err: opentelemetry::trace::TraceError) -> Self {
6769
Self::Subscription(err)
@@ -100,22 +102,22 @@ pub(crate) async fn main(args: Args) -> Result<(), Error> {
100102
});
101103

102104
#[cfg(feature = "trace")]
103-
if let Some(jaeger) = &config.jaeger {
105+
if !config.jaeger.endpoint.is_empty() {
104106
info!(
105107
"Start to trace using jaeger with opentelemetry compatibility on endpoint {}",
106-
jaeger.endpoint
108+
&config.jaeger.endpoint
107109
);
108110
global::set_text_map_propagator(Propagator::new());
109111

110112
let mut builder = opentelemetry_jaeger::new_pipeline()
111-
.with_collector_endpoint(jaeger.endpoint.to_owned())
113+
.with_collector_endpoint(config.jaeger.endpoint.to_owned())
112114
.with_service_name(env!("CARGO_PKG_NAME"));
113115

114-
if let Some(user) = &jaeger.user {
116+
if let Some(user) = &config.jaeger.user {
115117
builder = builder.with_collector_username(user);
116118
}
117119

118-
if let Some(password) = &jaeger.password {
120+
if let Some(password) = &config.jaeger.password {
119121
builder = builder.with_collector_password(password);
120122
}
121123

src/svc/cfg.rs

Lines changed: 133 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@ use std::{
99
};
1010

1111
use clevercloud_sdk::{oauth10a::Credentials, PUBLIC_ENDPOINT};
12-
use config::{Config, ConfigError, Environment, File};
12+
use config::{Config, ConfigError, File};
1313
use serde::{Deserialize, Serialize};
14-
use tracing::{info, warn};
14+
use tracing::warn;
1515

1616
// -----------------------------------------------------------------------------
1717
// Constants
@@ -122,7 +122,7 @@ pub struct Configuration {
122122
pub sentry: Sentry,
123123
#[cfg(feature = "trace")]
124124
#[serde(rename = "jaeger")]
125-
pub jaeger: Option<Jaeger>,
125+
pub jaeger: Jaeger,
126126
}
127127

128128
impl TryFrom<PathBuf> for Configuration {
@@ -131,21 +131,75 @@ impl TryFrom<PathBuf> for Configuration {
131131
#[cfg_attr(feature = "trace", tracing::instrument)]
132132
fn try_from(path: PathBuf) -> Result<Self, Self::Error> {
133133
Config::builder()
134-
.set_default("api.endpoint", PUBLIC_ENDPOINT)
134+
// -----------------------------------------------------------------
135+
// Api
136+
.set_default(
137+
"api.endpoint",
138+
env::var("CLEVER_OPERATOR_API_ENDPOINT")
139+
.unwrap_or_else(|_err| PUBLIC_ENDPOINT.to_string()),
140+
)
135141
.map_err(|err| Error::Default("api.endpoint".into(), err))?
136-
.set_default("api.token", "")
142+
.set_default(
143+
"api.token",
144+
env::var("CLEVER_OPERATOR_API_TOKEN").unwrap_or_else(|_err| "".to_string()),
145+
)
137146
.map_err(|err| Error::Default("api.token".into(), err))?
138-
.set_default("api.secret", "")
147+
.set_default(
148+
"api.secret",
149+
env::var("CLEVER_OPERATOR_API_SECRET").unwrap_or_else(|_err| "".to_string()),
150+
)
139151
.map_err(|err| Error::Default("api.secret".into(), err))?
140-
.set_default("api.consumerKey", "")
152+
.set_default(
153+
"api.consumerKey",
154+
env::var("CLEVER_OPERATOR_API_CONSUMER_KEY").unwrap_or_else(|_err| "".to_string()),
155+
)
141156
.map_err(|err| Error::Default("api.consumerKey".into(), err))?
142-
.set_default("api.consumerSecret", "")
157+
.set_default(
158+
"api.consumerSecret",
159+
env::var("CLEVER_OPERATOR_API_CONSUMER_SECRET")
160+
.unwrap_or_else(|_err| "".to_string()),
161+
)
143162
.map_err(|err| Error::Default("api.consumerSecret".into(), err))?
144-
.set_default("operator.listen", OPERATOR_LISTEN)
163+
// -----------------------------------------------------------------
164+
// Operator
165+
.set_default(
166+
"operator.listen",
167+
env::var("CLEVER_OPERATOR_OPERATOR_LISTEN")
168+
.unwrap_or_else(|_err| OPERATOR_LISTEN.to_string()),
169+
)
145170
.map_err(|err| Error::Default("operator.listen".into(), err))?
146-
.add_source(Environment::with_prefix(
147-
&env!("CARGO_PKG_NAME").replace('-', "_"),
148-
))
171+
// -----------------------------------------------------------------
172+
// Sentry
173+
.set_default(
174+
"sentry.dsn",
175+
env::var("CLEVER_OPERATOR_SENTRY_DSN")
176+
.map(Some)
177+
.unwrap_or_else(|_err| None),
178+
)
179+
.map_err(|err| Error::Default("sentry.dsn".into(), err))?
180+
// -----------------------------------------------------------------
181+
// Jaeger
182+
.set_default(
183+
"jaeger.endpoint",
184+
env::var("CLEVER_OPERATOR_JAEGER_ENDPOINT").unwrap_or_else(|_err| "".to_string()),
185+
)
186+
.map_err(|err| Error::Default("jaeger.endpoint".into(), err))?
187+
.set_default(
188+
"jaeger.user",
189+
env::var("CLEVER_OPERATOR_JAEGER_USER")
190+
.map(Some)
191+
.unwrap_or_else(|_err| None),
192+
)
193+
.map_err(|err| Error::Default("jaeger.user".into(), err))?
194+
.set_default(
195+
"jaeger.password",
196+
env::var("CLEVER_OPERATOR_JAEGER_PASSWORD")
197+
.map(Some)
198+
.unwrap_or_else(|_err| None),
199+
)
200+
.map_err(|err| Error::Default("jaeger.password".into(), err))?
201+
// -----------------------------------------------------------------
202+
// Files
149203
.add_source(File::from(path).required(true))
150204
.build()
151205
.map_err(Error::Build)?
@@ -158,21 +212,75 @@ impl Configuration {
158212
#[cfg_attr(feature = "trace", tracing::instrument)]
159213
pub fn try_default() -> Result<Self, Error> {
160214
Config::builder()
161-
.set_default("api.endpoint", PUBLIC_ENDPOINT)
215+
// -----------------------------------------------------------------
216+
// Api
217+
.set_default(
218+
"api.endpoint",
219+
env::var("CLEVER_OPERATOR_API_ENDPOINT")
220+
.unwrap_or_else(|_err| PUBLIC_ENDPOINT.to_string()),
221+
)
162222
.map_err(|err| Error::Default("api.endpoint".into(), err))?
163-
.set_default("api.token", "")
223+
.set_default(
224+
"api.token",
225+
env::var("CLEVER_OPERATOR_API_TOKEN").unwrap_or_else(|_err| "".to_string()),
226+
)
164227
.map_err(|err| Error::Default("api.token".into(), err))?
165-
.set_default("api.secret", "")
228+
.set_default(
229+
"api.secret",
230+
env::var("CLEVER_OPERATOR_API_SECRET").unwrap_or_else(|_err| "".to_string()),
231+
)
166232
.map_err(|err| Error::Default("api.secret".into(), err))?
167-
.set_default("api.consumerKey", "")
233+
.set_default(
234+
"api.consumerKey",
235+
env::var("CLEVER_OPERATOR_API_CONSUMER_KEY").unwrap_or_else(|_err| "".to_string()),
236+
)
168237
.map_err(|err| Error::Default("api.consumerKey".into(), err))?
169-
.set_default("api.consumerSecret", "")
238+
.set_default(
239+
"api.consumerSecret",
240+
env::var("CLEVER_OPERATOR_API_CONSUMER_SECRET")
241+
.unwrap_or_else(|_err| "".to_string()),
242+
)
170243
.map_err(|err| Error::Default("api.consumerSecret".into(), err))?
171-
.set_default("operator.listen", OPERATOR_LISTEN)
244+
// -----------------------------------------------------------------
245+
// Operator
246+
.set_default(
247+
"operator.listen",
248+
env::var("CLEVER_OPERATOR_OPERATOR_LISTEN")
249+
.unwrap_or_else(|_err| OPERATOR_LISTEN.to_string()),
250+
)
172251
.map_err(|err| Error::Default("operator.listen".into(), err))?
173-
.add_source(Environment::with_prefix(
174-
&env!("CARGO_PKG_NAME").replace('-', "_"),
175-
))
252+
// -----------------------------------------------------------------
253+
// Sentry
254+
.set_default(
255+
"sentry.dsn",
256+
env::var("CLEVER_OPERATOR_SENTRY_DSN")
257+
.map(Some)
258+
.unwrap_or_else(|_err| None),
259+
)
260+
.map_err(|err| Error::Default("sentry.dsn".into(), err))?
261+
// -----------------------------------------------------------------
262+
// Jaeger
263+
.set_default(
264+
"jaeger.endpoint",
265+
env::var("CLEVER_OPERATOR_JAEGER_ENDPOINT").unwrap_or_else(|_err| "".to_string()),
266+
)
267+
.map_err(|err| Error::Default("jaeger.endpoint".into(), err))?
268+
.set_default(
269+
"jaeger.user",
270+
env::var("CLEVER_OPERATOR_JAEGER_USER")
271+
.map(Some)
272+
.unwrap_or_else(|_err| None),
273+
)
274+
.map_err(|err| Error::Default("jaeger.user".into(), err))?
275+
.set_default(
276+
"jaeger.password",
277+
env::var("CLEVER_OPERATOR_JAEGER_PASSWORD")
278+
.map(Some)
279+
.unwrap_or_else(|_err| None),
280+
)
281+
.map_err(|err| Error::Default("jaeger.password".into(), err))?
282+
// -----------------------------------------------------------------
283+
// Files
176284
.add_source(
177285
File::from(PathBuf::from(format!(
178286
"/usr/share/{}/config",
@@ -214,16 +322,16 @@ impl Configuration {
214322
#[cfg_attr(feature = "trace", tracing::instrument)]
215323
pub fn help(&self) {
216324
#[cfg(feature = "logging")]
217-
info!("Build with 'logging' feature flag");
325+
tracing::info!("Build with 'logging' feature flag");
218326

219327
#[cfg(feature = "metrics")]
220-
info!("Build with 'metrics' feature flag");
328+
tracing::info!("Build with 'metrics' feature flag");
221329

222330
#[cfg(feature = "trace")]
223-
info!("Build with 'trace' feature flag");
331+
tracing::info!("Build with 'trace' feature flag");
224332

225333
#[cfg(feature = "tracker")]
226-
info!("Build with 'tracker' feature flag");
334+
tracing::info!("Build with 'tracker' feature flag");
227335

228336
if self.api.consumer_key.is_empty() {
229337
warn!("Configuration key 'api.consumerKey' has an empty value");

src/svc/k8s/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,7 @@ where
157157
.inc();
158158

159159
#[cfg(not(feature = "trace"))]
160-
let result = Self::delete(&ctx, obj.to_owned()).await;
160+
let result = Self::delete(ctx, obj.to_owned()).await;
161161
#[cfg(feature = "trace")]
162162
let result = Self::delete(ctx, obj.to_owned())
163163
.instrument(tracing::info_span!("Reconciler::delete"))

0 commit comments

Comments
 (0)