コード例 #1
0
    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
コード例 #2
0
    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
コード例 #3
0
    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
コード例 #4
0
    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
コード例 #5
0
 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
コード例 #6
0
 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
コード例 #7
0
ファイル: traffic.py プロジェクト: cody3337/trex-core
 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
コード例 #8
0
    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
コード例 #9
0
ファイル: traffic.py プロジェクト: cody3337/trex-core
 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
コード例 #10
0
    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
コード例 #11
0
    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