From c19af10d8f5dcba68bf2d4d235219b52a746f2f6 Mon Sep 17 00:00:00 2001 From: Mike Marsh <mmarsh@cs.umd.edu> Date: Sat, 10 Feb 2018 14:33:17 -0500 Subject: [PATCH] working on creating testbed --- README | 6 +++++ start_testbed.py | 69 +++++++++++++++++++++++++++++++++++++++--------- 2 files changed, 62 insertions(+), 13 deletions(-) diff --git a/README b/README index becec68..7b9782a 100644 --- a/README +++ b/README @@ -10,3 +10,9 @@ just going to run the command This will never exit, while it waits for more output to be appended to the file. +Before running start_testbed.py, you must run: + + sudo mkdir -p /var/run/netns + +This only needs to be done once for your VM. + diff --git a/start_testbed.py b/start_testbed.py index 4cd5295..3ed384b 100755 --- a/start_testbed.py +++ b/start_testbed.py @@ -1,43 +1,86 @@ #! /usr/bin/env python +import os import subprocess import yaml from argparse import ArgumentParser parser = ArgumentParser() -parser.add_argument('-f', '--file', - dest='file', - default='example.yml', - help='YML file containing the testbed configuration' - ) +parser.add_argument( + '-f', '--file', + dest='file', + default='example.yml', + help='YML file containing the testbed configuration' + ) args = parser.parse_args() with open(args.file) as cfile: conf = yaml.load(cfile) +ntwk = conf['network'] +base_addr = reduce( + lambda a,b : a*256+b, + [ int(q) for q in ntwk['subnet_addr'].split('.') ] + ) + +nodelist = list() + retval = subprocess.call(['docker','pull',conf['image']]) +def make_ip(i): + addr = base_addr + i + masks = [ 24, 16, 8, 0 ] + return '.'.join([ str((addr>>mask)&0xFF) for mask in masks ]) + +def connect_nodes(node1, node2): + ctr1 = nodelist[node1] + ctr2 = nodelist[node2] + print ctr1, ctr2 + def make_mesh(): - pass + global nodelist + num_nodes = len(nodelist) + [ connect_nodes(n1,n2) + for n1 in range(num_nodes-1) + for n2 in range(n1+1,num_nodes) ] def make_star(): pass -ntwk = conf['network'] - -def start_node(name,i): - ctr_name = '{name}{i}'.format(name=name,i=i) +def start_node(base_name,i): + global nodelist + name = base_name + str(i) command = ['docker', 'run', '-d', '--name', - ctr_name, + name, conf['image'] ] command.extend(conf['image_cmd'].split()) retval = subprocess.call(command) + entry = dict() + entry['name'] = name + entry['addr'] = make_ip(i) + entry['pid'] = subprocess.check_output([ + 'docker', + 'inspect', + '-f', + '{{.State.Pid}}', + name + ]).strip() + subprocess.call([ + 'sudo', + 'ln', + '-s', + '/proc/{pid}/ns/net'.format(pid=entry['pid'], + '/var/run/netns/{name}'.format(name=name) + ]) + nodelist.append(entry) + +for n in range(ntwk['num_nodes']): + start_node(ntwk['name'],n) -for i in range(ntwk['num_nodes']): - start_node(ntwk['name'],i) +make_mesh() -- GitLab