1 # Copyright (c) 2018 Intel Corporation
3 # Licensed under the Apache License, Version 2.0 (the "License");
4 # you may not use this file except in compliance with the License.
5 # You may obtain a copy of the License at
7 # http://www.apache.org/licenses/LICENSE-2.0
9 # Unless required by applicable law or agreed to in writing, software
10 # distributed under the License is distributed on an "AS IS" BASIS,
11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 # See the License for the specific language governing permissions and
13 # limitations under the License.
20 from yardstick.common.process import check_if_process_failed
21 from yardstick.network_services.utils import get_nsb_option
22 from yardstick.network_services.vnf_generic.vnf.prox_vnf import ProxApproxVnf
23 from yardstick.network_services.vnf_generic.vnf.sample_vnf import SampleVNFTrafficGen
24 from yardstick.benchmark.contexts.base import Context
25 from yardstick.network_services.vnf_generic.vnf.prox_helpers import CoreSocketTuple
26 LOG = logging.getLogger(__name__)
29 class ProxIrq(SampleVNFTrafficGen):
31 def __init__(self, name, vnfd, task_id, setup_env_helper_type=None,
32 resource_helper_type=None):
33 vnfd_cpy = copy.deepcopy(vnfd)
34 super(ProxIrq, self).__init__(name, vnfd_cpy, task_id)
36 self._vnf_wrapper = ProxApproxVnf(
37 name, vnfd, task_id, setup_env_helper_type, resource_helper_type)
38 self.bin_path = get_nsb_option('bin_path', '')
39 self.name = self._vnf_wrapper.name
40 self.ssh_helper = self._vnf_wrapper.ssh_helper
41 self.setup_helper = self._vnf_wrapper.setup_helper
42 self.resource_helper = self._vnf_wrapper.resource_helper
43 self.scenario_helper = self._vnf_wrapper.scenario_helper
47 self._vnf_wrapper.terminate()
48 super(ProxIrq, self).terminate()
50 def instantiate(self, scenario_cfg, context_cfg):
51 self._vnf_wrapper.instantiate(scenario_cfg, context_cfg)
52 self._tg_process = self._vnf_wrapper._vnf_process
54 def wait_for_instantiate(self):
55 self._vnf_wrapper.wait_for_instantiate()
57 def get_irq_cores(self):
61 for section_name, section in self.setup_helper.prox_config_data:
62 if not section_name.startswith("core"):
64 irq_mode = task_present = False
66 for key, value in section:
67 if key == "mode" and value == mode:
71 task_present_task = int(value)
76 core_tuple = CoreSocketTuple(section_name)
77 core = core_tuple.core_id
78 cores.append((core, task_present_task))
82 class ProxIrqVNF(ProxIrq, SampleVNFTrafficGen):
84 APP_NAME = 'ProxIrqVNF'
86 def __init__(self, name, vnfd, task_id, setup_env_helper_type=None,
87 resource_helper_type=None):
88 ProxIrq.__init__(self, name, vnfd, task_id, setup_env_helper_type,
91 self.start_test_time = None
92 self.end_test_time = None
94 def vnf_execute(self, cmd, *args, **kwargs):
95 ignore_errors = kwargs.pop("_ignore_errors", False)
97 return self.resource_helper.execute(cmd, *args, **kwargs)
99 if e.errno in {errno.EPIPE, errno.ESHUTDOWN, errno.ECONNRESET}:
101 LOG.debug("ignoring vnf_execute exception %s for command %s", e, cmd)
107 def collect_kpi(self):
108 # check if the tg processes have exited
109 physical_node = Context.get_physical_node_from_server(
110 self.scenario_helper.nodes[self.name])
112 result = {"physical_node": physical_node}
113 for proc in (self._tg_process, self._traffic_process):
114 check_if_process_failed(proc)
116 if self.resource_helper is None:
119 if self.irq_cores is None:
120 self.setup_helper.build_config_file()
121 self.irq_cores = self.get_irq_cores()
123 data = self.vnf_execute('irq_core_stats', self.irq_cores)
124 new_data = copy.deepcopy(data)
126 self.end_test_time = time.time()
127 self.vnf_execute('reset_stats')
129 if self.start_test_time is None:
132 test_time = self.end_test_time - self.start_test_time
133 for index, item in data.items():
134 for counter, value in item.items():
135 if counter.startswith("bucket_")or \
136 counter.startswith("overflow"):
138 del new_data[index][counter]
140 new_data[index][counter] = float(value) / test_time
142 self.start_test_time = time.time()
144 result["collect_stats"] = new_data
145 LOG.debug("%s collect KPIs %s", self.APP_NAME, result)
149 class ProxIrqGen(ProxIrq, SampleVNFTrafficGen):
151 APP_NAME = 'ProxIrqGen'
153 def __init__(self, name, vnfd, task_id, setup_env_helper_type=None,
154 resource_helper_type=None):
155 ProxIrq.__init__(self, name, vnfd, task_id, setup_env_helper_type,
156 resource_helper_type)
157 self.start_test_time = None
158 self.end_test_time = None
160 def collect_kpi(self):
161 # check if the tg processes have exited
162 physical_node = Context.get_physical_node_from_server(
163 self.scenario_helper.nodes[self.name])
165 result = {"physical_node": physical_node}
166 for proc in (self._tg_process, self._traffic_process):
167 check_if_process_failed(proc)
169 if self.resource_helper is None:
172 if self.irq_cores is None:
173 self.setup_helper.build_config_file()
174 self.irq_cores = self.get_irq_cores()
176 data = self.resource_helper.sut.irq_core_stats(self.irq_cores)
177 new_data = copy.deepcopy(data)
179 self.end_test_time = time.time()
180 self.resource_helper.sut.reset_stats()
182 if self.start_test_time is None:
185 test_time = self.end_test_time - self.start_test_time
186 for index, item in data.items():
187 for counter, value in item.items():
188 if counter.startswith("bucket_") or \
189 counter.startswith("overflow"):
191 del new_data[index][counter]
193 new_data[index][counter] = float(value) / test_time
195 self.start_test_time = time.time()
197 result["collect_stats"] = new_data
198 LOG.debug("%s collect KPIs %s", self.APP_NAME, result)