@@ -32,35 +32,43 @@ def fetch_alert(self, **notification):
3232class PrometheusRESTController (RESTController ):
3333 def prometheus_proxy (self , method , path , params = None , payload = None ):
3434 # type (str, str, dict, dict)
35- user , password , cert_file = self .get_access_info ('prometheus' )
36- verify = cert_file .name if cert_file else Settings .PROMETHEUS_API_SSL_VERIFY
35+ user , password , ca_cert_file , cert_file , key_file = self .get_access_info ('prometheus' )
36+ verify = ca_cert_file .name if ca_cert_file else Settings .PROMETHEUS_API_SSL_VERIFY
37+ cert = (cert_file .name , key_file .name ) if cert_file and key_file else None
3738 response = self ._proxy (self ._get_api_url (Settings .PROMETHEUS_API_HOST ),
3839 method , path , 'Prometheus' , params , payload ,
39- user = user , password = password , verify = verify )
40- if cert_file :
41- cert_file .close ()
42- os .unlink (cert_file .name )
40+ user = user , password = password , verify = verify ,
41+ cert = cert )
42+ for f in [ca_cert_file , cert_file , key_file ]:
43+ if f :
44+ f .close ()
45+ os .unlink (f .name )
4346 return response
4447
4548 def alert_proxy (self , method , path , params = None , payload = None ):
4649 # type (str, str, dict, dict)
47- user , password , cert_file = self .get_access_info ('alertmanager' )
48- verify = cert_file .name if cert_file else Settings .ALERTMANAGER_API_SSL_VERIFY
50+ user , password , ca_cert_file , cert_file , key_file = self .get_access_info ('alertmanager' )
51+ verify = ca_cert_file .name if ca_cert_file else Settings .ALERTMANAGER_API_SSL_VERIFY
52+ cert = (cert_file .name , key_file .name ) if cert_file and key_file else None
4953 response = self ._proxy (self ._get_api_url (Settings .ALERTMANAGER_API_HOST , version = 'v2' ),
5054 method , path , 'Alertmanager' , params , payload ,
51- user = user , password = password , verify = verify , is_alertmanager = True )
52- if cert_file :
53- cert_file .close ()
54- os .unlink (cert_file .name )
55+ user = user , password = password , verify = verify ,
56+ cert = cert , is_alertmanager = True )
57+ for f in [ca_cert_file , cert_file , key_file ]:
58+ if f :
59+ f .close ()
60+ os .unlink (f .name )
5561 return response
5662
5763 def get_access_info (self , module_name ):
58- # type (str, str, str)
64+ # type (str, str, str, str, srt )
5965 if module_name not in ['prometheus' , 'alertmanager' ]:
6066 raise DashboardException (f'Invalid module name { module_name } ' , component = 'prometheus' )
6167 user = None
6268 password = None
6369 cert_file = None
70+ pkey_file = None
71+ ca_cert_file = None
6472
6573 orch_backend = mgr .get_module_option_ex ('orchestrator' , 'orchestrator' )
6674 if orch_backend == 'cephadm' :
@@ -75,11 +83,25 @@ def get_access_info(self, module_name):
7583 user = access_info ['user' ]
7684 password = access_info ['password' ]
7785 certificate = access_info ['certificate' ]
78- cert_file = tempfile .NamedTemporaryFile (delete = False )
79- cert_file .write (certificate .encode ('utf-8' ))
80- cert_file .flush ()
81-
82- return user , password , cert_file
86+ ca_cert_file = tempfile .NamedTemporaryFile (delete = False )
87+ ca_cert_file .write (certificate .encode ('utf-8' ))
88+ ca_cert_file .flush ()
89+
90+ cert_file = None
91+ cert = mgr .get_localized_store ("crt" ) # type: ignore
92+ if cert is not None :
93+ cert_file = tempfile .NamedTemporaryFile (delete = False )
94+ cert_file .write (cert .encode ('utf-8' ))
95+ cert_file .flush () # cert_tmp must not be gc'ed
96+
97+ pkey_file = None
98+ pkey = mgr .get_localized_store ("key" ) # type: ignore
99+ if pkey is not None :
100+ pkey_file = tempfile .NamedTemporaryFile (delete = False )
101+ pkey_file .write (pkey .encode ('utf-8' ))
102+ pkey_file .flush ()
103+
104+ return user , password , ca_cert_file , cert_file , pkey_file
83105
84106 def _get_api_url (self , host , version = 'v1' ):
85107 return f'{ host .rstrip ("/" )} /api/{ version } '
@@ -88,18 +110,19 @@ def balancer_status(self):
88110 return ceph_service .CephService .send_command ('mon' , 'balancer status' )
89111
90112 def _proxy (self , base_url , method , path , api_name , params = None , payload = None , verify = True ,
91- user = None , password = None , is_alertmanager = False ):
113+ user = None , password = None , is_alertmanager = False , cert = None ):
92114 # type (str, str, str, str, dict, dict, bool)
93115 content = None
94116 try :
95117 from requests .auth import HTTPBasicAuth
96118 auth = HTTPBasicAuth (user , password ) if user and password else None
97119 response = requests .request (method , base_url + path , params = params ,
98120 json = payload , verify = verify ,
121+ cert = cert ,
99122 auth = auth )
100- except Exception :
123+ except Exception as e :
101124 raise DashboardException (
102- "Could not reach {}'s API on {}" .format (api_name , base_url ),
125+ "Could not reach {}'s API on {} error {} " .format (api_name , base_url , e ),
103126 http_status_code = 404 ,
104127 component = 'prometheus' )
105128 try :
0 commit comments