|
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