# Copyright 2016 Cisco Systems, Inc. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. from log import LOG import os import subprocess import yaml class TrafficServerException(Exception): pass class TrafficServer(object): """Base class for traffic servers.""" class TRexTrafficServer(TrafficServer): """Creates configuration file for TRex and runs server.""" def __init__(self, trex_base_dir='/opt/trex'): contents = os.listdir(trex_base_dir) # only one version of TRex should be supported in container assert(len(contents) == 1) self.trex_dir = os.path.join(trex_base_dir, contents[0]) def run_server(self, traffic_profile, filename='/etc/trex_cfg.yaml'): """ Runs TRex server for specified traffic profile. :param traffic_profile: traffic profile object based on config file :param filename: path where to save TRex config file """ cfg = self.__save_config(traffic_profile, filename) cores = traffic_profile.cores subprocess.Popen(['nohup', '/bin/bash', '-c', './t-rex-64 -i -c {} --iom 0 --no-scapy-server --close-at-end --vlan' ' --cfg {} &> /tmp/trex.log & disown'.format(cores, cfg)], cwd=self.trex_dir) LOG.info('TRex server is running...') def __save_config(self, traffic_profile, filename): ifs = ",".join([repr(pci) for pci in traffic_profile.pcis]) result = """# Config generated by NFVBench tool - port_limit : 2 version : 2 interfaces : [{ifs}]""".format(ifs=ifs) yaml.safe_load(result) if os.path.exists(filename): os.remove(filename) with open(filename, 'w') as f: f.write(result) return filename