def EvaluateSiteReadiness(self): print "\nEvaluating Site Readiness\n" prog = ProgressBar(0, 100, 77) sitesit = self.matrices.dailyMetrics.keys() sitesit.sort() for sitename in sitesit: prog.increment(100./len(sitesit)) if not self.matrices.readiValues.has_key(sitename): self.matrices.readiValues[sitename] = {} tier = sitename.split("_")[0] start = self.tinfo.today stop = self.tinfo.today - datetime.timedelta(self.cinfo.days - self.cinfo.daysSC) for iday in daterange(start, stop, datetime.timedelta(-1)): # loop from today to the first day on which we try to calculate the readiness (default: today to (today - 60 - 7) days) idaystamp = iday.strftime("%Y-%m-%d") statusE = 0 # number of days over the previous daysSC days that dailyMetric was in error for jday in daterange(iday, iday - datetime.timedelta(self.cinfo.daysSC), datetime.timedelta(-1)): # loop over the dailyMetric values from the previous daysSC days jdaystamp = jday.strftime("%Y-%m-%d") if self.matrices.dailyMetrics[sitename][jdaystamp] == 'E': # if dailyMetric in error if ( tier == "T2" or tier == "T3") and (jday.weekday() == 5 or jday.weekday() == 6): if not self.options.t2weekends: # skip Errors on weekends for T2s continue statusE += 1 status = "n/a" color = "white" previousDayStamp = (iday - datetime.timedelta(1)).strftime("%Y-%m-%d") # iday minus one day dailyMetric = self.matrices.dailyMetrics[sitename][idaystamp] if statusE > 2: # if in error for more than two of the last daysSC days status="NR" color="red" if dailyMetric == 'E' and statusE <= 2 : # if in error today status="W" color="yellow" if dailyMetric == 'O' and statusE <= 2 : # if ok status="R" color="green" if dailyMetric == 'O' and self.matrices.dailyMetrics[sitename][previousDayStamp] == 'O': status="R" color="green" if dailyMetric == 'SD': status='SD' color="brown" self.matrices.readiValues[sitename][idaystamp] = status # set actual SR value # correct weekend t2 and t3 readiness values to 'R' if they're in downtime, otherwise to friday's value if tier=="T2" or tier=="T3": start = self.tinfo.today - datetime.timedelta(self.cinfo.days - self.cinfo.daysSC - 3) stop = self.tinfo.today for iday in daterange(start, stop): idaystamp = iday.strftime("%Y-%m-%d") previousDayStamp = (iday - datetime.timedelta(1)).strftime("%Y-%m-%d") if self.matrices.dailyMetrics[sitename][idaystamp] == 'E': if iday.weekday() == 5 or iday.weekday() == 6: # id. weekends if not self.options.t2weekends: # skip Errors on weekends for T2s if self.matrices.readiValues[sitename][previousDayStamp] == 'SD': self.matrices.readiValues[sitename][idaystamp] = 'R' else: self.matrices.readiValues[sitename][idaystamp] = self.matrices.readiValues[sitename][previousDayStamp] prog.finish() # put in blank current day for sitename in self.matrices.dailyMetrics: for col in self.cinfo.urls: if self.matrices.columnValues[sitename][self.tinfo.todaystamp].has_key(col): self.matrices.columnValues[sitename][self.tinfo.todaystamp][col]['Status'] = ' ' self.matrices.columnValues[sitename][self.tinfo.todaystamp][col]['Color'] = 'white' self.matrices.readiValues[sitename][self.tinfo.todaystamp] = ' '
def FillSummaryMatrix(self): print "\nExtracting Column Info for CMS sites\n" prog = ProgressBar(0, 100, 77) for sitename in self.matrices.xmlInfo: prog.increment(100./len(self.matrices.xmlInfo)) if not self.matrices.columnValues.has_key(sitename): # add site if not already there self.matrices.columnValues[sitename] = {} for col in self.cinfo.urls: if not self.matrices.xmlInfo[sitename].has_key(col) or col == 'Downtimes_top': continue # set to null (default) values for iday in daterange(self.tinfo.today - tdelta(60), self.tinfo.today + tdelta(1)): idaystamp = iday.strftime("%Y-%m-%d") if not self.matrices.columnValues[sitename].has_key(idaystamp): self.matrices.columnValues[sitename][idaystamp] = {} if not self.matrices.columnValues[sitename][idaystamp].has_key(col): self.matrices.columnValues[sitename][idaystamp][col] = {} nullValues = {} nullValues['Status'] = 'n/a' nullValues['Color'] = 'white' nullValues['URL'] = ' ' nullValues['validity'] = 0 self.matrices.columnValues[sitename][idaystamp][col] = nullValues items = self.matrices.xmlInfo[sitename][col].keys() items.sort() for coldate in items: # loop over each time/date combination xmltime = datetime.datetime(*time.strptime(self.matrices.xmlInfo[sitename][col][coldate]['Time'], "%Y-%m-%d %H:%M:%S")[0:6]) xmlendtime = datetime.datetime(*time.strptime(self.matrices.xmlInfo[sitename][col][coldate]['EndTime'], "%Y-%m-%d %H:%M:%S")[0:6]) startxmldatetmp = xmltime.strftime("%Y-%m-%d 00:00:00") startxmldate = datetime.datetime(*time.strptime(startxmldatetmp, "%Y-%m-%d %H:%M:%S")[0:6]) EndTXML = True i = 0 while ( EndTXML ): d = datetime.timedelta(i) # convert i to number of days i += 1 dayloop = startxmldate + d dayloopstamp = dayloop.strftime("%Y-%m-%d") dayloopstamp2 = dayloop.strftime("%Y-%m-%d 00:00:00") looptime = datetime.datetime(*time.strptime(dayloopstamp2, "%Y-%m-%d %H:%M:%S")[0:6]) if dayloop > self.tinfo.today: EndTXML = False continue diff1 = xmltime-looptime diff1s = (diff1.days*86400+diff1.seconds) diff2 = xmlendtime-looptime diff2s = (diff2.days*86400+diff2.seconds) diff3 = xmlendtime-xmltime diff3s = (diff3.days*86400+diff3.seconds) if diff1s<=0 and diff2s>0: if diff2s>=86400: validity=86400 else: validity=diff2s if diff1s>0 and diff1s<86400: if diff2s>86400: validity=86400-diff1s else: validity=diff3s if diff1s<0 and diff2s<=0: EndTXML=False continue if self.cinfo.colorCodes[col][self.matrices.xmlInfo[sitename][col][coldate]['COLOR']] == "green": status=self.matrices.xmlInfo[sitename][col][coldate]['Status'] statusu=self.matrices.xmlInfo[sitename][col][coldate]['URL'] statusc='green' if self.matrices.xmlInfo[sitename][col][coldate]['Status']=="pend": status='-' statusc='orange' elif self.cinfo.colorCodes[col][self.matrices.xmlInfo[sitename][col][coldate]['COLOR']] == "red": status=self.matrices.xmlInfo[sitename][col][coldate]['Status'] statusu=self.matrices.xmlInfo[sitename][col][coldate]['URL'] statusc='red' elif self.cinfo.colorCodes[col][self.matrices.xmlInfo[sitename][col][coldate]['COLOR']] == "yellow": status=self.matrices.xmlInfo[sitename][col][coldate]['Status'] statusu=self.matrices.xmlInfo[sitename][col][coldate]['URL'] statusc='yellow' elif self.cinfo.colorCodes[col][self.matrices.xmlInfo[sitename][col][coldate]['COLOR']] == "white": status='n/a' statusu=' ' statusc='white' else: status=self.matrices.xmlInfo[sitename][col][coldate]['Status'] statusu=self.matrices.xmlInfo[sitename][col][coldate]['URL'] statusc=self.cinfo.colorCodes[col][self.matrices.xmlInfo[sitename][col][coldate]['COLOR']] dayloopstamp3 = self.ShiftDayForMetric(dayloop,col) todayst = date(int(self.tinfo.todaystamp[0:4]),int(self.tinfo.todaystamp[5:7]),int(self.tinfo.todaystamp[8:10])) dayloop3 = date(int(dayloopstamp3[0:4]),int(dayloopstamp3[5:7]),int(dayloopstamp3[8:10])) if abs((dayloop3-todayst).days) > self.cinfo.days: continue if status == "Ready": status = "R" elif status == "NotReady": status = "NR" elif status == "Downtime": status = "SD" elif status == "Waiting_Room": status = "WR" elif status == "Morgue": status = "M" elif status == "OK" or status == "Ok": status = "O" elif status == "Error": status = "E" # set the actual values in self.matrices.columnValues infocol = {} infocol['Status'] = status infocol['Color'] = statusc infocol['URL'] = statusu infocol['validity'] = validity if self.matrices.columnValues[sitename][dayloopstamp3][col].has_key('validity'): if validity > self.matrices.columnValues[sitename][dayloopstamp3][col]['validity']: self.matrices.columnValues[sitename][dayloopstamp3][col] = infocol else: self.matrices.columnValues[sitename][dayloopstamp3][col] = infocol if dayloopstamp == self.tinfo.todaystamp: infocol = {} infocol['Status'] = ' ' infocol['Color'] = 'white' infocol['URL'] = ' ' infocol['validity'] = '0' self.matrices.columnValues[sitename][dayloopstamp][col] = infocol prog.finish()