Skip to content

Instantly share code, notes, and snippets.

@fno2010
Created January 25, 2018 06:42
Show Gist options
  • Save fno2010/322ef61c91732cc77bc73d421486338e to your computer and use it in GitHub Desktop.
Save fno2010/322ef61c91732cc77bc73d421486338e to your computer and use it in GitHub Desktop.
Utility script to generate mininet topology from topologyzoo
#!/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()
@fno2010
Copy link
Author

fno2010 commented Jan 25, 2018

NOTE: Python 2.7 based currently.

Install networkx first:

pip install networkx

Download this scripts:

wget https://gist.github.com/fno2010/322ef61c91732cc77bc73d421486338e/raw/834ac3f838653ff04d5dec0243626b39c85e5ed8/mininetsim.py

Clone topologyzoo git repo on your local machine. And then run:

./mininetsim.py [GRAPHML_FILE] [CONTROLLER_ADDR]

For example:

./mininetsim.py topologyzoo/sources/Chinanet.graphml localhost

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment