├── README.md └── fattree.py /README.md: -------------------------------------------------------------------------------- 1 | # Fattree Topo 2 | 3 | This repository contains a fattree topo scripts of mininet. 4 | 5 | You can run it to create a fatree topology. The default value of arguments is (pod=8, host desity=4), which means that the number of pod is 8 while 4 host access to each access switch. 6 | 7 | The style of switch's name shows below: 8 | 9 | * S1XXX: core switches 10 | * S2XXX: aggregation switches 11 | * S3XXX: edge switches 12 | 13 | ### Getting started 14 | 15 | git clone https://github.com/muzixing/fattree.git 16 | cd fatree 17 | python fatree.py 18 | 19 | 20 | -------------------------------------------------------------------------------- /fattree.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | 3 | from mininet.net import Mininet 4 | from mininet.node import Controller, RemoteController 5 | from mininet.cli import CLI 6 | from mininet.log import setLogLevel, info 7 | from mininet.link import Link, Intf, TCLink 8 | from mininet.topo import Topo 9 | from mininet.util import dumpNodeConnections 10 | import logging 11 | import os 12 | 13 | logging.basicConfig(filename='./fattree.log', level=logging.INFO) 14 | logger = logging.getLogger(__name__) 15 | 16 | 17 | class Fattree(Topo): 18 | logger.debug("Class Fattree") 19 | CoreSwitchList = [] 20 | AggSwitchList = [] 21 | EdgeSwitchList = [] 22 | HostList = [] 23 | 24 | def __init__(self, k, density): 25 | logger.debug("Class Fattree init") 26 | self.pod = k 27 | self.iCoreLayerSwitch = (k/2)**2 28 | self.iAggLayerSwitch = k*k/2 29 | self.iEdgeLayerSwitch = k*k/2 30 | self.density = density 31 | self.iHost = self.iEdgeLayerSwitch * density 32 | 33 | #Init Topo 34 | Topo.__init__(self) 35 | 36 | def createTopo(self): 37 | self.createCoreLayerSwitch(self.iCoreLayerSwitch) 38 | self.createAggLayerSwitch(self.iAggLayerSwitch) 39 | self.createEdgeLayerSwitch(self.iEdgeLayerSwitch) 40 | self.createHost(self.iHost) 41 | 42 | """ 43 | Create Switch and Host 44 | """ 45 | 46 | def _addSwitch(self, number, level, switch_list): 47 | for x in xrange(1, number+1): 48 | PREFIX = str(level) + "00" 49 | if x >= int(10): 50 | PREFIX = str(level) + "0" 51 | switch_list.append(self.addSwitch('s' + PREFIX + str(x))) 52 | 53 | def createCoreLayerSwitch(self, NUMBER): 54 | logger.debug("Create Core Layer") 55 | self._addSwitch(NUMBER, 1, self.CoreSwitchList) 56 | 57 | def createAggLayerSwitch(self, NUMBER): 58 | logger.debug("Create Agg Layer") 59 | self._addSwitch(NUMBER, 2, self.AggSwitchList) 60 | 61 | def createEdgeLayerSwitch(self, NUMBER): 62 | logger.debug("Create Edge Layer") 63 | self._addSwitch(NUMBER, 3, self.EdgeSwitchList) 64 | 65 | def createHost(self, NUMBER): 66 | logger.debug("Create Host") 67 | for x in xrange(1, NUMBER+1): 68 | PREFIX = "h00" 69 | if x >= int(10): 70 | PREFIX = "h0" 71 | elif x >= int(100): 72 | PREFIX = "h" 73 | self.HostList.append(self.addHost(PREFIX + str(x))) 74 | 75 | """ 76 | Add Link 77 | """ 78 | def createLink(self, bw_c2a=0.2, bw_a2e=0.1, bw_h2a=0.5): 79 | logger.debug("Add link Core to Agg.") 80 | end = self.pod/2 81 | for x in xrange(0, self.iAggLayerSwitch, end): 82 | for i in xrange(0, end): 83 | for j in xrange(0, end): 84 | self.addLink( 85 | self.CoreSwitchList[i*end+j], 86 | self.AggSwitchList[x+i], 87 | bw=bw_c2a) 88 | 89 | logger.debug("Add link Agg to Edge.") 90 | for x in xrange(0, self.iAggLayerSwitch, end): 91 | for i in xrange(0, end): 92 | for j in xrange(0, end): 93 | self.addLink( 94 | self.AggSwitchList[x+i], self.EdgeSwitchList[x+j], 95 | bw=bw_a2e) 96 | 97 | logger.debug("Add link Edge to Host.") 98 | for x in xrange(0, self.iEdgeLayerSwitch): 99 | for i in xrange(0, self.density): 100 | self.addLink( 101 | self.EdgeSwitchList[x], 102 | self.HostList[self.density * x + i], 103 | bw=bw_h2a) 104 | 105 | def set_ovs_protocol_13(self,): 106 | self._set_ovs_protocol_13(self.CoreSwitchList) 107 | self._set_ovs_protocol_13(self.AggSwitchList) 108 | self._set_ovs_protocol_13(self.EdgeSwitchList) 109 | 110 | def _set_ovs_protocol_13(self, sw_list): 111 | for sw in sw_list: 112 | cmd = "sudo ovs-vsctl set bridge %s protocols=OpenFlow13" % sw 113 | os.system(cmd) 114 | 115 | 116 | def iperfTest(net, topo): 117 | logger.debug("Start iperfTEST") 118 | h1000, h1015, h1016 = net.get( 119 | topo.HostList[0], topo.HostList[14], topo.HostList[15]) 120 | 121 | #iperf Server 122 | h1000.popen( 123 | 'iperf -s -u -i 1 > iperf_server_differentPod_result', shell=True) 124 | 125 | #iperf Server 126 | h1015.popen( 127 | 'iperf -s -u -i 1 > iperf_server_samePod_result', shell=True) 128 | 129 | #iperf Client 130 | h1016.cmdPrint('iperf -c ' + h1000.IP() + ' -u -t 10 -i 1 -b 100m') 131 | h1016.cmdPrint('iperf -c ' + h1015.IP() + ' -u -t 10 -i 1 -b 100m') 132 | 133 | 134 | def pingTest(net): 135 | logger.debug("Start Test all network") 136 | net.pingAll() 137 | 138 | 139 | def createTopo(pod, density, ip="127.0.0.1", port=6633, bw_c2a=0.2, bw_a2e=0.1, bw_h2a=0.05): 140 | logging.debug("LV1 Create Fattree") 141 | topo = Fattree(pod, density) 142 | topo.createTopo() 143 | topo.createLink(bw_c2a=bw_c2a, bw_a2e=bw_a2e, bw_h2a=bw_h2a) 144 | 145 | logging.debug("LV1 Start Mininet") 146 | CONTROLLER_IP = ip 147 | CONTROLLER_PORT = port 148 | net = Mininet(topo=topo, link=TCLink, controller=None, autoSetMacs=True, 149 | autoStaticArp=True) 150 | net.addController( 151 | 'controller', controller=RemoteController, 152 | ip=CONTROLLER_IP, port=CONTROLLER_PORT) 153 | net.start() 154 | 155 | ''' 156 | Set OVS's protocol as OF13 157 | ''' 158 | topo.set_ovs_protocol_13() 159 | 160 | logger.debug("LV1 dumpNode") 161 | 162 | #dumpNodeConnections(net.hosts) 163 | #pingTest(net) 164 | #iperfTest(net, topo) 165 | 166 | CLI(net) 167 | net.stop() 168 | 169 | if __name__ == '__main__': 170 | setLogLevel('info') 171 | if os.getuid() != 0: 172 | logger.debug("You are NOT root") 173 | elif os.getuid() == 0: 174 | createTopo(8, 4) 175 | --------------------------------------------------------------------------------