def __init__(self,doc): self.logging = logging.getLogger(__name__) self.calc = Calculator() self.__load(doc) self.answer = self.__initReport(doc)
class Request(): def __init__(self,doc): self.logging = logging.getLogger(__name__) self.calc = Calculator() self.__load(doc) self.answer = self.__initReport(doc) def __load(self,doc): self.__dict__.update(doc) @staticmethod def validate(data): checker = Validator() document_schema = { "type" : "object", "additionalProperties": False, "required" : True, "properties" : { "destination" : { "type" : "object", "required" : True, "additionalProperties": False, "properties" : { "name" : {"type" : "string", "required" : True }, "subject" : {"type" : "string", "required" : True } } }, "report" : { "type" : "object", "required" : True, "additionalProperties": False, "properties" : { "message" : {"type" : "string", "required" : True }, } }, "request" : { "type" : "object", "required" : True, "additionalProperties": False, "properties" : { "uuid" : {"type" : "string", "required" : True }, "source" : {"type" : "string", "required" : True }, "time" : {"type" : "string", "required" : True }, "day_of_year" : {"type" : "number", "required" : True }, "day_of_week" : {"type" : "number", "required" : True }, "week_of_year" : {"type" : "number", "required" : True }, "month" : {"type" : "number", "required" : True }, "year" : {"type" : "number", "required" : True }, "day" : {"type" : "number", "required" : True }, "cycle" : {"type" : "number", "required" : True }, } }, "plugin" : { "type" : "object", "required" : True, "additionalProperties": False, "properties" : { "name" : {"type" : "string", "required" : True }, "hash" : {"type" : "string", "required" : True }, "timeout" : {"type" : "number", "required" : True }, "parameters" : {"type" : "array", "required" : True } } }, "evaluators" : { "type" : "object", "required" : True }, "tags" : { "type" : "array", "required" : True } } } evaluator_schema = { "type" : "object", "additionalProperties": False, "properties" : { "evaluator" : {"type" : "string", "required" : True }, "metric" : {"type" : "string", "required" : True }, "thresholds" : {"type" : "object", "required" : True } } } threshold_schema = { "type" : "string" } checker.validate(data,document_schema) for evaluator in data['evaluators']: checker.validate(data['evaluators'][evaluator],evaluator_schema) for threshold in data['evaluators'][evaluator]['thresholds']: checker.validate(data['evaluators'][evaluator]['thresholds'][threshold],threshold_schema) def generateReport(self): pass def __initReport(self,doc): here_now = localtime() iso8601 = strftime("%Y-%m-%dT%H:%M:%S",here_now) iso8601 += strftime("%z") return { "destination":{ "name":doc['destination']['name'], "subject":doc['destination']['subject'], }, "request":doc['request'], "report":{ "uuid":str(uuid4()), "source":getfqdn(), "message":None, "time":iso8601, "timezone":strftime("%z"), "day_of_year":int(strftime("%j",here_now)), "day_of_week":int(strftime("%w",here_now)), "week_of_year":int(strftime("%W",here_now)), "month":int(strftime("%m",here_now)), "year":int(strftime("%Y",here_now)), "day":int(strftime("%d",here_now)) }, "plugin":{ "name":doc['plugin']['name'], "verbose":None, "metrics":None, "raw":None }, "evaluators":{ }, "tags":doc['tags'] } def __calculate(self): for evaluator in self.evaluators: (value,status) = self.calc.do( output=self.answer['plugin']['raw'], dictionary=self.answer['plugin']['metrics'], evaluator=self.evaluators[evaluator]['evaluator'], thresholds=self.evaluators[evaluator]['thresholds']) self.answer["evaluators"].update({ evaluator : { "status" : status, "metric" : self.evaluators[evaluator]['metric'], "value" : value } }) self.answer['report']['message']=self.buildMessage(evaluators=self.answer['evaluators'],message=self.report['message']) def buildMessage(self,evaluators,message): for evaluator in evaluators: message=message.replace('#'+str(evaluator),'(%s) %s'%(evaluators[evaluator]['status'],evaluators[evaluator]['value'])) return message def insertPluginOutput(self, raw, verbose, metrics): self.answer['plugin']['raw'] = raw self.answer['plugin']['verbose'] = verbose self.answer['plugin']['metrics'] = metrics self.__calculate() self.answer['plugin']['metrics'] = self.removePreData(self.answer['plugin']['metrics']) def removePreData(self,metrics): '''Removes all the pre_ metrics. There's no use to send that back as one could have stored the previous report.''' for key in metrics.keys(): if key.startswith('pre_'): metrics.pop(key) return metrics