11//! Configuration of an OpenSearch node
22
3+ use std:: str:: FromStr ;
4+
35use serde_json:: json;
46use stackable_operator:: {
57 builder:: pod:: container:: FieldPathEnvVar ,
68 commons:: networking:: DomainName ,
9+ constant,
710 k8s_openapi:: DeepMerge ,
811 v2:: {
912 builder:: pod:: container:: { EnvVarName , EnvVarSet } ,
@@ -140,6 +143,17 @@ const CONFIG_OPTION_TRANSPORT_PUBLISH_HOST: &str = "transport.publish_host";
140143
141144const DEFAULT_OPENSEARCH_HOME : & str = "/stackable/opensearch" ;
142145
146+ constant ! ( ENV_VAR_NAME_DISCOVERY_SEED_HOSTS : EnvVarName = CONFIG_OPTION_DISCOVERY_SEED_HOSTS ) ;
147+ constant ! ( ENV_VAR_NAME_HTTP_PUBLISH_HOST : EnvVarName = CONFIG_OPTION_HTTP_PUBLISH_HOST ) ;
148+ constant ! ( ENV_VAR_NAME_INITIAL_CLUSTER_MANAGER_NODES : EnvVarName = CONFIG_OPTION_INITIAL_CLUSTER_MANAGER_NODES ) ;
149+ constant ! ( ENV_VAR_NAME_NETWORK_PUBLISH_HOST : EnvVarName = CONFIG_OPTION_NETWORK_PUBLISH_HOST ) ;
150+ constant ! ( ENV_VAR_NAME_NODE_NAME : EnvVarName = CONFIG_OPTION_NODE_NAME ) ;
151+ constant ! ( ENV_VAR_NAME_NODE_ROLES : EnvVarName = CONFIG_OPTION_NODE_ROLES ) ;
152+ constant ! ( ENV_VAR_NAME_OPENSEARCH_HOME : EnvVarName = "OPENSEARCH_HOME" ) ;
153+ constant ! ( ENV_VAR_NAME_OPENSEARCH_PATH_CONF : EnvVarName = "OPENSEARCH_PATH_CONF" ) ;
154+ constant ! ( ENV_VAR_NAME_POD_NAME : EnvVarName = "_POD_NAME" ) ;
155+ constant ! ( ENV_VAR_NAME_TRANSPORT_PUBLISH_HOST : EnvVarName = CONFIG_OPTION_TRANSPORT_PUBLISH_HOST ) ;
156+
143157/// Configuration of an OpenSearch node based on the cluster and role-group configuration
144158pub struct NodeConfig {
145159 cluster : ValidatedCluster ,
@@ -295,36 +309,36 @@ impl NodeConfig {
295309 . with_field_path (
296310 // Prefix with an underscore, so that it occurs before the other environment
297311 // variables which depend on it.
298- & EnvVarName :: from_str_unsafe ( "_POD_NAME" ) ,
312+ & ENV_VAR_NAME_POD_NAME ,
299313 & FieldPathEnvVar :: Name ,
300314 )
301315 // Set the OpenSearch node name to the Pod name.
302316 // The node name is used e.g. for INITIAL_CLUSTER_MANAGER_NODES.
303317 . with_field_path (
304- & EnvVarName :: from_str_unsafe ( CONFIG_OPTION_NODE_NAME ) ,
318+ & ENV_VAR_NAME_NODE_NAME ,
305319 & FieldPathEnvVar :: Name ,
306320 )
307321 . with_value (
308- & EnvVarName :: from_str_unsafe ( CONFIG_OPTION_NETWORK_PUBLISH_HOST ) ,
322+ & ENV_VAR_NAME_NETWORK_PUBLISH_HOST ,
309323 & fqdn,
310324 )
311325 . with_value (
312- & EnvVarName :: from_str_unsafe ( CONFIG_OPTION_TRANSPORT_PUBLISH_HOST ) ,
326+ & ENV_VAR_NAME_TRANSPORT_PUBLISH_HOST ,
313327 & fqdn,
314328 )
315329 . with_value (
316- & EnvVarName :: from_str_unsafe ( CONFIG_OPTION_HTTP_PUBLISH_HOST ) ,
330+ & ENV_VAR_NAME_HTTP_PUBLISH_HOST ,
317331 & fqdn,
318332 )
319333 . with_value (
320- & EnvVarName :: from_str_unsafe ( CONFIG_OPTION_DISCOVERY_SEED_HOSTS ) ,
334+ & ENV_VAR_NAME_DISCOVERY_SEED_HOSTS ,
321335 format ! (
322336 "{}.{}.svc.{}" ,
323337 self . seed_nodes_service_name, self . cluster. namespace, self . cluster_domain_name
324338 ) ,
325339 )
326340 . with_value (
327- & EnvVarName :: from_str_unsafe ( CONFIG_OPTION_NODE_ROLES ) ,
341+ & ENV_VAR_NAME_NODE_ROLES ,
328342 Self :: to_comma_separated_list (
329343 & self
330344 . role_group_config
@@ -339,7 +353,7 @@ impl NodeConfig {
339353
340354 if let Some ( initial_cluster_manager_nodes) = self . initial_cluster_manager_nodes ( ) {
341355 env_vars = env_vars. with_value (
342- & EnvVarName :: from_str_unsafe ( CONFIG_OPTION_INITIAL_CLUSTER_MANAGER_NODES ) ,
356+ & ENV_VAR_NAME_INITIAL_CLUSTER_MANAGER_NODES ,
343357 initial_cluster_manager_nodes,
344358 ) ;
345359 }
@@ -456,7 +470,7 @@ impl NodeConfig {
456470 /// Return content of the `OPENSEARCH_HOME` environment variable from envOverrides or default to `DEFAULT_OPENSEARCH_HOME`
457471 pub fn opensearch_home ( & self ) -> String {
458472 self . environment_variables ( )
459- . get ( & EnvVarName :: from_str_unsafe ( "OPENSEARCH_HOME" ) )
473+ . get ( & ENV_VAR_NAME_OPENSEARCH_HOME )
460474 . and_then ( |env_var| env_var. value . clone ( ) )
461475 . unwrap_or ( DEFAULT_OPENSEARCH_HOME . to_owned ( ) )
462476 }
@@ -465,7 +479,7 @@ impl NodeConfig {
465479 pub fn opensearch_path_conf ( & self ) -> String {
466480 let opensearch_home = self . opensearch_home ( ) ;
467481 self . environment_variables ( )
468- . get ( & EnvVarName :: from_str_unsafe ( "OPENSEARCH_PATH_CONF" ) )
482+ . get ( & ENV_VAR_NAME_OPENSEARCH_PATH_CONF )
469483 . and_then ( |env_var| env_var. value . clone ( ) )
470484 . unwrap_or ( format ! ( "{opensearch_home}/config" ) )
471485 }
@@ -675,6 +689,21 @@ mod tests {
675689 ) ;
676690 }
677691
692+ #[ test]
693+ fn test_constants ( ) {
694+ // Test that dereferencing the constants does not panic.
695+ let _ = * ENV_VAR_NAME_DISCOVERY_SEED_HOSTS ;
696+ let _ = * ENV_VAR_NAME_HTTP_PUBLISH_HOST ;
697+ let _ = * ENV_VAR_NAME_INITIAL_CLUSTER_MANAGER_NODES ;
698+ let _ = * ENV_VAR_NAME_NETWORK_PUBLISH_HOST ;
699+ let _ = * ENV_VAR_NAME_NODE_NAME ;
700+ let _ = * ENV_VAR_NAME_NODE_ROLES ;
701+ let _ = * ENV_VAR_NAME_OPENSEARCH_HOME ;
702+ let _ = * ENV_VAR_NAME_OPENSEARCH_PATH_CONF ;
703+ let _ = * ENV_VAR_NAME_POD_NAME ;
704+ let _ = * ENV_VAR_NAME_TRANSPORT_PUBLISH_HOST ;
705+ }
706+
678707 #[ test]
679708 pub fn test_super_admin_dn ( ) {
680709 let node_config = node_config ( TestConfig :: default ( ) ) ;
0 commit comments