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