X-Git-Url: https://osm.etsi.org/gitweb/?p=osm%2Fvim-emu.git;a=blobdiff_plain;f=examples%2Fperformance_measurements%2Fvnffg.py;fp=examples%2Fperformance_measurements%2Fvnffg.py;h=3959b3ab7cc96bacb5bb1b5d692427ae79d83071;hp=0000000000000000000000000000000000000000;hb=1cecd7c1632f0661ba05e4c4fa028523988bd3c9;hpb=962219995947a8b9c14b4fed0813ca91c9ad0af7 diff --git a/examples/performance_measurements/vnffg.py b/examples/performance_measurements/vnffg.py new file mode 100644 index 0000000..3959b3a --- /dev/null +++ b/examples/performance_measurements/vnffg.py @@ -0,0 +1,120 @@ +#!/usr/bin/env python2 +# Copyright (c) 2019 Erik Schilling +# 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. + +import csv +import json +import os + +import time +from jinja2 import Environment, FileSystemLoader + +from emuvim.api.osm.pre_configured_osm import PreConfiguredOSM +from emuvim.api.util.docker_utils import build_dockerfile_dir + + +# sys.path.append('/vim-emu/pycharm-debug.egg') +# import pydevd +# pydevd.settrace('10.0.2.2', port=21001, stdoutToServer=True, stderrToServer=True, suspend=False) + +prefix = os.path.dirname(os.path.abspath(__file__)) + +build_dockerfile_dir('../images/trafficdebug/', 'trafficdebug') + +env = Environment( + loader=FileSystemLoader(os.path.join(prefix, '../templates/')) +) +template = env.get_template('vnffg-nsd.yaml') + +IPERF_TIME = 30 + + +def run_iperf(node, target_ip, target_port): + vnffg_iperf_out = node.cmd('iperf3 -J -t %d -c %s -p %d' % (IPERF_TIME, target_ip, target_port)) + print(vnffg_iperf_out) + vnffg_iperf = json.loads(vnffg_iperf_out) + vnffg_rtt = vnffg_iperf['end']['streams'][0]['sender']['mean_rtt'] + vnffg_bits_per_second = vnffg_iperf['end']['sum_received']['bits_per_second'] + return vnffg_rtt, vnffg_bits_per_second + + +def main(): + with open('vnffg-%d.csv' % time.time(), 'w') as csvfile: + fieldnames = ['n', 'deploy', 'vnffg_iperf_rtt', 'vnffg_iperf_bps', + 'normal_iperf_rtt', 'normal_iperf_bps', 'delete'] + writer = csv.DictWriter(csvfile, fieldnames=fieldnames) + + writer.writeheader() + + # vim-emu increases the subnet ip part by 1 for each run + subnet = 0 + + for n in range(1, 15 + 1): + # render NSD template for current iteration + with open(os.path.join(prefix, '../autogenerated/vnffg-nsd/vnffg-nsd.yml'), 'w') as f: + f.write(template.render(n=n, subnet=subnet)) + + with PreConfiguredOSM(osm_version='master') as osm: + osm.onboard_vnfd('../vnfs/vnffg') + nsd_id = osm.onboard_nsd('../autogenerated/vnffg-nsd') + ns_create = time.time() + osm.ns_create('vnffg-%d' % n, nsd_id) + + osm.ns_wait_until_all_in_status('running') + + ns_deploy_done = time.time() + + # ensure that port chains are created, they are not reported by the API. + time.sleep(60) + + first_name = 'dc1_vnffg-%d-1--1' % n + last_name = 'dc1_vnffg-%d-%d--1' % (n, n + 1) + first_node = osm.api.compute.find_server_by_name_or_id(first_name).emulator_compute + last_node = osm.api.compute.find_server_by_name_or_id(last_name).emulator_compute + + last_node.cmd('iperf3 -s -p 80 > /dev/null &') + last_node.cmd('iperf3 -s -p 81 > /dev/null &') + + # give iperf3 servers time to start up + time.sleep(1) + + target_ip = '10.0.%d.%d' % (subnet, n + 2) + vnffg_rtt, vnffg_bits_per_second = run_iperf(first_node, target_ip, 80) + normal_rtt, normal_bits_per_second = run_iperf(first_node, target_ip, 81) + + ns_delete = time.time() + for ns in osm.ns_list(): + osm.ns_delete(ns['id']) + + osm.ns_wait_until_all_in_status('terminated') + + ns_delete_done = time.time() + measurement = { + 'n': n, + 'deploy': ns_deploy_done - ns_create, + 'vnffg_iperf_rtt': vnffg_rtt, + 'vnffg_iperf_bps': vnffg_bits_per_second, + 'normal_iperf_rtt': normal_rtt, + 'normal_iperf_bps': normal_bits_per_second, + 'delete': ns_delete_done - ns_delete + } + writer.writerow(measurement) + csvfile.flush() + + subnet += 1 + + +if __name__ == '__main__': + main()