Created
January 25, 2018 06:42
-
-
Save fno2010/322ef61c91732cc77bc73d421486338e to your computer and use it in GitHub Desktop.
Utility script to generate mininet topology from topologyzoo
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python | |
""" | |
run this file: | |
sudo -E python mininetsim.py {*.graphml} | |
""" | |
import networkx | |
import random | |
import sys | |
from mininet.net import Mininet | |
from mininet.topo import Topo | |
from mininet.link import TCLink | |
from mininet.node import RemoteController | |
from mininet.cli import CLI | |
from mininet.log import MininetLogger | |
convert_to_ip = lambda n: '10.0.' + str((int(n[1:])+1)//256) + '.' + str((int(n[1:])+1)%256) | |
convert_to_mac = lambda n: '12:34:56:78:' + '%02X'%((int(n[1:])+1)//256) + ':' + '%02X'%((int(n[1:])+1)%256) | |
class MininetSimulator(object): | |
def __init__(self, graph, controller_addr, seed = 1234567): | |
self.graph = graph | |
self.random = random.Random(seed) | |
self.mininet_topo = Topo(); | |
self.controller_addr = controller_addr | |
def generate_topo(self): | |
nodes = self.graph.nodes() | |
edges = self.graph.edges() | |
hosts = [n for n in nodes | |
if 1 == self.graph.in_degree()[n]+self.graph.out_degree()[n]] | |
for node in nodes: | |
if node in hosts: | |
self.mininet_topo.addHost(node, ip=convert_to_ip(node), mac=convert_to_mac(node)) | |
else: | |
self.mininet_topo.addSwitch(node, protocols='OpenFlow13') | |
# self.mininet_topo.addSwitch(node) | |
if len(hosts) == 0: | |
for node in nodes: | |
self.mininet_topo.addHost("host%s" % node, ip=convert_to_ip(node), mac=convert_to_mac(node)) | |
self.mininet_topo.addLink("host%s" % node, node) | |
for edge in edges: | |
# set link properties here. | |
# bw(Mbps), delay, loss, max_queue_size | |
# source code is in {mininet_root}/mininet/link.py | |
linkopts = dict() | |
self.mininet_topo.addLink(edge[0], edge[1], **linkopts) | |
def run(self): | |
self.generate_topo() | |
net = Mininet(topo=self.mininet_topo, | |
controller=RemoteController, | |
link=TCLink, | |
build=False, | |
# autoStaticArp=True | |
) | |
net.addController(ip=self.controller_addr) | |
net.start() | |
CLI(net) | |
net.stop() | |
def main(): | |
MininetLogger().setLogLevel(levelname='info') | |
filename = sys.argv[1] | |
g = networkx.read_graphml(filename) | |
sim = MininetSimulator(g, sys.argv[2]) | |
sim.run() | |
if __name__=='__main__': | |
if len(sys.argv) < 3: | |
print "Usage: ./mininetsim.py [GRAPHML_FILE] [CONTROLLER_ADDR]" | |
sys.exit() | |
main() | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Install
networkx
first:Download this scripts:
Clone topologyzoo git repo on your local machine. And then run:
For example: