diff options
Diffstat (limited to 'scripts/automation/h_avc.py')
-rwxr-xr-x | scripts/automation/h_avc.py | 195 |
1 files changed, 195 insertions, 0 deletions
diff --git a/scripts/automation/h_avc.py b/scripts/automation/h_avc.py new file mode 100755 index 00000000..75548d92 --- /dev/null +++ b/scripts/automation/h_avc.py @@ -0,0 +1,195 @@ +#!/router/bin/python-2.4.3 +import time,os, sys, string +from os.path import exists +from os import system, remove, chdir +import re +import time +import random +import copy +import telnetlib +import datetime +import collections +from trex_perf import TrexRunException + + +import random +import time + +class RouterIOException(Exception): + def __init__ (self, reason): + # generate the error message + #self.message = "\nSummary of error:\n\n %s\n" % (reason) + self.message = reason + + def __str__(self): + return self.message + +# basic router class +class Router: + def __init__ (self, host, port, password, str_wait = "#"): + self.host = host + self.port = port; + self.pr = str_wait; + self.password = password + self.to = 60 + self.cpu_util_histo = [] + + # private function - command send + def _command (self, command, match = None, timeout = None): + to = timeout if (timeout != None) else self.to + m = match if (match != None) else [self.pr] + + if not isinstance(m, list): + m = [m] + + total_to = 0 + while True: + self.tn.write(command + "\n") + ret = self.tn.expect(m, timeout = 2) + total_to += 2 + + if ret[0] != -1: + result = {} + result['match_index'] = ret[0] + result['output'] = ret[2] + return (result) + + if total_to >= self.to: + raise RouterIOException("Failed to process command to router %s" % command) + + # connect to router by telnet + def connect (self): + # create telnet session + self.tn = telnetlib.Telnet () + + try: + self.tn.open(self.host, self.port) + except IOError: + raise RouterIOException("Failed To Connect To Router interface at '%s' : '%s'" % (self.host, self.port)) + + # get a ready console and decides if you need password + ret = self._command("", ["Password", ">", "#"]) + if ret['match_index'] == 0: + self._command(self.password, [">", "#"]) + + # can't hurt to call enable even if on enable + ret = self._command("enable 15", ["Password", "#"]) + if (ret['match_index'] == 0): + self._command(self.password, "#") + + self._command("terminal length 0") + + def close (self): + self.tn.close () + self.tn = None + + # implemented through derived classes + def sample_cpu (self): + raise Exception("abstract method called") + + def get_last_cpu_util (self): + if not self.cpu_util_histo: + return (0) + else: + return self.cpu_util_histo[len(self.cpu_util_histo) - 1] + + def get_cpu_util_histo (self): + return self.cpu_util_histo + + def get_filtered_cpu_util_histo (self): + trim_start = int(0.15 * len(self.cpu_util_histo)) + + filtered = self.cpu_util_histo[trim_start:] + if not filtered: + return [0] + + m = collections.Counter(filtered).most_common(n = 1)[0][0] + #m = max(self.cpu_util_histo) + filtered = [x for x in filtered if (x > (0.9*m))] + return filtered + + def clear_sampling_stats (self): + self.cpu_util_histo = [] + + + # add a sample to the database + def sample_stats (self): + # sample CPU util + cpu_util = self.sample_cpu() + self.cpu_util_histo.append(cpu_util) + + def get_stats (self): + stats = {} + + filtered_cpu_util = self.get_filtered_cpu_util_histo() + + if not filtered_cpu_util: + stats['cpu_util'] = 0 + else: + stats['cpu_util'] = sum(filtered_cpu_util)/len(filtered_cpu_util) + + stats['cpu_histo'] = self.get_cpu_util_histo() + + return stats + + +class ASR1k(Router): + def __init__ (self, host, password, port, str_wait = "#"): + Router.__init__(self, host, password, port, str_wait) + + def sample_cpu (self): + cpu_show_cmd = "show platform hardware qfp active datapath utilization | inc Load" + output = self._command(cpu_show_cmd)['output'] + lines = output.split('\n'); + + cpu_util = -1.0 + # search for the line + for l in lines: + m = re.match("\W*Processing: Load\D*(\d+)\D*(\d+)\D*(\d+)\D*(\d+)\D*", l) + if m: + cpu_util = float(m.group(1)) + + if (cpu_util == -1.0): + raise Exception("cannot determine CPU util. for asr1k") + + return cpu_util + + +class ISR(Router): + def __init__ (self, host, password, port, str_wait = "#"): + Router.__init__(self, host, password, port, str_wait) + + def sample_cpu (self): + cpu_show_cmd = "show processes cpu sorted | inc CPU utilization" + output = self._command(cpu_show_cmd)['output'] + lines = output.split('\n'); + + cpu_util = -1.0 + + # search for the line + for l in lines: + m = re.match("\W*CPU utilization for five seconds: (\d+)%/(\d+)%", l) + if m: + max_cpu_util = float(m.group(1)) + min_cpu_util = float(m.group(2)) + cpu_util = (min_cpu_util + max_cpu_util)/2 + + if (cpu_util == -1.0): + raise Exception("cannot determine CPU util. for ISR") + + return cpu_util + + + +if __name__ == "__main__": + #router = ASR1k("pqemb19ts", "cisco", port=2052) + router = ISR("10.56.198.7", "lab") + router.connect() + for i in range(1, 10): + router.sample_stats() + time.sleep(1) + + + + + |