Committed by
Gerrit Code Review
Add examples/ dir, README, and multicluster.py
multicluster.py creates two ONOS "clusters" (1 node by default, though larger are possible), each of which is responsible for a separate segment of the data network. Change-Id: I233c9884b565bd6a28fa1a05e990e86207c88347
Showing
3 changed files
with
104 additions
and
0 deletions
tools/dev/mininet/examples/README
0 → 100644
tools/dev/mininet/examples/multicluster.py
0 → 100755
1 | +#!/usr/bin/python | ||
2 | + | ||
3 | +""" | ||
4 | +multicluster.py: multiple ONOS clusters example | ||
5 | + | ||
6 | +We create two ONOSClusters, "east" and "west", and | ||
7 | +a LinearTopo data network where the first and second halves | ||
8 | +of the network are connected to each ONOSCluster, | ||
9 | +respectively. | ||
10 | + | ||
11 | +The size of the ONOSCluster is determined by its | ||
12 | +topology. In this example the topology is a | ||
13 | +SingleSwitchTopo of size 1, so the "Cluster" is | ||
14 | +actually a single node (for performance and | ||
15 | +resource usage reasons.) However, it is possible | ||
16 | +to use larger cluster sizes in a large (!) Mininet VM, | ||
17 | +(e.g. 12 GB of RAM for two 3-node ONOS clusters.) | ||
18 | + | ||
19 | +The MultiSwitch class is a customized version of | ||
20 | +ONOSOVSSwitch that has a "controller" instance variable | ||
21 | +(and parameter) | ||
22 | +""" | ||
23 | + | ||
24 | +from mininet.net import Mininet | ||
25 | +from mininet.topo import LinearTopo, SingleSwitchTopo | ||
26 | +from mininet.log import setLogLevel | ||
27 | +from mininet.topolib import TreeTopo | ||
28 | +from mininet.clean import cleanup | ||
29 | + | ||
30 | +from onos import ONOSCluster, ONOSOVSSwitch, ONOSCLI, RenamedTopo | ||
31 | + | ||
32 | + | ||
33 | +class MultiSwitch( ONOSOVSSwitch ): | ||
34 | + "Custom OVSSwitch() subclass that connects to different clusters" | ||
35 | + | ||
36 | + def __init__( self, *args, **kwargs ): | ||
37 | + "controller: controller/ONOSCluster to connect to" | ||
38 | + self.controller = kwargs.pop( 'controller', None ) | ||
39 | + ONOSOVSSwitch.__init__( self, *args, **kwargs ) | ||
40 | + | ||
41 | + def start( self, controllers ): | ||
42 | + "Start and connect to our previously specified controller" | ||
43 | + return ONOSOVSSwitch.start( self, [ self.controller ] ) | ||
44 | + | ||
45 | + | ||
46 | +def run(): | ||
47 | + "Test a multiple ONOS cluster network" | ||
48 | + setLogLevel( 'info' ) | ||
49 | + # East and west control network topologies (using RenamedTopo) | ||
50 | + # We specify switch and host prefixes to avoid name collisions | ||
51 | + # East control switch prefix: 'east_cs', ONOS node prefix: 'east_onos' | ||
52 | + # Each network is a renamed SingleSwitchTopo of size clusterSize | ||
53 | + # It's also possible to specify your own control network topology | ||
54 | + clusterSize = 1 | ||
55 | + etopo = RenamedTopo( SingleSwitchTopo, clusterSize, | ||
56 | + snew='east_cs', hnew='east_onos' ) | ||
57 | + wtopo = RenamedTopo( SingleSwitchTopo, clusterSize, | ||
58 | + snew='west_cs', hnew='west_onos' ) | ||
59 | + # east and west ONOS clusters | ||
60 | + # Note that we specify the NAT node names to avoid name collisions | ||
61 | + east = ONOSCluster( 'east', topo=etopo, ipBase='192.168.123.0/24', | ||
62 | + nat='enat0' ) | ||
63 | + west = ONOSCluster( 'west', topo=wtopo, ipBase='192.168.124.0/24', | ||
64 | + nat='wnat0' ) | ||
65 | + # Data network topology | ||
66 | + topo = LinearTopo( 10 ) | ||
67 | + # Create network | ||
68 | + net = Mininet( topo=topo, switch=MultiSwitch, controller=[ east, west ] ) | ||
69 | + # Assign switches to controllers | ||
70 | + count = len( net.switches ) | ||
71 | + for i, switch in enumerate( net.switches ): | ||
72 | + switch.controller = east if i < count/2 else west | ||
73 | + # Start up network | ||
74 | + net.start() | ||
75 | + ONOSCLI( net ) # run our special unified Mininet/ONOS CLI | ||
76 | + net.stop() | ||
77 | + | ||
78 | +# Add a "controllers" command to ONOSCLI | ||
79 | + | ||
80 | +def do_controllers( self, line ): | ||
81 | + "List controllers assigned to switches" | ||
82 | + cmap = {} | ||
83 | + for s in self.mn.switches: | ||
84 | + c = getattr( s, 'controller', None ).name | ||
85 | + cmap.setdefault( c, [] ).append( s.name ) | ||
86 | + for c in sorted( cmap.keys() ): | ||
87 | + switches = ' '.join( cmap[ c ] ) | ||
88 | + print '%s: %s' % ( c, switches ) | ||
89 | + | ||
90 | +ONOSCLI.do_controllers = do_controllers | ||
91 | + | ||
92 | + | ||
93 | +if __name__ == '__main__': | ||
94 | + run() |
tools/dev/mininet/examples/onos.py
0 → 120000
1 | +../onos.py | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
-
Please register or login to post a comment