1111# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
1212# License for the specific language governing permissions and limitations
1313# under the License.
14+ import hashlib
1415import html .parser
1516import http .cookiejar
1617import ssl
2223from prometheus_client .core import GaugeMetricFamily
2324
2425from rockoon import utils
26+ from rockoon .exporter import settings
2527from rockoon .exporter .collectors .openstack import base
2628
2729LOG = utils .get_logger (__name__ )
@@ -68,7 +70,8 @@ class OsdplHorizonMetricCollector(base.OpenStackBaseMetricCollector):
6870 is_service_available = True
6971
7072 def __init__ (self ):
71- self .opener = None
73+ self ._opener = None
74+ self .ca_cert_checksum = None
7275 self .cookie_jar = http .cookiejar .CookieJar ()
7376 super ().__init__ ()
7477
@@ -109,19 +112,17 @@ def dashboard_url(self):
109112 public_domain_name = self .osdpl .mspec ["public_domain_name" ]
110113 return f"https://horizon.{ public_domain_name } /"
111114
112- def check_login_page (self , dashboard_url , timeout = 10 ):
115+ def check_login_page (self , opener , dashboard_url , timeout = 10 ):
113116 start_time = perf_counter ()
114- response = (
115- self ._get_opener ().open (dashboard_url , timeout = timeout ).read ()
116- )
117+ response = opener .open (dashboard_url , timeout = timeout ).read ()
117118 if "id_username" not in response .decode ("utf-8" ):
118119 raise ValueError ("Cannot find 'id_username' in login page" )
119120 end_time = perf_counter ()
120121 return end_time - start_time
121122
122- def check_user_login (self , dashboard_url , credentials , timeout = 10 ):
123+ def check_user_login (self , opener , dashboard_url , credentials , timeout = 10 ):
123124 start_time = perf_counter ()
124- response = self . _get_opener () .open (dashboard_url ).read ()
125+ response = opener .open (dashboard_url ).read ()
125126
126127 # Grab the CSRF token and default region
127128 parser = HorizonHTMLParser ()
@@ -143,39 +144,41 @@ def check_user_login(self, dashboard_url, credentials, timeout=10):
143144 "domain" : credentials ["user_domain_name" ],
144145 "csrfmiddlewaretoken" : parser .csrf_token ,
145146 }
146- self ._get_opener ().open (
147- req , parse .urlencode (params ).encode (), timeout = timeout
148- )
147+ opener .open (req , parse .urlencode (params ).encode (), timeout = timeout )
149148
150- response = (
151- self ._get_opener ().open (dashboard_url , timeout = timeout ).read ()
152- )
149+ response = opener .open (dashboard_url , timeout = timeout ).read ()
153150 if "Overview" not in response .decode ("utf-8" ):
154151 raise ValueError ("Cannot find 'Overview' in home page" )
155152 end_time = perf_counter ()
156153 return end_time - start_time
157154
158- def _get_opener (self ):
159- if not self .opener :
160- # TODO(dbiletskyi): add ssl verify here
161- ctx = ssl .create_default_context ()
162- ctx .check_hostname = False
163- ctx .verify_mode = ssl .CERT_NONE
164- self .opener = request .build_opener (
165- request .HTTPSHandler (context = ctx ),
166- request .HTTPCookieProcessor (self .cookie_jar ),
167- )
168- return self .opener
155+ @property
156+ def opener (self ):
157+ with open (settings .OSCTL_EXPORTER_CA_CERT_PATH , "rb" ) as f :
158+ current_checksum = hashlib .sha256 (f .read ()).hexdigest ()
159+ if self .ca_cert_checksum == current_checksum and self ._opener :
160+ return self ._opener
161+
162+ self .ca_cert_checksum = current_checksum
163+ ctx = ssl .create_default_context (
164+ cafile = settings .OSCTL_EXPORTER_CA_CERT_PATH
165+ )
166+ self ._opener = request .build_opener (
167+ request .HTTPSHandler (context = ctx ),
168+ request .HTTPCookieProcessor (self .cookie_jar ),
169+ )
170+ return self ._opener
169171
170172 @utils .timeit
171173 def update_login_samples (self ):
172174 login_success_status = 0
173175 login_latency_samples = []
174176 try :
175177 self .cookie_jar .clear ()
178+ opener = self .opener
176179 credentials = self .get_credentials ()
177180 dashboard_url = self .dashboard_url
178- login_page_latency = self .check_login_page (dashboard_url )
181+ login_page_latency = self .check_login_page (opener , dashboard_url )
179182 login_latency_samples .append (
180183 (
181184 [
@@ -186,7 +189,7 @@ def update_login_samples(self):
186189 )
187190 )
188191 login_success_latency = self .check_user_login (
189- dashboard_url , credentials
192+ opener , dashboard_url , credentials
190193 )
191194 login_latency_samples .append (
192195 (
0 commit comments