# # Copyright (c) 2016 Wind River Systems, Inc. # # SPDX-License-Identifier: Apache-2.0 # import sys import os import yaml import constants # Record Format (for full description see events.yaml) # # 100.001: # Type: Alarm # Description: "Degrade: is experiencing an intermittent 'Management Network' communication failure." # Entity_Instance_ID: host= # Severity: critical # Proposed_Repair_Action: "Check Host's board management configuration and connectivity." # Maintenance_Action: auto recover # Inhibit_Alarms: True # Alarm_Type: operational-violation # Probable_Cause: timing-problem # Service_Affecting: False # Suppression: True # Management_Affecting_Severity: warning # type_FieldName = 'Type' type_FieldValue_Alarm = 'Alarm' type_FieldValues = [ type_FieldValue_Alarm, 'Log' ] description_FieldName = 'Description' description_FieldValues = [] # arbitrary string entityInstanceId_FieldName = 'Entity_Instance_ID' entityInstanceId_FieldValues = [] # arbitrary string severity_FieldName = 'Severity' severity_FieldValues = constants.ALARM_SEVERITY proposedRepairAction_FieldName = 'Proposed_Repair_Action' proposedRepairAction_FieldValues = [] # arbitrary string maintenanceAction_FieldName = 'Maintenance_Action' maintenanceAction_FieldValues = [] # arbitrary string inhibitAlarms_FieldName = 'Inhibit_Alarms' inhibitAlarms_FieldValues = [ True, False ] alarmType_FieldName = 'Alarm_Type' alarmType_FieldValues = constants.ALARM_TYPE probableCause_FieldName = 'Probable_Cause' probableCause_FieldValues = constants.ALARM_PROBABLE_CAUSE serviceAffecting_FieldName = 'Service_Affecting' serviceAffecting_FieldValues = [ True, False ] suppression_FieldName = 'Suppression' suppression_FieldValues = [ True, False ] managementAffectingSeverity_FieldName = 'Management_Affecting_Severity' managementAffectingSeverity_FieldValues = constants.ALARM_SEVERITY.append('none') alarmFields = { type_FieldName : type_FieldValues, description_FieldName : description_FieldValues, entityInstanceId_FieldName : entityInstanceId_FieldValues, severity_FieldName : severity_FieldValues, proposedRepairAction_FieldName : proposedRepairAction_FieldValues, maintenanceAction_FieldName : maintenanceAction_FieldValues, inhibitAlarms_FieldName : inhibitAlarms_FieldValues, alarmType_FieldName : alarmType_FieldValues, probableCause_FieldName : probableCause_FieldValues, serviceAffecting_FieldName : serviceAffecting_FieldValues, suppression_FieldName : suppression_FieldValues, managementAffectingSeverity_FieldName : managementAffectingSeverity_FieldValues } logFields = { type_FieldName : type_FieldValues, description_FieldName : description_FieldValues, entityInstanceId_FieldName : entityInstanceId_FieldValues, severity_FieldName : severity_FieldValues, alarmType_FieldName : alarmType_FieldValues, probableCause_FieldName : probableCause_FieldValues, serviceAffecting_FieldName : serviceAffecting_FieldValues } def checkField( fieldKey, fieldValues, key, event ): if not event.has_key(fieldKey): print "\n ERROR: %s missing \'%s\' field." % (key, fieldKey) return False # print "START: %s :END" % event[fieldKey] if type(event[fieldKey]) is str: if not fieldValues: return True if event[fieldKey] in fieldValues: return True else: print "\n ERROR: \'%s\' is not a valid \'%s\' field value." % (event[fieldKey], fieldKey) print " Valid values are:", fieldValues return False if type(event[fieldKey]) is list: if not fieldValues: return True for listvalue in event[fieldKey]: if not listvalue in fieldValues: print "\n ERROR: \'%s\' is not a valid \'%s\' field value." % (listvalue, fieldKey) print " Valid values are:", fieldValues return False if type(event[fieldKey]) is dict: for dictKey, dictValue in event[fieldKey].iteritems(): if not dictKey in severity_FieldValues: print "\n ERROR: \'%s\' is not a valid \'%s\' index value." % (dictKey, fieldKey) print " Valid index values are:", severity_FieldValues return False if fieldValues: if not dictValue in fieldValues: print "\n ERROR: \'%s\' is not a valid \'%s\' field value." % (dictValue, fieldKey) print " Valid values are:", fieldValues return False return True def checkTypeField( key, event ): if not event.has_key(type_FieldName): print "\n ERROR: %s missing \'%s\' field." % (key, type_FieldName) return False if event[type_FieldName] in type_FieldValues: return True print "\n ERROR: \'%s\' is not a valid \'%s\' field value." % (event[type_FieldName], type_FieldName) return False def checkFields( key, event ): isOk = True if not checkTypeField(key, event) : return False isAlarm = (event[type_FieldName] == type_FieldValue_Alarm) eventFields = alarmFields if isAlarm else logFields for fieldKey, fieldValues in eventFields.iteritems(): if not checkField(fieldKey, fieldValues, key, event) : isOk = False for itemKey, itemValue in event.iteritems(): if not eventFields.has_key(itemKey): print "\n ERROR: \'%s\' is not a valid \'%s\' field." % (itemKey, ("Alarm" if isAlarm else "Log") ) isOk = False return isOk # # Main # if len(sys.argv) == 1: print "Missing file argument.\n" exit(1) if not os.path.isfile(sys.argv[1]): print "File \'%s\' does not exist.\n" % (sys.argv[1]) exit(1) with open(sys.argv[1], 'r') as stream: try: events = yaml.load(stream) exitValue = 0 for key in events: print "%6.3f: checking ... " % key, if not checkFields( key, events[key] ): print exitValue = 1 else: print 'OK.' print 'Done.' except yaml.YAMLError as exc: print(exc) exit (exitValue)