19
19
LessEqualOperator , RegexOperator ,
20
20
GreaterEqualOperator )
21
21
22
+ from pypuppetdb .types import Node
23
+ from pypuppetdb .utils import json_to_datetime
24
+
22
25
from puppetboard .forms import ENABLED_QUERY_ENDPOINTS , QueryForm
23
26
from puppetboard .utils import (get_or_abort , yield_or_stop ,
24
27
get_db_version , is_bool )
@@ -152,6 +155,10 @@ def index(env):
152
155
'noop' : 0
153
156
}
154
157
158
+ nodes = []
159
+
160
+ node_status_detail_enabled = app .config ['NODES_STATUS_DETAIL_ENABLED' ]
161
+ resource_stats_enabled = app .config ['RESOURCES_STATS_ENABLED' ]
155
162
if env == '*' :
156
163
query = app .config ['OVERVIEW_FILTER' ]
157
164
@@ -164,7 +171,7 @@ def index(env):
164
171
"{0}{1}" .format (prefix , ':%sname=num-nodes' % query_type ),
165
172
version = metric_version )
166
173
167
- if app . config [ 'RESOURCES_STATS_ENABLED' ] :
174
+ if resource_stats_enabled :
168
175
num_resources = get_or_abort (
169
176
puppetdb .metric ,
170
177
"{0}{1}" .format (prefix , ':%sname=num-resources' % query_type ),
@@ -179,6 +186,9 @@ def index(env):
179
186
(num_resources ['Value' ] / num_nodes ['Value' ]))
180
187
except ZeroDivisionError :
181
188
metrics ['avg_resources_node' ] = 0
189
+
190
+ if not node_status_detail_enabled :
191
+ nodes = get_node_status_summary (query )
182
192
else :
183
193
query = AndOperator ()
184
194
query .add (EqualsOperator ('catalog_environment' , env ))
@@ -197,8 +207,7 @@ def index(env):
197
207
198
208
metrics ['num_nodes' ] = num_nodes [0 ]['count' ]
199
209
200
- if app .config ['RESOURCES_STATS_ENABLED' ]:
201
-
210
+ if resource_stats_enabled :
202
211
num_resources_query = ExtractOperator ()
203
212
num_resources_query .add_field (FunctionOperator ('count' ))
204
213
num_resources_query .add_query (EqualsOperator ("environment" , env ))
@@ -215,26 +224,29 @@ def index(env):
215
224
except ZeroDivisionError :
216
225
metrics ['avg_resources_node' ] = 0
217
226
218
- if app .config ['NODES_STATUS_DETAIL_ENABLED' ]:
227
+ if not node_status_detail_enabled :
228
+ nodes = get_node_status_summary (query )
219
229
230
+ if node_status_detail_enabled :
220
231
nodes = get_or_abort (puppetdb .nodes ,
221
232
query = query ,
222
233
unreported = app .config ['UNRESPONSIVE_HOURS' ],
223
234
with_status = True ,
224
235
with_event_numbers = app .config ['WITH_EVENT_NUMBERS' ])
225
236
226
- for node in nodes :
227
- if node .status == 'unreported' :
228
- stats ['unreported' ] += 1
229
- elif node .status == 'changed' :
230
- stats ['changed' ] += 1
231
- elif node .status == 'failed' :
232
- stats ['failed' ] += 1
233
- elif node .status == 'noop' :
234
- stats ['noop' ] += 1
235
- else :
236
- stats ['unchanged' ] += 1
237
+ for node in nodes :
238
+ if node .status == 'unreported' :
239
+ stats ['unreported' ] += 1
240
+ elif node .status == 'changed' :
241
+ stats ['changed' ] += 1
242
+ elif node .status == 'failed' :
243
+ stats ['failed' ] += 1
244
+ elif node .status == 'noop' :
245
+ stats ['noop' ] += 1
246
+ else :
247
+ stats ['unchanged' ] += 1
237
248
249
+ if node_status_detail_enabled :
238
250
if node .status != 'unchanged' :
239
251
nodes_overview .append (node )
240
252
@@ -248,6 +260,33 @@ def index(env):
248
260
)
249
261
250
262
263
+ def get_node_status_summary (inner_query ):
264
+ node_status_query = ExtractOperator ()
265
+ node_status_query .add_field ('certname' )
266
+ node_status_query .add_field ('report_timestamp' )
267
+ node_status_query .add_field ('latest_report_status' )
268
+ node_status_query .add_query (inner_query )
269
+
270
+ node_status = get_or_abort (
271
+ puppetdb ._query ,
272
+ 'nodes' ,
273
+ query = node_status_query
274
+ )
275
+
276
+ now = datetime .utcnow ()
277
+ node_infos = []
278
+ for node_state in node_status :
279
+ last_report = json_to_datetime (node_state ['report_timestamp' ])
280
+ last_report = last_report .replace (tzinfo = None )
281
+ unreported_border = now - timedelta (hours = app .config ['UNRESPONSIVE_HOURS' ])
282
+ certname = node_state ['certname' ]
283
+
284
+ node_infos .append (Node (node , name = certname , unreported = last_report < unreported_border ,
285
+ status_report = node_state ['latest_report_status' ]))
286
+
287
+ return node_infos
288
+
289
+
251
290
@app .route ('/nodes' , defaults = {'env' : app .config ['DEFAULT_ENVIRONMENT' ]})
252
291
@app .route ('/<env>/nodes' )
253
292
def nodes (env ):
@@ -635,8 +674,6 @@ def facts(env):
635
674
"""
636
675
envs = environments ()
637
676
check_env (env , envs )
638
- facts = []
639
- order_by = '[{"field": "name", "order": "asc"}]'
640
677
facts = get_or_abort (puppetdb .fact_names )
641
678
642
679
facts_columns = [[]]
@@ -912,7 +949,7 @@ def metrics(env):
912
949
metrics .append (domain + ':' + prop )
913
950
else :
914
951
raise ValueError ("Unknown metric version {} for database version {}"
915
- .format (metric_version , database_version ))
952
+ .format (metric_version , db_version ))
916
953
917
954
return render_template ('metrics.html' ,
918
955
metrics = sorted (metrics ),
0 commit comments