3737import logging
3838import datetime
3939import ssl
40+ import re
4041from urllib .parse import urljoin
4142import urllib3
4243import requests
@@ -127,26 +128,26 @@ def request(self, url, method='GET'):
127128 except Exception as json_exc :
128129 raise CriticalException ('Could not decode API JSON: ' + str (json_exc )) # pylint: disable=raise-missing-from
129130
130- def get_cluster_status (self ):
131+ def get_cluster_status (self , excludes = None ):
131132 """
132133 GET and build ClusterStatus
133134 """
134- return ClusterStatus (self .request ('cluster/status' ))
135+ return ClusterStatus (self .request ('cluster/status' ), excludes )
135136
136- def get_alarms (self ):
137+ def get_alarms (self , excludes = None ):
137138 """
138139 GET and build Alarms
139140 """
140141 status = "OPEN"
141142 # status = "RESOLVED" # for testing
142143 result = self .request ('alarms?page_size=100&status=%s&sort_ascending=false' % status )
143- return Alarms (result ['results' ])
144+ return Alarms (data = result ['results' ], excludes = excludes )
144145
145- def get_capacity_usage (self ):
146+ def get_capacity_usage (self , excludes = None ):
146147 """
147148 GET and build CapacityUsage
148149 """
149- return CapacityUsage (self .request ('capacity/usage' ), self .max_age )
150+ return CapacityUsage (self .request ('capacity/usage' ), self .max_age , excludes )
150151
151152
152153class CheckResult :
@@ -203,9 +204,12 @@ class ClusterStatus(CheckResult):
203204 https://vdc-download.vmware.com/vmwb-repository/dcr-public/787988e9-6348-4b2a-8617-e6d672c690ee/a187360c-77d5-4c0c-92a8-8e07aa161a27/api_includes/method_ReadClusterStatus.html
204205 """
205206
206- def __init__ (self , data ):
207+ def __init__ (self , data , excludes ):
207208 super ().__init__ ()
208209 self .data = data
210+ self .excludes = excludes
211+ if excludes is None :
212+ self .excludes = []
209213
210214 def build_output (self ):
211215 for area in ['control_cluster_status' , 'mgmt_cluster_status' , 'control_cluster_status' ]:
@@ -234,14 +238,33 @@ class Alarms(CheckResult):
234238 https://vdc-download.vmware.com/vmwb-repository/dcr-public/787988e9-6348-4b2a-8617-e6d672c690ee/a187360c-77d5-4c0c-92a8-8e07aa161a27/api_includes/method_GetAlarms.html
235239 """
236240
237- def __init__ (self , data ):
241+ def __init__ (self , data , excludes ):
238242 super ().__init__ ()
239243 self .data = data
244+ self .excludes = excludes
245+ if excludes is None :
246+ self .excludes = []
247+
248+ def _is_excluded (self , alarm ):
249+ # to exclude via --exclude
250+ identifier = "%s %s %s %s" % (
251+ alarm ['severity' ],
252+ alarm ['node_display_name' ],
253+ alarm ['feature_display_name' ],
254+ alarm ['event_type_display_name' ])
255+ for exclude in self .excludes :
256+ regexp = re .compile (exclude )
257+ if bool (regexp .search (identifier )):
258+ return True
259+ return False
240260
241261 def build_output (self ):
242262 states = {}
243263
244264 for alarm in self .data :
265+ if self ._is_excluded (alarm ):
266+ continue
267+
245268 severity = alarm ['severity' ]
246269 if severity in states :
247270 states [severity ] += 1
@@ -270,7 +293,11 @@ def build_status(self):
270293 states = []
271294
272295 for alarm in self .data :
273- state = WARNING if alarm ['severity' ] in ['MEDIUM' , 'LOW' ] else CRITICAL # CRITICAL, HIGH
296+ if self ._is_excluded (alarm ):
297+ continue
298+
299+ # HIGH == CRITICAL
300+ state = WARNING if alarm ['severity' ] in ['MEDIUM' , 'LOW' ] else CRITICAL
274301 states .append (state )
275302
276303 if len (states ) > 0 :
@@ -285,15 +312,33 @@ class CapacityUsage(CheckResult):
285312 https://vdc-download.vmware.com/vmwb-repository/dcr-public/787988e9-6348-4b2a-8617-e6d672c690ee/a187360c-77d5-4c0c-92a8-8e07aa161a27/api_includes/method_GetProtonCapacityUsage.html
286313 """
287314
288- def __init__ (self , data , max_age ):
315+ def __init__ (self , data , max_age , excludes ):
289316 super ().__init__ ()
290317 self .data = data
291318 self .max_age = max_age
319+ self .excludes = excludes
320+ if excludes is None :
321+ self .excludes = []
322+
323+ def _is_excluded (self , usage ):
324+ # to exclude via --exclude
325+ identifier = "%s %s" % (
326+ usage ['severity' ],
327+ usage ['display_name' ])
328+
329+ for exclude in self .excludes :
330+ regexp = re .compile (exclude )
331+ if bool (regexp .search (identifier )):
332+ return True
333+ return False
292334
293335 def build_output (self ):
294336 states = {}
295337
296338 for usage in self .data ['capacity_usage' ]:
339+ if self ._is_excluded (usage ):
340+ continue
341+
297342 severity = usage ['severity' ] # INFO, WARNING, CRITICAL, ERROR
298343
299344 if severity in states :
@@ -341,6 +386,9 @@ def build_status(self):
341386 self .summary .append ("last update older than %s minutes" % (self .max_age ))
342387
343388 for usage in self .data ['capacity_usage' ]:
389+ if self ._is_excluded (usage ):
390+ continue
391+
344392 severity = usage ['severity' ] # INFO, WARNING, CRITICAL, ERROR
345393
346394 if severity == "INFO" :
@@ -398,6 +446,8 @@ def commandline(args):
398446 help = 'Password for Basic Auth' , required = True )
399447 parser .add_argument ('--mode' , '-m' , choices = ['cluster-status' , 'alarms' , 'capacity-usage' ],
400448 help = 'Check mode to exectue. Hint: alarms will only include open alarms.' , required = True )
449+ parser .add_argument ('--exclude' , nargs = '*' , action = 'extend' , type = str ,
450+ help = "Exclude alarms or usage from the check results. Can be used multiple times and supports regular expressions." )
401451 parser .add_argument ('--max-age' , '-M' , type = int ,
402452 help = 'Max age in minutes for capacity usage updates. Defaults to 5' , default = 5 , required = False )
403453 parser .add_argument ('--insecure' ,
@@ -421,11 +471,11 @@ def main(args):
421471 client = Client (args .api , args .username , args .password , verify = (not args .insecure ), max_age = args .max_age )
422472
423473 if args .mode == 'cluster-status' :
424- return client .get_cluster_status ().print_and_return ()
474+ return client .get_cluster_status (args . exclude ).print_and_return ()
425475 if args .mode == 'alarms' :
426- return client .get_alarms ().print_and_return ()
476+ return client .get_alarms (args . exclude ).print_and_return ()
427477 if args .mode == 'capacity-usage' :
428- return client .get_capacity_usage ().print_and_return ()
478+ return client .get_capacity_usage (args . exclude ).print_and_return ()
429479
430480 print ("[UNKNOWN] unknown mode %s" % args .mode )
431481 return UNKNOWN
0 commit comments