diff options
Diffstat (limited to 'yardstick/network_services/vnf_generic/vnf/prox_vnf.py')
-rw-r--r-- | yardstick/network_services/vnf_generic/vnf/prox_vnf.py | 85 |
1 files changed, 37 insertions, 48 deletions
diff --git a/yardstick/network_services/vnf_generic/vnf/prox_vnf.py b/yardstick/network_services/vnf_generic/vnf/prox_vnf.py index 88911c3fc..214c9f3a0 100644 --- a/yardstick/network_services/vnf_generic/vnf/prox_vnf.py +++ b/yardstick/network_services/vnf_generic/vnf/prox_vnf.py @@ -12,14 +12,12 @@ # See the License for the specific language governing permissions and # limitations under the License. +import errno import logging -import multiprocessing -import os -import time -from yardstick.network_services.vnf_generic.vnf.base import QueueFileWrapper -from yardstick.network_services.vnf_generic.vnf.prox_helpers import ProxResourceHelper + from yardstick.network_services.vnf_generic.vnf.prox_helpers import ProxDpdkVnfSetupEnvHelper +from yardstick.network_services.vnf_generic.vnf.prox_helpers import ProxResourceHelper from yardstick.network_services.vnf_generic.vnf.sample_vnf import SampleVNF LOG = logging.getLogger(__name__) @@ -42,51 +40,21 @@ class ProxApproxVnf(SampleVNF): super(ProxApproxVnf, self).__init__(name, vnfd, setup_env_helper_type, resource_helper_type) - self._result = {} - self._terminated = multiprocessing.Value('i', 0) - self._queue = multiprocessing.Value('i', 0) - - def instantiate(self, scenario_cfg, context_cfg): - LOG.info("printing .........prox instantiate ") - - self.scenario_helper.scenario_cfg = scenario_cfg - - # this won't work we need 1GB hugepages at boot - self.setup_helper.setup_vnf_environment() - - # self.connection.run("cat /proc/cpuinfo") - - prox_args, prox_path, remote_path = self.resource_helper.get_process_args() - - self.q_in = multiprocessing.Queue() - self.q_out = multiprocessing.Queue() - self.queue_wrapper = QueueFileWrapper(self.q_in, self.q_out, "PROX started") - self._vnf_process = multiprocessing.Process(target=self._run_prox, - args=(remote_path, prox_path, prox_args)) - self._vnf_process.start() def _vnf_up_post(self): self.resource_helper.up_post() - def _run_prox(self, file_wrapper, config_path, prox_path, prox_args): - # This runs in a different process and should not share an SSH connection - # with the rest of the object - self.ssh_helper.drop_connection() - - time.sleep(self.WAIT_TIME) - - args = " ".join(" ".join([k, v if v else ""]) for k, v in prox_args.items()) - - cmd_template = "sudo bash -c 'cd {}; {} -o cli {} -f {} '" - prox_cmd = cmd_template.format(os.path.dirname(prox_path), prox_path, args, config_path) - - LOG.debug(prox_cmd) - self.ssh_helper.run(prox_cmd, stdin=file_wrapper, stdout=file_wrapper, - keep_stdin_open=True, pty=False) - - def vnf_execute(self, cmd, wait_time=2): + def vnf_execute(self, cmd, *args, **kwargs): # try to execute with socket commands - self.resource_helper.execute(cmd) + # ignore socket errors, e.g. when using force_quit + ignore_errors = kwargs.pop("_ignore_errors", False) + try: + return self.resource_helper.execute(cmd, *args, **kwargs) + except OSError as e: + if ignore_errors and e.errno in {errno.EPIPE, errno.ESHUTDOWN}: + pass + else: + raise def collect_kpi(self): if self.resource_helper is None: @@ -98,11 +66,11 @@ class ProxApproxVnf(SampleVNF): } return result - if len(self.vnfd_helper.interfaces) not in {2, 4}: + if len(self.vnfd_helper.interfaces) not in {1, 2, 4}: raise RuntimeError("Failed ..Invalid no of ports .. " - "2 or 4 ports only supported at this time") + "1, 2 or 4 ports only supported at this time") - port_stats = self.resource_helper.execute('port_stats', self.vnfd_helper.interfaces) + port_stats = self.vnf_execute('port_stats', range(len(self.vnfd_helper.interfaces))) rx_total = port_stats[6] tx_total = port_stats[7] result = { @@ -111,7 +79,28 @@ class ProxApproxVnf(SampleVNF): "packets_fwd": rx_total, "collect_stats": self.resource_helper.collect_kpi(), } + LOG.debug("%s collect KPIs %s", self.APP_NAME, result) return result def _tear_down(self): + # this should be standardized for all VNFs or removed self.setup_helper.rebind_drivers() + + def terminate(self): + # try to quit with socket commands + self.vnf_execute("stop_all") + self.vnf_execute("quit") + # hopefully quit succeeds and socket closes, so ignore force_quit socket errors + self.vnf_execute("force_quit", _ignore_errors=True) + if self._vnf_process: + self._vnf_process.terminate() + self.setup_helper.kill_vnf() + self._tear_down() + self.resource_helper.stop_collect() + + def instantiate(self, scenario_cfg, context_cfg): + # build config in parent process so we can access + # config from TG subprocesses + self.scenario_helper.scenario_cfg = scenario_cfg + self.setup_helper.build_config_file() + super(ProxApproxVnf, self).instantiate(scenario_cfg, context_cfg) |