Source code for yardstick.vTC.apexlake.experimental_framework.benchmarks.instantiation_validation_benchmark
# Copyright (c) 2015 Intel Research and Development Ireland Ltd.
#
# 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.
import os
import commands
# import signal
import time
from experimental_framework.benchmarks import benchmark_base_class as base
from experimental_framework.constants import framework_parameters as fp
from experimental_framework.constants import conf_file_sections as cfs
from experimental_framework.packet_generators import dpdk_packet_generator \
as dpdk
import experimental_framework.common as common
THROUGHPUT = 'throughput'
VLAN_SENDER = 'vlan_sender'
VLAN_RECEIVER = 'vlan_receiver'
PACKETS_FILE_NAME = 'packets.res'
PACKET_CHECKER_PROGRAM_NAME = 'test_sniff'
MULTICAST_GROUP = '224.192.16.1'
[docs]class InstantiationValidationBenchmark(base.BenchmarkBaseClass):
def __init__(self, name, params):
base.BenchmarkBaseClass.__init__(self, name, params)
self.base_dir = "{}{}{}".format(
common.get_base_dir(), fp.EXPERIMENTAL_FRAMEWORK_DIR,
fp.DPDK_PKTGEN_DIR)
self.results_file = self.base_dir + PACKETS_FILE_NAME
self.lua_file = self.base_dir + 'constant_traffic.lua'
self.res_dir = ''
self.interface_name = ''
# Set the packet checker command
self.pkt_checker_command = common.get_base_dir()
self.pkt_checker_command += 'experimental_framework/libraries/'
self.pkt_checker_command += 'packet_checker/'
self.pkt_checker_command += PACKET_CHECKER_PROGRAM_NAME + ' '
[docs] def init(self):
"""
Initialize the benchmark
:return: None
"""
pass
[docs] def finalize(self):
"""
Finalizes the benchmark
:return: None
"""
pass
[docs] def get_features(self):
features = dict()
features['description'] = 'Instantiation Validation Benchmark'
features['parameters'] = [THROUGHPUT, VLAN_SENDER, VLAN_RECEIVER]
features['allowed_values'] = dict()
features['allowed_values'][THROUGHPUT] = map(str, range(0, 100))
features['allowed_values'][VLAN_SENDER] = map(str, range(-1, 4096))
features['allowed_values'][VLAN_RECEIVER] = map(str, range(-1, 4096))
features['default_values'] = dict()
features['default_values'][THROUGHPUT] = '1'
features['default_values'][VLAN_SENDER] = '-1'
features['default_values'][VLAN_RECEIVER] = '-1'
return features
[docs] def run(self):
# Setup packet generator
traffic_time = '10'
packet_size = '512'
traffic_rate_percentage = self.params[THROUGHPUT]
dpdk_pktgen_vars = common.get_dpdk_pktgen_vars()
# bus_address = dpdk_pktgen_vars[cfs.CFSP_DPDK_BUS_SLOT_NIC_2]
self.interface_name = dpdk_pktgen_vars[cfs.CFSP_DPDK_NAME_IF_2]
packetgen = dpdk.DpdkPacketGenerator()
self._configure_lua_file(traffic_rate_percentage, traffic_time)
packetgen.init_dpdk_pktgen(dpdk_interfaces=1,
pcap_file_0='packet_' + packet_size +
'.pcap',
pcap_file_1='igmp.pcap',
lua_script='constant_traffic.lua',
vlan_0=self.params[VLAN_SENDER],
vlan_1=self.params[VLAN_RECEIVER])
self._init_packet_checker()
# Send constant traffic at a specified rate
common.LOG.debug('Start the packet generator')
packetgen.send_traffic()
common.LOG.debug('Stop the packet generator')
time.sleep(5)
self._finalize_packet_checker()
self._reset_lua_file(traffic_rate_percentage, traffic_time)
return self._get_results()
def _configure_lua_file(self, traffic_rate_percentage, traffic_time):
"""
Configure the packet gen to write the results into the right file
:return: None
"""
common.replace_in_file(self.lua_file, 'local out_file = ""',
'local out_file = "' +
self.results_file + '"')
common.replace_in_file(self.lua_file, 'local traffic_rate = 0',
'local traffic_rate = ' +
traffic_rate_percentage)
common.replace_in_file(self.lua_file, 'local traffic_delay = 0',
'local traffic_delay = ' + traffic_time)
def _reset_lua_file(self, traffic_rate_percentage, traffic_time):
"""
Configure the packet gen to write the results into the right file
:param traffic_rate_percentage:
:param traffic_time:
:return: None
"""
common.replace_in_file(self.lua_file, 'local out_file = "' +
self.results_file + '"',
'local out_file = ""')
common.replace_in_file(self.lua_file, 'local traffic_rate = ' +
traffic_rate_percentage,
'local traffic_rate = 0')
common.replace_in_file(self.lua_file, 'local traffic_delay = ' +
traffic_time, 'local traffic_delay = 0')
def _get_results(self):
ret_val = dict()
packet_checker_res = 0
if self.res_dir:
packet_checker_res = \
int(common.get_file_first_line(self.res_dir +
'packet_checker.res'))
pkt_gen_res = int(common.get_file_first_line(self.results_file))
if pkt_gen_res <= packet_checker_res or \
(float(pkt_gen_res - packet_checker_res) / pkt_gen_res) <= 0.1:
ret_val['failure'] = '0'
else:
ret_val['failure'] = '1'
return ret_val
def _init_packet_checker(self):
"""
Sets up the multicast and starts the packet checker
:return:
"""
# Kill any other process running from previous failed execution
self.res_dir = common.get_result_dir()
pids = self._get_pids()
for pid in pids:
# os.kill(pid, signal.SIGTERM)
command = 'sudo kill ' + str(pid)
common.run_command(command)
# initialization of the VLAN interface
command = "sudo ip link add link "
command += self.interface_name
command += " name "
command += self.interface_name + '.' + self.params[VLAN_RECEIVER]
command += " type vlan id " + self.params[VLAN_RECEIVER]
common.run_command(command)
# set up the new
command = 'sudo ifconfig ' + self.interface_name + '.' + \
self.params[VLAN_RECEIVER]
# An IP address is required for the interface to receive a multicast
# flow. The specific address is not important
command += ' 10.254.254.254 up netmask 255.255.255.248'
common.run_command(command)
command = "sudo ifconfig "
command += self.interface_name + "." + self.params[VLAN_RECEIVER]
command += " promisc"
common.run_command(command)
# configure smcroute
command = "sudo echo 'mgroup from "
command += self.interface_name + '.' + self.params[VLAN_RECEIVER]
command += " group "
command += MULTICAST_GROUP
command += "' > /etc/smcroute.conf"
common.run_command(command)
# run smcroute on the interface
command = 'sudo smcroute -d'
common.run_command(command)
time.sleep(3)
# Start the packet checker
current_dir = os.path.dirname(os.path.realpath(__file__))
dir_list = self.pkt_checker_command.split('/')
directory = '/'.join(dir_list[0:len(dir_list)-1])
os.chdir(directory)
command = "make"
common.run_command(command)
os.chdir(current_dir)
command = "sudo chmod +x {}".format(self.pkt_checker_command)
common.run_command(command)
command = 'sudo ' + self.pkt_checker_command
command += self.interface_name + '.' + self.params[VLAN_RECEIVER]
command += ' 128'
command += ' &'
common.run_command(command)
def _finalize_packet_checker(self):
"""
Obtains the PID of the packet checker and sends an alarm to
terminate it
:return: None
"""
pids = self._get_pids()
for pid in pids:
# os.kill(pid, signal.SIGTERM)
command = 'sudo kill ' + str(pid)
common.run_command(command)
# stop smcroute on the interface
command = 'sudo smcroute -k'
common.run_command(command)
# finalization of the VLAN interface
command = "sudo ip link delete "
command += self.interface_name + '.' + self.params[VLAN_RECEIVER]
common.run_command(command)
def _get_pids(self):
"""
Returns a list of integers containing the pid or the pids of the
processes currently running on the host
:return: type: list of int
"""
output = commands.getoutput("ps -ef |pgrep " +
PACKET_CHECKER_PROGRAM_NAME)
if not output:
pids = []
else:
pids = map(int, output.split('\n'))
return pids