33// External crates
44use serde:: Serialize ;
55
6- use crate :: domain:: topology:: Network ;
6+ use crate :: domain:: grafana:: GrafanaConfig ;
7+ use crate :: domain:: topology:: { Network , PortDerivation } ;
78use crate :: shared:: secrets:: Password ;
89
910use super :: port_definition:: PortDefinition ;
10- use super :: port_derivation:: derive_grafana_ports;
1111
1212/// Grafana service configuration for Docker Compose
1313///
@@ -41,25 +41,19 @@ impl GrafanaServiceConfig {
4141 ///
4242 /// # Arguments
4343 ///
44- /// * `admin_user` - Grafana admin username
45- /// * `admin_password` - Grafana admin password
46- /// * `has_tls` - Whether Grafana has TLS enabled (via Caddy)
44+ /// * `config` - The domain Grafana configuration
4745 /// * `has_caddy` - Whether Caddy TLS proxy is enabled (adds `proxy_network`)
4846 #[ must_use]
49- pub fn new (
50- admin_user : String ,
51- admin_password : Password ,
52- has_tls : bool ,
53- has_caddy : bool ,
54- ) -> Self {
47+ pub fn new ( config : & GrafanaConfig , has_caddy : bool ) -> Self {
5548 let networks = Self :: compute_networks ( has_caddy) ;
56- let port_bindings = derive_grafana_ports ( has_tls) ;
49+ // Use domain PortDerivation trait for port logic
50+ let port_bindings = config. derive_ports ( ) ;
5751 let ports = port_bindings. iter ( ) . map ( PortDefinition :: from) . collect ( ) ;
5852
5953 Self {
60- admin_user,
61- admin_password,
62- has_tls,
54+ admin_user : config . admin_user ( ) . to_string ( ) ,
55+ admin_password : config . admin_password ( ) . clone ( ) ,
56+ has_tls : config . use_tls_proxy ( ) ,
6357 ports,
6458 networks,
6559 }
@@ -80,28 +74,39 @@ impl GrafanaServiceConfig {
8074#[ cfg( test) ]
8175mod tests {
8276 use super :: * ;
77+ use crate :: shared:: DomainName ;
78+
79+ fn make_config ( use_tls_proxy : bool ) -> GrafanaConfig {
80+ if use_tls_proxy {
81+ GrafanaConfig :: new (
82+ "admin" . to_string ( ) ,
83+ "password" . to_string ( ) ,
84+ Some ( DomainName :: new ( "grafana.example.com" ) . unwrap ( ) ) ,
85+ true ,
86+ )
87+ } else {
88+ GrafanaConfig :: new ( "admin" . to_string ( ) , "password" . to_string ( ) , None , false )
89+ }
90+ }
8391
8492 #[ test]
8593 fn it_should_connect_grafana_to_visualization_network ( ) {
86- let config =
87- GrafanaServiceConfig :: new ( "admin" . to_string ( ) , Password :: new ( "password" ) , false , false ) ;
94+ let config = GrafanaServiceConfig :: new ( & make_config ( false ) , false ) ;
8895
8996 assert ! ( config. networks. contains( & Network :: Visualization ) ) ;
9097 }
9198
9299 #[ test]
93100 fn it_should_not_connect_grafana_to_proxy_network_when_caddy_disabled ( ) {
94- let config =
95- GrafanaServiceConfig :: new ( "admin" . to_string ( ) , Password :: new ( "password" ) , false , false ) ;
101+ let config = GrafanaServiceConfig :: new ( & make_config ( false ) , false ) ;
96102
97103 assert_eq ! ( config. networks, vec![ Network :: Visualization ] ) ;
98104 assert ! ( !config. networks. contains( & Network :: Proxy ) ) ;
99105 }
100106
101107 #[ test]
102108 fn it_should_connect_grafana_to_proxy_network_when_caddy_enabled ( ) {
103- let config =
104- GrafanaServiceConfig :: new ( "admin" . to_string ( ) , Password :: new ( "password" ) , true , true ) ;
109+ let config = GrafanaServiceConfig :: new ( & make_config ( true ) , true ) ;
105110
106111 assert_eq ! (
107112 config. networks,
@@ -111,8 +116,7 @@ mod tests {
111116
112117 #[ test]
113118 fn it_should_serialize_networks_to_name_strings ( ) {
114- let config =
115- GrafanaServiceConfig :: new ( "admin" . to_string ( ) , Password :: new ( "password" ) , true , true ) ;
119+ let config = GrafanaServiceConfig :: new ( & make_config ( true ) , true ) ;
116120
117121 let json = serde_json:: to_value ( & config) . expect ( "serialization should succeed" ) ;
118122
@@ -123,17 +127,15 @@ mod tests {
123127
124128 #[ test]
125129 fn it_should_expose_port_3000_when_tls_disabled ( ) {
126- let config =
127- GrafanaServiceConfig :: new ( "admin" . to_string ( ) , Password :: new ( "password" ) , false , false ) ;
130+ let config = GrafanaServiceConfig :: new ( & make_config ( false ) , false ) ;
128131
129132 assert_eq ! ( config. ports. len( ) , 1 ) ;
130133 assert_eq ! ( config. ports[ 0 ] . binding( ) , "3000:3000" ) ;
131134 }
132135
133136 #[ test]
134137 fn it_should_not_expose_ports_when_tls_enabled ( ) {
135- let config =
136- GrafanaServiceConfig :: new ( "admin" . to_string ( ) , Password :: new ( "password" ) , true , true ) ;
138+ let config = GrafanaServiceConfig :: new ( & make_config ( true ) , true ) ;
137139
138140 assert ! ( config. ports. is_empty( ) ) ;
139141 }
0 commit comments