11import logging
2- from typing import List , Any , Tuple , Dict , cast , Optional
2+ from typing import List , Any , Tuple , Dict , cast , TYPE_CHECKING
33
44from orchestrator import DaemonDescription
55from ceph .deployment .service_spec import MgmtGatewaySpec , GrafanaSpec
66from cephadm .services .cephadmservice import CephadmService , CephadmDaemonDeploySpec , get_dashboard_endpoints
77
8+ if TYPE_CHECKING :
9+ from ..module import CephadmOrchestrator
810
911logger = logging .getLogger (__name__ )
1012
@@ -36,10 +38,11 @@ def get_active_daemon(self, daemon_descrs: List[DaemonDescription]) -> DaemonDes
3638 # if empty list provided, return empty Daemon Desc
3739 return DaemonDescription ()
3840
39- def get_oauth2_service_url (self ) -> Optional [str ]:
40- # TODO(redo): check how can we create several servers for HA
41- oauth2_servers = self .get_service_endpoints ('oauth2-proxy' )
42- return f'https://{ oauth2_servers [0 ]} ' if oauth2_servers else None
41+ def get_mgmt_gw_ips (self , svc_spec : MgmtGatewaySpec , daemon_spec : CephadmDaemonDeploySpec ) -> List [str ]:
42+ mgmt_gw_ips = [self .mgr .inventory .get_addr (daemon_spec .host )]
43+ if svc_spec .virtual_ip is not None :
44+ mgmt_gw_ips .append (svc_spec .virtual_ip )
45+ return mgmt_gw_ips
4346
4447 def config_dashboard (self , daemon_descrs : List [DaemonDescription ]) -> None :
4548 # we adjust the standby behaviour so rev-proxy can pick correctly the active instance
@@ -56,9 +59,9 @@ def get_external_certificates(self, svc_spec: MgmtGatewaySpec, daemon_spec: Ceph
5659 key = svc_spec .ssl_certificate_key
5760 else :
5861 # not provided on the spec, let's generate self-sigend certificates
59- addr = self .mgr . inventory . get_addr ( daemon_spec . host )
62+ ips = self .get_mgmt_gw_ips ( svc_spec , daemon_spec )
6063 host_fqdn = self .mgr .get_fqdn (daemon_spec .host )
61- cert , key = self .mgr .cert_mgr .generate_cert (host_fqdn , addr )
64+ cert , key = self .mgr .cert_mgr .generate_cert (host_fqdn , ips )
6265 # save certificates
6366 if cert and key :
6467 self .mgr .cert_key_store .save_cert ('mgmt_gw_cert' , cert )
@@ -67,23 +70,33 @@ def get_external_certificates(self, svc_spec: MgmtGatewaySpec, daemon_spec: Ceph
6770 logger .error ("Failed to obtain certificate and key from mgmt-gateway." )
6871 return cert , key
6972
70- def get_internal_certificates (self , daemon_spec : CephadmDaemonDeploySpec ) -> Tuple [str , str ]:
71- node_ip = self .mgr . inventory . get_addr ( daemon_spec . host )
73+ def get_internal_certificates (self , svc_spec : MgmtGatewaySpec , daemon_spec : CephadmDaemonDeploySpec ) -> Tuple [str , str ]:
74+ ips = self .get_mgmt_gw_ips ( svc_spec , daemon_spec )
7275 host_fqdn = self .mgr .get_fqdn (daemon_spec .host )
73- return self .mgr .cert_mgr .generate_cert (host_fqdn , node_ip )
76+ return self .mgr .cert_mgr .generate_cert (host_fqdn , ips )
7477
75- def get_mgmt_gateway_deps (self ) -> List [str ]:
76- # url_prefix for the following services depends on the presence of mgmt-gateway
77- deps : List [str ] = []
78- deps += [d .name () for d in self .mgr .cache .get_daemons_by_service ('prometheus' )]
79- deps += [d .name () for d in self .mgr .cache .get_daemons_by_service ('alertmanager' )]
80- deps += [d .name () for d in self .mgr .cache .get_daemons_by_service ('grafana' )]
81- deps += [d .name () for d in self .mgr .cache .get_daemons_by_service ('oauth2-proxy' )]
78+ def get_service_discovery_endpoints (self ) -> List [str ]:
79+ sd_endpoints = []
8280 for dd in self .mgr .cache .get_daemons_by_service ('mgr' ):
83- # we consider mgr a dep even if the dashboard is disabled
84- # in order to be consistent with _calc_daemon_deps().
85- deps .append (dd .name ())
81+ assert dd .hostname is not None
82+ addr = dd .ip if dd .ip else self .mgr .inventory .get_addr (dd .hostname )
83+ sd_endpoints .append (f"{ addr } :{ self .mgr .service_discovery_port } " )
84+ return sd_endpoints
8685
86+ @staticmethod
87+ def get_dependencies (mgr : "CephadmOrchestrator" ) -> List [str ]:
88+ # url_prefix for the following services depends on the presence of mgmt-gateway
89+ deps = [
90+ f'{ d .name ()} :{ d .ports [0 ]} ' if d .ports else d .name ()
91+ for service in ['prometheus' , 'alertmanager' , 'grafana' , 'oauth2-proxy' ]
92+ for d in mgr .cache .get_daemons_by_service (service )
93+ ]
94+ # dashboard and service discovery urls depend on the mgr daemons
95+ deps += [
96+ f'{ d .name ()} '
97+ for service in ['mgr' ]
98+ for d in mgr .cache .get_daemons_by_service (service )
99+ ]
87100 return deps
88101
89102 def generate_config (self , daemon_spec : CephadmDaemonDeploySpec ) -> Tuple [Dict [str , Any ], List [str ]]:
@@ -94,6 +107,8 @@ def generate_config(self, daemon_spec: CephadmDaemonDeploySpec) -> Tuple[Dict[st
94107 prometheus_endpoints = self .get_service_endpoints ('prometheus' )
95108 alertmanager_endpoints = self .get_service_endpoints ('alertmanager' )
96109 grafana_endpoints = self .get_service_endpoints ('grafana' )
110+ oauth2_proxy_endpoints = self .get_service_endpoints ('oauth2-proxy' )
111+ service_discovery_endpoints = self .get_service_discovery_endpoints ()
97112 try :
98113 grafana_spec = cast (GrafanaSpec , self .mgr .spec_store ['grafana' ].spec )
99114 grafana_protocol = grafana_spec .protocol
@@ -104,7 +119,9 @@ def generate_config(self, daemon_spec: CephadmDaemonDeploySpec) -> Tuple[Dict[st
104119 'dashboard_endpoints' : dashboard_endpoints ,
105120 'prometheus_endpoints' : prometheus_endpoints ,
106121 'alertmanager_endpoints' : alertmanager_endpoints ,
107- 'grafana_endpoints' : grafana_endpoints
122+ 'grafana_endpoints' : grafana_endpoints ,
123+ 'oauth2_proxy_endpoints' : oauth2_proxy_endpoints ,
124+ 'service_discovery_endpoints' : service_discovery_endpoints
108125 }
109126 server_context = {
110127 'spec' : svc_spec ,
@@ -117,11 +134,12 @@ def generate_config(self, daemon_spec: CephadmDaemonDeploySpec) -> Tuple[Dict[st
117134 'prometheus_endpoints' : prometheus_endpoints ,
118135 'alertmanager_endpoints' : alertmanager_endpoints ,
119136 'grafana_endpoints' : grafana_endpoints ,
120- 'oauth2_proxy_url' : self .get_oauth2_service_url (),
137+ 'service_discovery_endpoints' : service_discovery_endpoints ,
138+ 'enable_oauth2_proxy' : bool (oauth2_proxy_endpoints ),
121139 }
122140
123141 cert , key = self .get_external_certificates (svc_spec , daemon_spec )
124- internal_cert , internal_pkey = self .get_internal_certificates (daemon_spec )
142+ internal_cert , internal_pkey = self .get_internal_certificates (svc_spec , daemon_spec )
125143 daemon_config = {
126144 "files" : {
127145 "nginx.conf" : self .mgr .template .render (self .SVC_TEMPLATE_PATH , main_context ),
@@ -136,7 +154,7 @@ def generate_config(self, daemon_spec: CephadmDaemonDeploySpec) -> Tuple[Dict[st
136154 daemon_config ["files" ]["nginx.crt" ] = cert
137155 daemon_config ["files" ]["nginx.key" ] = key
138156
139- return daemon_config , sorted (self . get_mgmt_gateway_deps ( ))
157+ return daemon_config , sorted (MgmtGatewayService . get_dependencies ( self . mgr ))
140158
141159 def pre_remove (self , daemon : DaemonDescription ) -> None :
142160 """
0 commit comments