|
1 | 1 | use std::{env, path::Path, str::FromStr, sync::OnceLock}; |
2 | 2 |
|
3 | 3 | use snafu::{OptionExt, ResultExt, Snafu}; |
| 4 | +use tracing::instrument; |
4 | 5 |
|
5 | 6 | use crate::commons::networking::DomainName; |
6 | 7 |
|
@@ -56,52 +57,64 @@ pub enum Error { |
56 | 57 | /// - <https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/> |
57 | 58 | pub static KUBERNETES_CLUSTER_DOMAIN: OnceLock<DomainName> = OnceLock::new(); |
58 | 59 |
|
| 60 | +#[instrument] |
59 | 61 | pub(crate) fn retrieve_cluster_domain() -> Result<DomainName, Error> { |
60 | 62 | // 1. Read KUBERNETES_CLUSTER_DOMAIN env var |
61 | | - tracing::info!("Trying to determine the Kubernetes cluster domain..."); |
| 63 | + tracing::debug!("Trying to determine the Kubernetes cluster domain..."); |
62 | 64 |
|
63 | 65 | match env::var(KUBERNETES_CLUSTER_DOMAIN_ENV) { |
64 | 66 | Ok(cluster_domain) if !cluster_domain.is_empty() => { |
| 67 | + let cluster_domain = DomainName::from_str(&cluster_domain) |
| 68 | + .context(ParseDomainNameSnafu { cluster_domain })?; |
65 | 69 | tracing::info!( |
66 | | - cluster_domain, |
67 | | - "Kubernetes cluster domain set by environment variable" |
68 | | - ); |
69 | | - return DomainName::from_str(&cluster_domain) |
70 | | - .context(ParseDomainNameSnafu { cluster_domain }); |
71 | | - } |
72 | | - _ => { |
73 | | - tracing::info!( |
74 | | - "The environment variable \"{KUBERNETES_CLUSTER_DOMAIN_ENV}\" is not set or empty" |
| 70 | + %cluster_domain, |
| 71 | + "Using Kubernetes cluster domain from {KUBERNETES_CLUSTER_DOMAIN_ENV} environment variable" |
75 | 72 | ); |
| 73 | + return Ok(cluster_domain); |
76 | 74 | } |
| 75 | + _ => {} |
77 | 76 | }; |
78 | 77 |
|
79 | 78 | // 2. If no env var is set, check if we run in a clustered (Kubernetes/Openshift) environment |
80 | 79 | // by checking if KUBERNETES_SERVICE_HOST is set: If not default to 'cluster.local'. |
81 | | - tracing::info!("Trying to determine the operator runtime environment..."); |
| 80 | + tracing::debug!( |
| 81 | + "Trying to determine the operator runtime environment as environment variable \ |
| 82 | + \"{KUBERNETES_CLUSTER_DOMAIN_ENV}\" is not set" |
| 83 | + ); |
82 | 84 |
|
83 | 85 | match env::var(KUBERNETES_SERVICE_HOST_ENV) { |
84 | 86 | Ok(_) => { |
85 | 87 | let cluster_domain = retrieve_cluster_domain_from_resolv_conf(RESOLVE_CONF_FILE_PATH)?; |
| 88 | + let cluster_domain = DomainName::from_str(&cluster_domain) |
| 89 | + .context(ParseDomainNameSnafu { cluster_domain })?; |
86 | 90 |
|
87 | 91 | tracing::info!( |
88 | | - cluster_domain, |
| 92 | + %cluster_domain, |
89 | 93 | "Using Kubernetes cluster domain from {RESOLVE_CONF_FILE_PATH} file" |
90 | 94 | ); |
91 | 95 |
|
92 | | - DomainName::from_str(&cluster_domain).context(ParseDomainNameSnafu { cluster_domain }) |
| 96 | + Ok(cluster_domain) |
93 | 97 | } |
94 | 98 | Err(_) => { |
95 | | - let cluster_domain = KUBERNETES_CLUSTER_DOMAIN_DEFAULT; |
96 | | - tracing::info!(cluster_domain, "Using default Kubernetes cluster domain"); |
97 | | - DomainName::from_str(cluster_domain).context(ParseDomainNameSnafu { cluster_domain }) |
| 99 | + let cluster_domain = DomainName::from_str(KUBERNETES_CLUSTER_DOMAIN_DEFAULT).context( |
| 100 | + ParseDomainNameSnafu { |
| 101 | + cluster_domain: KUBERNETES_CLUSTER_DOMAIN_DEFAULT, |
| 102 | + }, |
| 103 | + )?; |
| 104 | + |
| 105 | + tracing::info!( |
| 106 | + %cluster_domain, |
| 107 | + "Could not determine Kubernetes cluster domain as the operator is not running within Kubernetes, assuming default Kubernetes cluster domain" |
| 108 | + ); |
| 109 | + Ok(cluster_domain) |
98 | 110 | } |
99 | 111 | } |
100 | 112 | } |
101 | 113 |
|
| 114 | +#[instrument] |
102 | 115 | fn retrieve_cluster_domain_from_resolv_conf<P>(path: P) -> Result<String, Error> |
103 | 116 | where |
104 | | - P: AsRef<Path>, |
| 117 | + P: std::fmt::Debug + AsRef<Path>, |
105 | 118 | { |
106 | 119 | let content = std::fs::read_to_string(path).context(ReadResolvConfFileSnafu)?; |
107 | 120 |
|
|
0 commit comments