def _init_desc_and_ref(self, pid_input=DEFAULT_PROFILE_ID, is_sum=False): if is_sum: if self._ref_global: return else: if pid_input in self._ref.keys(): return params = {'profile_id': pid_input} rc = self.rpc.transmit('get_counter_desc', params=params) if not rc: raise TRexError(rc.err()) data = rc.data()['data'] if is_sum: for section in self.sections: self._ref_global[section] = [0] * len(data) else: self._ref[pid_input] = {} for section in self.sections: self._ref[pid_input][section] = [0] * len(data) if not self.is_init: self._desc = [0] * len(data) self._err_desc = {} self._max_desc_name_len = 0 for item in data: self._desc[item['id']] = item self._max_desc_name_len = max(self._max_desc_name_len, len(item['name'])) if item['info'] == 'error': self._err_desc[item['name']] = item self.is_init = True
def _get_stats_values(self, relative = True, pid_input = DEFAULT_PROFILE_ID, is_sum = False): self._init_desc_and_ref(pid_input, is_sum) params = {'profile_id' : pid_input} if is_sum: rc = self.rpc.transmit('get_total_counter_values', params = params) ref_epoch = self._epoch_global else: rc = self.rpc.transmit('get_counter_values', params = params) ref_epoch = self.tg_names_dict[pid_input]['epoch'] if pid_input in self.tg_names_dict.keys() else -1 if not rc: raise TRexError(rc.err()) data_epoch = rc.data()['epoch'] if data_epoch != ref_epoch: self._epoch_changed(data_epoch, pid_input = pid_input, is_sum = is_sum) data = {'epoch': data_epoch} for section in self.sections: section_list = [0] * len(self._desc) for k, v in rc.data()[section].items(): section_list[int(k)] = v if relative: for desc in self._desc: id = desc['id'] if is_sum: if self._ref_global and not desc['abs']: # return relative section_list[id] -= self._ref_global[section][id] else: if pid_input in self._ref.keys() and not desc['abs']: # return relative section_list[id] -= self._ref[pid_input][section][id] data[section] = section_list return data
def get_stats(self, relative=True, pid_input=DEFAULT_PROFILE_ID, is_sum=False): self._init_desc_and_ref(pid_input=pid_input, is_sum=is_sum) data_key = is_sum if is_sum else pid_input tries = 5 while True: params = { 'profile_id': DEFAULT_PROFILE_ID, "epoch": self._epoch_global[data_key] } cmd = "get_total_dynamic_counter_values" if is_sum else 'get_dynamic_counter_values' rc = self.rpc.transmit(cmd, params=params) if tries == 0: raise TRexError("Could not get dynamic counters values") if not rc: raise TRexError(rc.err()) failure = rc.data().get("epoch_err", 0) if not failure: break else: self.reset() self._init_desc_and_ref(pid_input=pid_input, is_sum=is_sum) tries -= 1 data = {'epoch': self._epoch_global[data_key]} for section in self.sections: section_list = [0] * len(self._desc[data_key]) for k, v in rc.data()[section].items(): section_list[int(k)] = v if relative: for desc in self._desc[data_key]: id = desc['id'] if is_sum: if self._ref_global and not desc[ 'abs']: # return relative section_list[id] -= self._ref_global[section][id] else: if pid_input in self._ref.keys( ) and not desc['abs']: # return relative section_list[id] -= self._ref[pid_input][section][ id] data[section] = section_list return data
def get_stats(self, skip_zero=True): rc = self.rpc.transmit('get_latency_stats') if not rc: raise TRexError(rc.err()) rc_data = rc.data()['data'] data = {} for k, v in rc_data.items(): if k.startswith('port-'): data[int(k[5:])] = v self.update_window(data, rc_data['epoch']) return data
def _get_traffic_tg_stats(self, tg_ids): assert self.epoch >= 0 stats = {} while tg_ids: size = min(len(tg_ids), self.MAX_TGIDS_ALLOWED_AT_ONCE) params = {'tg_ids': tg_ids[:size], 'epoch': self.epoch} rc = self.rpc.transmit('get_tg_id_stats', params=params) if not rc: raise TRexError(rc.err()) server_epoch = rc.data()['epoch'] if self.epoch != server_epoch: self._epoch_changed(server_epoch) return False, {} del tg_ids[:size] stats.update(rc.data()) return True, stats
def _get_tg_names(self): params = {} if self.epoch >= 0: params['initialized'] = True params['epoch'] = self.epoch else: params['initialized'] = False rc = self.rpc.transmit('get_tg_names', params=params) if not rc: raise TRexError(rc.err()) server_epoch = rc.data()['epoch'] if self.epoch != server_epoch: self._epoch_changed(server_epoch) self.tg_names = rc.data()['tg_names'] for tgid, name in enumerate(self.tg_names): self.tg_names_dict[name] = tgid + 1
def _init_desc_and_ref(self): if self.is_init: return rc = self.rpc.transmit('get_counter_desc') if not rc: raise TRexError(rc.err()) data = rc.data()['data'] self._desc = [0] * len(data) self._ref = {'epoch': -1} for section in self.sections: self._ref[section] = [0] * len(data) self._max_desc_name_len = 0 for item in data: self._desc[item['id']] = item self._max_desc_name_len = max(self._max_desc_name_len, len(item['name'])) self.is_init = True
def _get_traffic_tg_stats(self, tg_ids, pid_input = DEFAULT_PROFILE_ID): pid_epoch = self.tg_names_dict[pid_input]['epoch'] if pid_input in self.tg_names_dict.keys() else -1 assert pid_epoch >= 0 stats = {} while tg_ids: size = min(len(tg_ids),self.MAX_TGIDS_ALLOWED_AT_ONCE) params = {'tg_ids': tg_ids[:size], 'epoch': pid_epoch, 'profile_id': pid_input} rc = self.rpc.transmit('get_tg_id_stats', params=params) if not rc: raise TRexError(rc.err()) server_epoch = rc.data()['epoch'] if pid_epoch != server_epoch: self._epoch_changed(server_epoch, pid_input = pid_input) return False, {} del tg_ids[:size] stats.update(rc.data()) return True, stats
def _get_stats_values(self, relative=True): self._init_desc_and_ref() rc = self.rpc.transmit('get_counter_values') if not rc: raise TRexError(rc.err()) ref_epoch = self._ref['epoch'] data_epoch = rc.data()['epoch'] data = {'epoch': data_epoch} for section in self.sections: section_list = [0] * len(self._desc) for k, v in rc.data()[section].items(): section_list[int(k)] = v if relative: for desc in self._desc: id = desc['id'] if ref_epoch == data_epoch and not desc[ 'abs']: # return relative section_list[id] -= self._ref[section][id] data[section] = section_list return data
def _get_tg_names(self, pid_input = DEFAULT_PROFILE_ID): tg_info = {'is_init': False, 'epoch' : -1} profile_id = pid_input if profile_id in list(self.tg_names_dict.keys()): tg_info = self.tg_names_dict[profile_id] pid_epoch = tg_info['epoch'] params = {} params['profile_id'] = profile_id if pid_epoch >= 0 and tg_info['is_init'] == True: params['initialized'] = True params['epoch'] = pid_epoch else: params['initialized'] = False rc = self.rpc.transmit('get_tg_names', params=params) if not rc: raise TRexError(rc.err()) server_epoch = rc.data()['epoch'] # Update template group name and id if pid_epoch != server_epoch or tg_info['is_init'] == False: self._epoch_changed(server_epoch, pid_input = profile_id) tg_info = {} tg_names_dic = {} tg_info['epoch'] = server_epoch tg_info['is_init'] = True tg_names = rc.data()['tg_names'] tg_info['tg_names'] = tg_names for tgid, name in enumerate(tg_names): tg_names_dic[name] = tgid+1 tg_info['tg_names_dic'] = tg_names_dic self.tg_names_dict[profile_id] = tg_info
def _init_desc_and_ref(self, pid_input=DEFAULT_PROFILE_ID, is_sum=False): if is_sum: if is_sum in self._counter_desc.keys(): return else: if pid_input in self._ref.keys(): return params = {'is_sum': True} if is_sum else {'profile_id': pid_input} rc = self.rpc.transmit('get_dynamic_counter_desc', params=params) if not rc: raise TRexError(rc.err()) data = rc.data()['data'] if is_sum: self._counter_desc[is_sum] = data self._epoch_global[is_sum] = rc.data()['epoch'] for section in self.sections: self._ref_global[section] = [0] * len(data) data_key = is_sum else: self._counter_desc[pid_input] = data self._epoch_global[pid_input] = rc.data()['epoch'] self._ref[pid_input] = {} for section in self.sections: self._ref[pid_input][section] = [0] * len(data) data_key = pid_input self._desc[data_key] = [0] * len(data) self._err_desc[data_key] = {} self._max_desc_name_len[data_key] = 1 for item in data: self._desc[data_key][item['id']] = item self._max_desc_name_len[data_key] = max( self._max_desc_name_len[data_key], len(item['name'])) if item['info'] == 'error': self._err_desc[data_key][item['name']] = item