#!/usr/bin/env python from mininet.cli import CLI from mininet.net import Mininet from mininet.node import RemoteController, OVSKernelSwitch MAC = 12 DPID = 16 class CustomCLI(CLI): """Custom CLI to allow us to add our own commands.""" def __init__ (self, net): """Init method for our custom CLI.""" self.net = net CLI.__init__(self, net) class Solar(object): """ Create a tiered topology from semi-scratch in Mininet """ def __init__(self, cname='onos', cips=['192.168.56.1'], islands=3, edges=2, hosts=2): """Create tower topology for mininet""" # We are creating the controller with local-loopback on purpose to avoid # having the switches connect immediately. Instead, we'll set controller # explicitly for each switch after configuring it as we want. self.ctrls = [ RemoteController(cname, cip, 6653) for cip in cips ] self.net = Mininet(controller=RemoteController, switch = OVSKernelSwitch, build=False) self.cips = cips self.spines = [] self.leaves = [] self.hosts = [] for ctrl in self.ctrls: self.net.addController(ctrl) # Create the two core switches and links between them c1 = self.net.addSwitch('c1',dpid='1111000000000000') c2 = self.net.addSwitch('c2',dpid='2222000000000000') self.spines.append(c1) self.spines.append(c2) self.net.addLink(c1, c2) self.net.addLink(c2, c1) for i in range(1, islands + 1): sc = self.createSpineClump(i, edges, hosts) self.net.addLink(c1, sc[0]) self.net.addLink(c2, sc[0]) self.net.addLink(c1, sc[1]) self.net.addLink(c2, sc[1]) def createSpineClump(self, island, edges, hosts): """ Creates a clump of spine and edge switches with hosts""" s1 = self.net.addSwitch('s%1d1' % island,dpid='00000%1d0100000000' % island) s2 = self.net.addSwitch('s%1d2' % island,dpid='00000%1d0200000000' % island) self.net.addLink(s1, s2) self.net.addLink(s2, s1) for i in range(1, edges + 1): es = self.createEdgeSwitch(island, i, hosts) self.net.addLink(es, s1) self.net.addLink(es, s2) self.spines.append(s1) self.spines.append(s2) clump = [] clump.append(s1) clump.append(s2) return clump def createEdgeSwitch(self, island, index, hosts): """ Creates an edge switch in an island and ads hosts to it""" sw = self.net.addSwitch('e%1d%1d' % (island, index),dpid='0000000%1d0000000%1d' % (island, index)) self.leaves.append(sw) for j in range(1, hosts + 1): host = self.net.addHost('h%d%d%d' % (island, index, j),ip='10.%d.%d.%d' % (island, index, j)) self.net.addLink(host, sw) self.hosts.append(host) return sw def run(self): """ Runs the created network topology and launches mininet cli""" self.net.build() self.net.start() CustomCLI(self.net) self.net.stop() def pingAll(self): """ PingAll to create flows - for unit testing """ self.net.pingAll() def stop(self): "Stops the topology. You should call this after run_silent" self.net.stop()