Sebastian Rieger
7 years ago
commit
3ef8df1c85
1 changed files with 216 additions and 0 deletions
-
216gns3-bench.py
@ -0,0 +1,216 @@ |
|||||
|
#!/usr/bin/env python3 |
||||
|
|
||||
|
import getpass |
||||
|
import telnetlib |
||||
|
import requests |
||||
|
import json |
||||
|
import time |
||||
|
import sys |
||||
|
import time |
||||
|
from datetime import datetime |
||||
|
import os |
||||
|
|
||||
|
######################################################################### |
||||
|
# |
||||
|
# parameters |
||||
|
# |
||||
|
######################################################################### |
||||
|
|
||||
|
# echo -e "usage: $0 <my-topology.virl> <number of concurrent simulations> <username> <password> <node-timeout> <global-timeout> [debug level], e.g.,\n" |
||||
|
# echo "$0 /home/virl/git-virl-hs-fulda/GIT-VIRL-HS-Fulda/advcompnet-lab2-dcn-fabricpath.virl 6 guest password 0.5 500" |
||||
|
|
||||
|
BASE_API_URL = "http://192.168.76.209:13080/v2" |
||||
|
|
||||
|
TELNET_HOST = "192.168.76.209" |
||||
|
USERNAME = sys.argv[3] |
||||
|
PORT = 13080 |
||||
|
|
||||
|
# PASSWORD = getpass.getpass() |
||||
|
PASSWORD = sys.argv[4] |
||||
|
|
||||
|
TIMEOUT = int(sys.argv[5]) |
||||
|
|
||||
|
PROJECT_NAME = sys.argv[1] |
||||
|
# PROJECT_ID = "69e293ac-a339-4d1d-b2e3-047dc2da8566" |
||||
|
|
||||
|
NUMBER_OF_CONCURRENT_BENCHMARK_PROJECTS = int(sys.argv[2]) |
||||
|
NUMBER_OF_BENCHMARK_RUNS = 1 |
||||
|
|
||||
|
######################################################################### |
||||
|
# |
||||
|
# start of script |
||||
|
# |
||||
|
######################################################################### |
||||
|
|
||||
|
# delete all stale benchmark projects left over from previous runs |
||||
|
r = requests.get(BASE_API_URL + '/projects', auth=(USERNAME, PASSWORD)) |
||||
|
if r.status_code == 200: |
||||
|
for entry in r.json(): |
||||
|
if str(entry['name']).startswith("benchmark"): |
||||
|
r = requests.delete(BASE_API_URL + '/projects/' + entry["project_id"], auth=(USERNAME, PASSWORD)) |
||||
|
if r.status_code == 204: |
||||
|
print("Deleted stale project %s (%s)..." % (entry["project_id"], entry["name"])) |
||||
|
else: |
||||
|
sys.exit("Could not delete project") |
||||
|
else: |
||||
|
sys.exit("Could not get stale benchmark projects") |
||||
|
|
||||
|
for run in range(1, NUMBER_OF_BENCHMARK_RUNS + 1): |
||||
|
|
||||
|
print("Starting run %i..." % run) |
||||
|
|
||||
|
# array containing the results of each run |
||||
|
results = [] |
||||
|
|
||||
|
# create timestamp on script start |
||||
|
time_start = time.time() |
||||
|
date_start = datetime.fromtimestamp(time_start).ctime() |
||||
|
print("Start at: %s " % date_start) |
||||
|
|
||||
|
r = requests.get(BASE_API_URL + '/projects', auth=(USERNAME, PASSWORD)) |
||||
|
if r.status_code == 200: |
||||
|
for entry in r.json(): |
||||
|
if entry['name'] == PROJECT_NAME: |
||||
|
# print(entry['project_id']) |
||||
|
PROJECT_ID = entry['project_id'] |
||||
|
else: |
||||
|
sys.exit("Could not get projects") |
||||
|
# array containing all created temporary benchmark projects |
||||
|
benchmarks = [] |
||||
|
|
||||
|
# duplicate project to create multiple temporary benchmark projects |
||||
|
for benchNumber in range(1, NUMBER_OF_CONCURRENT_BENCHMARK_PROJECTS + 1): |
||||
|
print("Adding benchmark %i" % benchNumber) |
||||
|
data = "{ \"name\": \"benchmark" + str(benchNumber) + "\"}" |
||||
|
r = requests.post(BASE_API_URL + '/projects/' + PROJECT_ID + '/duplicate', data, auth=(USERNAME, PASSWORD)) |
||||
|
if r.status_code == 201: |
||||
|
entry = r.json() |
||||
|
print("Created benchmark project %s (%s) from %s (%s)" % ( |
||||
|
entry['project_id'], entry['name'], PROJECT_ID, PROJECT_NAME)) |
||||
|
benchmarks.append(entry) |
||||
|
data = "{}" |
||||
|
r = requests.post(BASE_API_URL + '/projects/' + entry['project_id'] + '/open', data, |
||||
|
auth=(USERNAME, PASSWORD)) |
||||
|
if r.status_code == 201: |
||||
|
print("Opened benchmark project %s (%s)" % (entry['project_id'], entry['name'])) |
||||
|
else: |
||||
|
sys.exit("Could not open benchmark project") |
||||
|
else: |
||||
|
sys.exit("Could not duplicate project") |
||||
|
|
||||
|
# time.sleep(5) |
||||
|
|
||||
|
# start all nodes in all projects |
||||
|
for benchmark in benchmarks: |
||||
|
data = "{}" |
||||
|
r = requests.post(BASE_API_URL + '/projects/' + benchmark["project_id"] + '/nodes/start', data, |
||||
|
auth=(USERNAME, PASSWORD)) |
||||
|
if r.status_code == 204: |
||||
|
print("Started all nodes in project %s (%s) ..." % (benchmark["project_id"], benchmark["name"])) |
||||
|
else: |
||||
|
sys.exit("Could not start nodes") |
||||
|
|
||||
|
# create timestamp when nodes are started |
||||
|
time_started = time.time() |
||||
|
date_started = datetime.fromtimestamp(time_started).ctime() |
||||
|
print("Started at: %s " % date_started) |
||||
|
|
||||
|
# collect all active nodes in all projects to the nodes[] array |
||||
|
nodes = [] |
||||
|
for benchmark in benchmarks: |
||||
|
print("Getting nodes from " + benchmark["name"] + "...") |
||||
|
r = requests.get(BASE_API_URL + '/projects/' + benchmark["project_id"] + '/nodes', auth=(USERNAME, PASSWORD)) |
||||
|
if r.status_code == 200: |
||||
|
for entry in r.json(): |
||||
|
print("Found node: " + entry["name"] + " state: " + entry["status"] + " console: " + str( |
||||
|
entry["console"])) |
||||
|
if entry["status"] == "started": |
||||
|
nodes.append(entry) |
||||
|
print("Added node...") |
||||
|
else: |
||||
|
sys.exit("Not all nodes active") |
||||
|
else: |
||||
|
sys.exit("Could get state to count nodes") |
||||
|
|
||||
|
nodeCount = len(nodes) |
||||
|
print("Found %i nodes in all benchmarks..." % (len(nodes))) |
||||
|
|
||||
|
# create timestamp when nodes are active |
||||
|
time_active = time.time() |
||||
|
date_active = datetime.fromtimestamp(time_active).ctime() |
||||
|
print("Active at: %s " % datetime.fromtimestamp(time_active).ctime()) |
||||
|
|
||||
|
# check if nodes are usable |
||||
|
usable_nodes = [] |
||||
|
while len(nodes) > 0: |
||||
|
for entry in nodes: |
||||
|
print("Checking node %s in %s..." % (entry["name"], entry["project_id"])) |
||||
|
try: |
||||
|
tn = telnetlib.Telnet(TELNET_HOST, entry["console"]) |
||||
|
tn.write(b"\n" + b"\n" + b"\n") |
||||
|
response = tn.read_until(b" login:", timeout=TIMEOUT) |
||||
|
# print(response) |
||||
|
if response.find("login:".encode()) != -1: |
||||
|
print("Found usable node %s" % entry["name"]) |
||||
|
usable_nodes.append(entry) |
||||
|
nodes.remove(entry) |
||||
|
except TimeoutError: |
||||
|
print("Connection to %s in project %s timed out" % (entry["name"], entry["project_id"])) |
||||
|
|
||||
|
print(str(len(usable_nodes)) + " usable nodes...") |
||||
|
|
||||
|
# create timestamp when all nodes are usable |
||||
|
time_usable = time.time() |
||||
|
date_usable = datetime.fromtimestamp(time_usable).ctime() |
||||
|
print("Usable at: %s " % datetime.fromtimestamp(time_usable).ctime()) |
||||
|
|
||||
|
durationStart = time_started - time_start |
||||
|
durationActive = time_active - time_start |
||||
|
durationUsable = time_usable - time_start |
||||
|
# print results |
||||
|
print("\n\n\nResult:") |
||||
|
print("Start: %f " % durationStart) |
||||
|
print("Active: %f " % durationActive) |
||||
|
print("Usable: %f " % durationUsable) |
||||
|
|
||||
|
# file output |
||||
|
# Topology;ConcurrentSims;Nodes;Script-Start;Started;Active;Usable;Start Time (sec);Active Time (sec);Usable Time (sec);Average Console Delay (sec) |
||||
|
# advcompnet-lab-1-dcn-scenario1.virl;10;50;Mon Jun 12 12:48:51 GMT 2017;Mon Jun 12 12:51:49 GMT 2017;Mon Jun 12 12:55:33 GMT 2017;Mon Jun 12 12:56:23 GMT 2017;178;402;452;0,3453 |
||||
|
avgConsoleDelay = 0 |
||||
|
results.append("%s;%i;%i;%s;%s;%s;%s;%i;%i;%i;%f" % ( |
||||
|
PROJECT_NAME, NUMBER_OF_CONCURRENT_BENCHMARK_PROJECTS, nodeCount, date_start, date_started, date_active, |
||||
|
date_usable, durationStart, durationActive, durationUsable, avgConsoleDelay)) |
||||
|
|
||||
|
f = open("gns3bench.log", "a") |
||||
|
f.writelines(results) |
||||
|
f.write("\r\n") |
||||
|
f.close() |
||||
|
print("Appended output to %s" % os.path.join(os.getcwd(), str(f.name))) |
||||
|
|
||||
|
# stop here, if we don't won't to stop and delete benchmark projects |
||||
|
# sys.exit(0) |
||||
|
|
||||
|
# print("waiting...") |
||||
|
# time.sleep(1) |
||||
|
|
||||
|
# stop all nodes in all projects |
||||
|
# for benchmark in benchmarks: |
||||
|
# data = "{}" |
||||
|
# r = requests.post(BASE_API_URL + '/projects/' + benchmark["project_id"] + '/nodes/stop', data, |
||||
|
# auth=(USERNAME, PASSWORD)) |
||||
|
# if r.status_code == 204: |
||||
|
# print("Stopped all nodes in project " + benchmark["project_id"] + "...") |
||||
|
# else: |
||||
|
# sys.exit("Could not stop nodes") |
||||
|
|
||||
|
# delete the created benchmark projects |
||||
|
for benchmark in benchmarks: |
||||
|
r = requests.delete(BASE_API_URL + '/projects/' + benchmark["project_id"], auth=(USERNAME, PASSWORD)) |
||||
|
if r.status_code == 204: |
||||
|
print("Deleted project " + benchmark["name"] + "...") |
||||
|
else: |
||||
|
sys.exit("Could not delete project") |
||||
|
|
||||
|
print("%i runs finished" % NUMBER_OF_BENCHMARK_RUNS) |
||||
|
|
||||
|
sys.exit(0) |
Write
Preview
Loading…
Cancel
Save
Reference in new issue