11
11
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12
12
# License for the specific language governing permissions and limitations
13
13
# under the License.
14
+ import hashlib
14
15
import html .parser
15
16
import http .cookiejar
16
17
import ssl
22
23
from prometheus_client .core import GaugeMetricFamily
23
24
24
25
from rockoon import utils
26
+ from rockoon .exporter import settings
25
27
from rockoon .exporter .collectors .openstack import base
26
28
27
29
LOG = utils .get_logger (__name__ )
@@ -68,7 +70,8 @@ class OsdplHorizonMetricCollector(base.OpenStackBaseMetricCollector):
68
70
is_service_available = True
69
71
70
72
def __init__ (self ):
71
- self .opener = None
73
+ self ._opener = None
74
+ self .ca_cert_checksum = None
72
75
self .cookie_jar = http .cookiejar .CookieJar ()
73
76
super ().__init__ ()
74
77
@@ -109,19 +112,17 @@ def dashboard_url(self):
109
112
public_domain_name = self .osdpl .mspec ["public_domain_name" ]
110
113
return f"https://horizon.{ public_domain_name } /"
111
114
112
- def check_login_page (self , dashboard_url , timeout = 10 ):
115
+ def check_login_page (self , opener , dashboard_url , timeout = 10 ):
113
116
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 ()
117
118
if "id_username" not in response .decode ("utf-8" ):
118
119
raise ValueError ("Cannot find 'id_username' in login page" )
119
120
end_time = perf_counter ()
120
121
return end_time - start_time
121
122
122
- def check_user_login (self , dashboard_url , credentials , timeout = 10 ):
123
+ def check_user_login (self , opener , dashboard_url , credentials , timeout = 10 ):
123
124
start_time = perf_counter ()
124
- response = self . _get_opener () .open (dashboard_url ).read ()
125
+ response = opener .open (dashboard_url ).read ()
125
126
126
127
# Grab the CSRF token and default region
127
128
parser = HorizonHTMLParser ()
@@ -143,39 +144,41 @@ def check_user_login(self, dashboard_url, credentials, timeout=10):
143
144
"domain" : credentials ["user_domain_name" ],
144
145
"csrfmiddlewaretoken" : parser .csrf_token ,
145
146
}
146
- self ._get_opener ().open (
147
- req , parse .urlencode (params ).encode (), timeout = timeout
148
- )
147
+ opener .open (req , parse .urlencode (params ).encode (), timeout = timeout )
149
148
150
- response = (
151
- self ._get_opener ().open (dashboard_url , timeout = timeout ).read ()
152
- )
149
+ response = opener .open (dashboard_url , timeout = timeout ).read ()
153
150
if "Overview" not in response .decode ("utf-8" ):
154
151
raise ValueError ("Cannot find 'Overview' in home page" )
155
152
end_time = perf_counter ()
156
153
return end_time - start_time
157
154
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
169
171
170
172
@utils .timeit
171
173
def update_login_samples (self ):
172
174
login_success_status = 0
173
175
login_latency_samples = []
174
176
try :
175
177
self .cookie_jar .clear ()
178
+ opener = self .opener
176
179
credentials = self .get_credentials ()
177
180
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 )
179
182
login_latency_samples .append (
180
183
(
181
184
[
@@ -186,7 +189,7 @@ def update_login_samples(self):
186
189
)
187
190
)
188
191
login_success_latency = self .check_user_login (
189
- dashboard_url , credentials
192
+ opener , dashboard_url , credentials
190
193
)
191
194
login_latency_samples .append (
192
195
(
0 commit comments