def expect(self, state, title=None, expect_str=None, fact_str=None): """报告中加入期望值对比的内容; state是报告状态设置,包括:'info', 'error', 'fatal',不可缺省; title就这次对比的标题,可缺省; expect_str是期望的结果,不可缺省; fact_str是实际的结果,不可缺省。 """ if fact_str is None and expect_str is not None: fact_str = expect_str expect_str = title title = None elif fact_str is None and expect_str is None: log(2, "Report expect: para number error") raise EXCEPTION(1, "Report expect: para number error") if title is not None: self.detail.append('-'+title) if state is None or state is 'info': self.detail.append('EXPECT: '+expect_str+' | FACT: '+fact_str) elif state is 'error': self.result = 1 self.detail.append('<ERROR> EXPECT: '+expect_str+' | FACT: '+fact_str) elif state is 'fatal': self.result = 2 self.detail.append('<FATAL> EXPECT: '+expect_str+' | FACT: '+fact_str) raise EXCEPTION(1, "") else: log(2, "Report expect: the 1st para error") raise EXCEPTION(1, "Report expect: the 1st para error")
def load(self, stream, multiple): if self.initial == False: raise(EXCEPTION(1, "Instance not properly instanitiated")) dir = gl.current_case.dir port_path = "%s/port_%s.tcl"%(self.path,self.type) newtcl = "%s-%s"%(dir.strip("/").rpartition("/")[-1],stream.rpartition("/")[-1]) stream_path = "%s/%s"%(self.path,newtcl) src_stream = "%s/%s"%(dir.strip("/"),stream) dst_stream = r"C:\autotest_G\NETFIRM\%s"%newtcl f = file.File() f.connect(self.ts_addr[0], 1234) f.transfer(src_stream, dst_stream) log(0, 'Set multiple of initial stream-rate: x%-5.4f' % multiple) ret = self.__execute("tc_exec %s port_load %s %s %s %d" % (self.server, self.portmap, port_path, stream_path, multiple*10000000)) c = IxiaPort.parse(ret) if c['code'] == -1: log(2, "In load(): " + c['reason']) raise(EXCEPTION(1, c['reason'])) else: self.loaded = True return 0
def getResource(self, name): """从数据文件中获取资源。 """ dct = {} lst = self.tree.findall("resource/unit") num = 0 exist = False for node in lst: if node.get("name") == name: exist = True if node.get("num") == None: num = 0 elif node.get("num") == "ALL": num = "ALL" else: num = int(node.get("num")) for child in node.getchildren(): if child.tag == "connect": cnt_childs = child.getchildren() if cnt_childs == []: dct.update({child.tag:child.text}) else: cnt_dct = {} for cnt_child in cnt_childs: cnt_dct.update(self.__getResourceDict(cnt_child)) dct.update({child.tag:cnt_dct}) else: dct.update(self.__getResourceDict(child)) if not exist: log(2, 'Resource "%s" is not exist' % name) raise EXCEPTION(2, 'Resource "%s" is not exist' % name) return [dct, num]
def clearFragmentTable(self): """功能:清除分片缓存""" self._permissionCheck('setInfoCarry') ss = self.child self._enterView('service') ss.sendline('fragment-reset') ss.expect('fragment-reset\r\n<(.*?)@(.*?) service>', 5) log(0, 'Clear fragment table')
def rollback(self): """开始回滚命令""" if self.state > 1: self.rollbacking = True log(0, "-- (%s) Rollback start --"%self.kind) while(self.rollback_stack != []): method = self.rollback_stack.pop() exec('self.%s(%s)' % (method[0], method[1]))
def setIfState(self, name, state): try: ss = self.child ss.sendline('ifconfig %s %s'%(name,state)) ss.expect('#') log(0, 'Set interface %s: %s' % (name, state)) except pexpect.TIMEOUT: log(2, 'Set interface %s: time out' % name) raise EXCEPTION(2, 'Set interface %s: time out' % name)
def cd(self, dir): try: ss = self.child ss.sendline('cd %s' % dir) ss.expect('cd %s\r\n[root@(.*?) (.*?)]#' % dir, 10) log(0, 'Enter directory: %s' % dir) except pexpect.TIMEOUT: log(2, 'Enter directory: time out') raise EXCEPTION(2, 'Enter directory: time out')
def setRcpPermitIp(self, ip): """功能:设置RCP允许IP 输入:ip(被允许的IP) """ self._permissionCheck('setRcpPermitIp') ss = self.child self._enterView('rcp') ss.sendline('permit %s' % ip) ss.expect('permit %s\r\n<(.*?)@(.*?) rcp>' % ip, 5) log(0, 'Set rcp permit ip: %s' % ip)
def reflowClear(self): try: if self.type == "vb": self.__vbReflowClear() elif self.type == "netfirm": self.__netfirmReflowClear() log(0, "Clear reflow(%s) counts"%self.if_ip) except pexpect.TIMEOUT: log(2, "Clear reflow(%s) counts: time out"%self.if_ip) raise EXCEPTION(2, "Clear reflow(%s) counts: time out"%self.if_ip)
def getRxFrame(self, pktNum): if self.initial == False: raise(EXCEPTION(1, "Instance not properly instanitiated")) ret = self.__execute("tc_exec %s get_rx_frame %s %d" % (self.server, self.portmap, pktNum)) c = IxiaPort.parse(ret) if c['code'] == -1: log(2, "In getRxFrame(): " + c['reason']) raise(EXCEPTION(1, c['reason'])) else: return c['reason']
def add(self, rules_path): """规则下发方法。 rules_path:规则文件的路径,可以是字符串,也可以是字符串组成的列表 """ if isinstance(rules_path, str): rules_path = "%s/%s"%(self.case_path.strip("/"),rules_path.split("/")[-1]) rules_path = [rules_path] for rule in rules_path: cmd = self.add_tool + ' -u ' + self.auth_path + ' -f ' + rule log(0, 'Adding rules ...') pipe = os.popen(cmd).read().split('\n')
def _exitView(self): """退出视图""" ss = self.child ss.sendline('exit') index = ss.expect(['exit\r\n<(.*?)@(.*?)>', ' Device connection failure'], 5) if index == 0: pass elif index == 1: log(1, "Exit view: device connection failure, but don't need to try again") self.state -= 1 self.cur_view = 'root'
def createFragrouteFile(ss, rules): try: str = '' for rule in rules: str += (rule + '\n') ss.sendline('echo -e "%s">/usr/local/etc/fragtmp.conf' % str) ss.expect('fragtmp.conf\r\n\x1b]0;root@localhost:~\x07(.*?)#', 10) log(0, 'Create fragroute file: fragtmp.conf') return "/usr/local/etc/fragtmp.conf" except pexpect.TIMEOUT: log(2, 'Create fragroute file: time out') raise EXCEPTION(2, 'Create fragroute file: time out')
def clearStats(self): if self.initial == False: raise(EXCEPTION(1, "Instance not properly instanitiated")) ret = self.__execute("tc_exec %s clear_stat %s" % (self.server, self.portmap)) c = IxiaPort.parse(ret) if c['code'] == -1: log(2, "In clearStats(): " + c['reason']) raise(EXCEPTION(1, c['reason'])) else: log(0, 'Clear ixia stats') return 0
def countChange(self, count_list1, count_list2): """比对计数是否全部都发生变化,变化返回True,部分变化或没有变化返回False""" if isinstance(count_list1, int): count_list1 = [count_list1] if isinstance(count_list2, int): count_list2 = [count_list2] if len(count_list1) != len(count_list2): log(1, 'Unmatched length') raise EXCEPTION(1, "Count_change: unmatched length") for i in range(0, len(count_list1)): if count_list1[i] == count_list2[i]: return False return True
def stopCapture(self): if self.initial == False: raise(EXCEPTION(1, "Instance not properly instanitiated")) ret = self.__execute("tc_exec %s stop_rx %s" % (self.server, self.portmap)) c = IxiaPort.parse(ret) if c['code'] == -1: log(2, "In stopCapture(): " + c['reason']) raise(EXCEPTION(1, c['reason'])) else: self.rx = False log(0, 'Stop capture') return 0
def stopTransmit(self): if self.initial == False: raise(EXCEPTION(1, "Instance not properly instanitiated")) ret = self.__execute("tc_exec %s stop_tx %s" % (self.server, self.portmap)) c = IxiaPort.parse(ret) if c['code'] == -1: log(2, "In stopTransmit(): " + c['reason']) raise(EXCEPTION(1, c['reason'])) else: time.sleep(1) self.tx = False log(0, 'Stop ixia transmit') return 0
def countContrast(self, count_list, contrast_list): """比对计数是否符合预期,符合返回True,不符合返回False""" if isinstance(count_list, int): count_list = [count_list] if isinstance(contrast_list, int): contrast_list = [contrast_list] if len(count_list) != len(contrast_list): log(1, 'Unmatched length') raise EXCEPTION(1, "Count_contrast: unmatched length") match = True for i in range(0, len(count_list)): if count_list[i] != contrast_list[i]: match = False return match
def setFragmentCache(self, cache): """功能:设置分片缓存容量""" self._permissionCheck('setFragmentCache') ss = self.child if 0<=cache<=32: self._enterView('service') ss.sendline('fragment-cache %d'%cache) ss.expect('fragment-cache %d\r\n<(.*?)@(.*?) service>'%cache, 5) log(0, 'Set fragment cache: %d'%cache) if cache != 32: self._addRollback('setFragmentCache', '32') else: log(2, 'Set fragment cache: out of cache range') raise EXCEPTION(1, 'Set fragment cache: out of cache range')
def setFragmentAge(self, time): """功能:设置分片老化时间""" self._permissionCheck('setFragmentAge') ss = self.child if 10<=time<=2000: self._enterView('service') ss.sendline('fragment-age %d'%time) ss.expect('fragment-age %d\r\n<(.*?)@(.*?) service>'%time, 5) log(0, 'Set fragment age: %d'%time) if time != 2000: self._addRollback('setFragmentAge', '2000') else: log(2, 'Set fragment age: out of age range') raise EXCEPTION(1, 'Set fragment age: out of age range')
def _enterInterfaceView(self, port_name): """进入端口视图""" if 'interface %s' % port_name != self.cur_view: ss = self.child ss.sendline('interface %s' % port_name) index = ss.expect(['interface %s\r\n<(.*?)@(.*?) interface (.*?)>' % port_name,\ 'The interface name is'], 5) if index == 0: if self.cur_view == 'root': self.state += 1 self.cur_view = 'interface %s' % port_name elif index == 1: log(2, 'Unmatched port name') raise EXCEPTION(1, 'Enter interface view: unmatched port name')
def reset(self, board_no): """功能:重启板卡 输入:board_no(板卡槽位号,1到14) """ self._permissionCheck('reset') if 0 < board_no < 15: ss = self.child self._enterView('hardware') ss.sendline('reset linecard %d' % board_no) ss.expect('(yes or no) :', 5) ss.sendline('yes') ss.expect('yes\r\n(.*?)<(.*?)@(.*?) hardware>', 5) log(0, 'Reset linecard %d' % board_no) else: log(2, 'Wrong linecard number: %d' % board_no) raise EXCEPTION(2, 'Wrong linecard number: %d' % board_no)
def set(self, device_ip, user, password): """配置RCP客户端 device_ip:下发目标设备的IP user:用户名 password:密码 """ self.case_path = gl.current_case.dir self.auth_path = "%s/auth.conf"%(self.case_path.strip("/")) str = "RCP_DEV_IP=%s\nRCP_DEV_PORT=1000\n"%device_ip str += "CLIENT_IP=%s\n"%self.client_ip str += "USER=%s\nPASSWORD=%s\n"%(user,password) str += "BLOCK_NUM=1\nIS_ORDER=1\n" f = open(self.auth_path, 'w') f.write(str) f.close() log(0, 'Generate auth.conf ...')
def setFragroute(self, rules, ip, mac): def setStaticArp(ss, name, ip, mac): try: ss.sendline('arp -s %s %s -i %s' % (ip, mac, name)) index = ss.expect(["arp -s %s %s -i %s\r\n\x1b]0;root@localhost:~\x07(.*?)#" % (ip, mac, name), 'SIOCSARP: Network is unreachable', 'SIOCSARP: Invalid argument'], 10) if index == 1: log(2, 'Set static arp: Network is unreachable') raise EXCEPTION(2, 'Set static arp: Network is unreachable') elif index == 2: print repr(ss.before) log(2, 'Set static arp: Invalid argument') raise EXCEPTION(2, 'Set static arp: Invalid argument') log(0, 'Set static arp: %s %s' % (ip, mac)) except pexpect.TIMEOUT: log(2, 'Set static arp: time out') raise EXCEPTION(2, 'Set static arp: time out') def createFragrouteFile(ss, rules): try: str = '' for rule in rules: str += (rule + '\n') ss.sendline('echo -e "%s">/usr/local/etc/fragtmp.conf' % str) ss.expect('fragtmp.conf\r\n\x1b]0;root@localhost:~\x07(.*?)#', 10) log(0, 'Create fragroute file: fragtmp.conf') return "/usr/local/etc/fragtmp.conf" except pexpect.TIMEOUT: log(2, 'Create fragroute file: time out') raise EXCEPTION(2, 'Create fragroute file: time out') try: ss = self.child setStaticArp(ss, self.if_name, ip, mac) file = createFragrouteFile(ss, rules) ss.sendline("killall fragroute") ss.expect("#", 5) ss.sendline('/usr/local/sbin/fragroute -f %s %s > /dev/null &' % (file, ip)) ss.expect("#", 5) self.is_fragroute = True log(0, 'Start fragroute: -> %s' % ip) except pexpect.TIMEOUT: print repr(ss.before) log(2, 'Start fragroute: time out') raise EXCEPTION(2, 'Set fragroute: time out')
def __runCase(self, case): mod = self.__importCase(case) test_case = mod.TestCase() test_case.pool = copy.deepcopy(self.pool) test_case.conf = copy.deepcopy(self.conf) test_case.report = report.Report() case_name = case.name test_case.report.name = case_name test_case.report.begin_time = time.time() log(0, '<< %s >>'%(case_name)) def process(fn, case): """执行函数fn,同时对函数的异常进行处理""" try: fn() except EXCEPTION, x: self.__handleException(x, case.report) except:
def release(self): log(0, "-- (%s) Release start --"%self.kind) if self.is_init: IxiaPort.ref_count[self.key] = IxiaPort.ref_count[self.key] - 1 #Try to release the device if self.initial == True: ### Never release the port #ret = self.__execute("tc_exec %s port_release %s" % (self.server, self.portmap)) if self.tx == True: self.__execute("tc_exec %s stop_tx %s" % (self.server, self.portmap)) if self.rx == True: self.__execute("tc_exec %s stop_rx %s" % (self.server, self.portmap)) if IxiaPort.ref_count[self.key] == 0: if IxiaPort.init_dict[self.key] == True: ret = self.__execute("tc_exec %s ixia_exit %s" % (self.server, self.chassis_ip)) else: IxiaPort.init_dict[self.key] == False
def clearPort(self, port_list=[]): """功能:清除端口计数 输入:port_list(端口列表,端口为Port类的实例;缺省为空列表,代表全清) """ self._permissionCheck('clearPort') ss = self.child if port_list == []: self._enterView('root') ss.sendline('clear interface-all') ss.expect('clear interface-all\r\n<(.*?)@(.*?)>', 5) log(0, 'Clear interface all') else: for port in port_list: port_name = port.get() self._enterInterfaceView(port_name) ss.sendline('clear interface %s' % port_name) ss.expect('clear interface %s\r\n<(.*?)@(.*?) interface (.*?)>' % port_name, 5) log(0, 'Clear interface %s' % port_name)
def get(self, dct, num=None): """根据字典获取资源""" if dct == {}: return [] lst = [] try: iter = self.__search(self.children, dct) if not num: for rsc in iter: lst.append(rsc) elif num == 0: return iter.next() else: while num != 0: lst.append(iter.next()) num -= 1 except StopIteration: log(2, "Resources(%s) aren't enough"%dct) raise EXCEPTION(1, "Resources(%s) aren't enough"%dct) return lst
def _enterView(self, view_name): """进入某视图""" if view_name != self.cur_view: if view_name == 'root': self._exitView() else: ss = self.child try_time = 2 for i in range(0, try_time): ss.sendline(view_name) index = ss.expect(['%s\r\n<(.*?)@(.*?) (.*?)>' % view_name, ' Device connection failure'], 5) if index == 0: if self.cur_view == 'root': self.state += 1 self.cur_view = view_name break elif index == 1: log(1, 'Enter %s view: device connection failure, try again') if i > try_time - 1: log(2, 'Enter %s view: device connection failure') raise EXCEPTION(2, 'Enter %s view: device connection failure')
def remoteLogin(self): ret = sshLoginServ(self.ip, 'root', self.password) self.child = ret.child if ret.state == 0: log(0, 'Login root@%s' % self.ip) elif ret.state == -1: log(2, 'Password error') raise EXCEPTION(2, 'Login remote: password error') elif ret.state == -2: log(2, 'Host key verification failed') raise EXCEPTION(2, 'Remote login: host key verification failed') elif ret.state == -3: log(2, 'Remote login(%s): time out'%self.ip) raise EXCEPTION(2, 'Remote login(%s): time out'%self.ip)