Committed by
Gerrit Code Review
Remove obsolete/confusing onos.py
Change-Id: I21e6dee9164352140cfa50c48904ec8139854c84
Showing
1 changed file
with
0 additions
and
225 deletions
tools/test/topos/onos.py
deleted
100755 → 0
1 | -#!/usr/bin/env python | ||
2 | - | ||
3 | -# TODO add onos-app-fwd to features | ||
4 | -# TODO check if service is running... i think this might already be done by mn | ||
5 | - | ||
6 | -from mininet.node import Controller, OVSSwitch, CPULimitedHost, RemoteController | ||
7 | -from mininet.net import Mininet | ||
8 | -from mininet.cli import CLI | ||
9 | -from mininet.topo import LinearTopo, Topo | ||
10 | -from mininet.log import setLogLevel, info, warn | ||
11 | -from mininet.util import quietRun, numCores | ||
12 | - | ||
13 | -from shutil import copyfile | ||
14 | -from os import environ, path | ||
15 | -from functools import partial | ||
16 | -import time | ||
17 | -from sys import argv | ||
18 | -from time import sleep | ||
19 | -from sets import Set | ||
20 | - | ||
21 | -class ONOS( Controller ): | ||
22 | - "TODO" | ||
23 | - | ||
24 | - onosDir = '/opt/onos/' | ||
25 | - | ||
26 | - def __init__( self, name, onosDir=onosDir, | ||
27 | - reactive=True, features=[ 'onos-app-tvue' ], | ||
28 | - **kwargs ): | ||
29 | - '''TODO''' | ||
30 | - | ||
31 | - Controller.__init__( self, name, **kwargs ) | ||
32 | - # the following have been done for us: | ||
33 | - #self.ip = ip ('127.0.0.1') | ||
34 | - #self.port = port (6653) | ||
35 | - #self.protocol = protocol ('tcp') | ||
36 | - #self.checkListening() | ||
37 | - | ||
38 | - self.onosDir = onosDir | ||
39 | - self.karafDir = onosDir + 'apache-karaf-3.0.5/' | ||
40 | - self.instanceDir = self.karafDir | ||
41 | - | ||
42 | - # add default modules | ||
43 | - # TODO: consider an ordered set | ||
44 | - self.features = Set([ 'webconsole', | ||
45 | - 'onos-rest', | ||
46 | - 'onos-api', | ||
47 | - 'onos-cli', | ||
48 | - 'onos-openflow' ]) | ||
49 | - self.features.update( features ) | ||
50 | - # add reactive forwarding modules | ||
51 | - if reactive: | ||
52 | - self.features.update( ['onos-app-fwd', | ||
53 | - 'onos-app-proxyarp', | ||
54 | - 'onos-app-mobility' ] ) | ||
55 | - # add the distributed core if we are in a namespace with no trivial core | ||
56 | - if self.inNamespace and 'onos-core-trivial' not in self.features: | ||
57 | - self.features.add( 'onos-core' ) | ||
58 | - # if there is no core, add the trivial one | ||
59 | - if 'onos-core' not in self.features: | ||
60 | - self.features.add( 'onos-core-trivial' ) | ||
61 | - print self.features | ||
62 | - | ||
63 | - def start( self ): | ||
64 | - if self.inNamespace: | ||
65 | - instanceOpts = ( '-furl mvn:org.onosproject/onos-features/1.7.0-SNAPSHOT/xml/features ' | ||
66 | - '-s 8101' ) | ||
67 | - if self.ip is not None: | ||
68 | - instanceOpts += (' -a %s' % self.IP() ) | ||
69 | - self.userCmd( self.karafDir + 'bin/instance create %s %s' % ( instanceOpts, self.name ) ) | ||
70 | - self.instanceDir = self.karafDir + 'instances/%s/' % self.name | ||
71 | - else: | ||
72 | - # we are running in the root namespace, so let's use the root instance | ||
73 | - # clean up the data directory | ||
74 | - #self.userCmd( 'rm -rf '+ self.karafDir + 'data/' ) | ||
75 | - pass | ||
76 | - | ||
77 | - self.userCmd( 'rm -rf '+ self.instanceDir + 'data/' ) | ||
78 | - | ||
79 | - # Update etc/org.apache.karaf.features.cfg | ||
80 | - self.updateFeatures() | ||
81 | - | ||
82 | - # TODO 2. Update etc/hazelcast.xml : interface lines | ||
83 | - #cp etc/hazelcast.xml instances/c1/etc/ | ||
84 | - self.updateHazelcast() | ||
85 | - | ||
86 | - # TODO 3. Update etc/system.properties : onos.ip | ||
87 | - # TODO 4. Update config/cluster.json : with all nodes | ||
88 | - | ||
89 | - # start onos | ||
90 | - self.userCmd( '%sbin/instance start -d %s' % ( self.karafDir, self.name ) ) | ||
91 | - #TODO we should wait for startup... | ||
92 | - | ||
93 | - def stop( self ): | ||
94 | - self.userCmd( self.instanceDir + 'bin/stop' ) | ||
95 | - #if self.inNamespace: | ||
96 | - # self.userCmd( self.karafDir + 'bin/instance destroy %s' % self.name ) | ||
97 | - self.terminate() | ||
98 | - | ||
99 | - def updateHazelcast( self ): | ||
100 | - hz = '192.168.123.*' | ||
101 | - if self.ip is not None: | ||
102 | - hz = '.'.join(self.ip.split('.')[:-1]) + '.*' | ||
103 | - | ||
104 | - readfile = self.karafDir + 'etc/hazelcast.xml' | ||
105 | - writefile = self.instanceDir + 'etc/hazelcast.xml' | ||
106 | - with open( readfile, 'r' ) as r: | ||
107 | - with open( writefile, 'w' ) as w: | ||
108 | - for line in r.readlines(): | ||
109 | - if '<interface>' in line: | ||
110 | - line = '<interface>' + hz + '</interface>\n' | ||
111 | - w.write( line ) | ||
112 | - | ||
113 | - def updateFeatures( self ): | ||
114 | - filename = self.instanceDir + 'etc/org.apache.karaf.features.cfg' | ||
115 | - with open( filename, 'r+' ) as f: | ||
116 | - lines = f.readlines() | ||
117 | - f.seek(0) | ||
118 | - f.truncate() | ||
119 | - for line in lines: | ||
120 | - #print '?', line, | ||
121 | - if 'featuresBoot=' in line: | ||
122 | - # parse the features from the line | ||
123 | - features = line.rstrip().split('=')[1].split(',') | ||
124 | - # add the features to our features set | ||
125 | - self.features.update( features ) | ||
126 | - # generate the new features line | ||
127 | - line = 'featuresBoot=' + ','.join( self.features ) + '\n' | ||
128 | - #print '!', line, | ||
129 | - f.write( line ) | ||
130 | - | ||
131 | - | ||
132 | - @classmethod | ||
133 | - def isAvailable( self ): | ||
134 | - return quietRun( 'ls %s' % self.onosDir ) | ||
135 | - | ||
136 | - def userCmd( self, cmd ): | ||
137 | - # switch to the non-root user because karaf gets upset otherwise | ||
138 | - # because the .m2repo is not stored with root | ||
139 | - cmd = 'sudo -u %s %s' % ( self.findUser(), cmd ) | ||
140 | - return self.cmd( cmd ) | ||
141 | - | ||
142 | - @staticmethod | ||
143 | - def findUser(): | ||
144 | - "Try to return logged-in (usually non-root) user" | ||
145 | - try: | ||
146 | - # If we're running sudo | ||
147 | - return os.environ[ 'SUDO_USER' ] | ||
148 | - except: | ||
149 | - try: | ||
150 | - # Logged-in user (if we have a tty) | ||
151 | - return quietRun( 'who am i' ).split()[ 0 ] | ||
152 | - except: | ||
153 | - # Give up and return effective user | ||
154 | - return quietRun( 'whoami' ) | ||
155 | - | ||
156 | - | ||
157 | -class ControlNetwork( Topo ): | ||
158 | - "Control Network Topology" | ||
159 | - def __init__( self, n, dataController=ONOS, **kwargs ): | ||
160 | - """n: number of data network controller nodes | ||
161 | - dataController: class for data network controllers""" | ||
162 | - Topo.__init__( self, **kwargs ) | ||
163 | - # Connect everything to a single switch | ||
164 | - cs0 = self.addSwitch( 'cs0' ) | ||
165 | - # Add hosts which will serve as data network controllers | ||
166 | - for i in range( 1, n+1 ): | ||
167 | - c = self.addHost( 'c%s' % i, cls=dataController, | ||
168 | - inNamespace=True ) | ||
169 | - self.addLink( c, cs0 ) | ||
170 | - # Connect switch to root namespace so that data network | ||
171 | - # switches will be able to talk to us | ||
172 | - root = self.addHost( 'root', inNamespace=False ) | ||
173 | - self.addLink( root, cs0 ) | ||
174 | - | ||
175 | -class ONOSCluster( Controller ): | ||
176 | - # TODO | ||
177 | - n = 3 | ||
178 | - | ||
179 | - def start( self ): | ||
180 | - ctopo = ControlNetwork( n=self.n, dataController=ONOS ) | ||
181 | - self.cnet = Mininet( topo=ctopo, ipBase='192.168.123.0/24', controller=None ) | ||
182 | - self.cnet.addController( 'cc0', controller=Controller ) | ||
183 | - self.cnet.start() | ||
184 | - | ||
185 | - self.ctrls = [] | ||
186 | - for host in self.cnet.hosts: | ||
187 | - if isinstance( host, Controller ): | ||
188 | - self.ctrls.append( host ) | ||
189 | - host.start() | ||
190 | - | ||
191 | - def stop( self ): | ||
192 | - for host in self.cnet.hosts: | ||
193 | - if isinstance( host, Controller ): | ||
194 | - host.stop() | ||
195 | - self.cnet.stop() | ||
196 | - | ||
197 | - def clist( self ): | ||
198 | - "Return list of Controller proxies for this ONOS cluster" | ||
199 | - print 'controllers:', self.ctrls | ||
200 | - return self.ctrls | ||
201 | - | ||
202 | -class OVSSwitchONOS( OVSSwitch ): | ||
203 | - "OVS switch which connects to multiple controllers" | ||
204 | - def start( self, controllers ): | ||
205 | - assert len( controllers ) == 1 | ||
206 | - c0 = controllers[ 0 ] | ||
207 | - assert type( c0 ) == ONOSCluster | ||
208 | - controllers = c0.clist() | ||
209 | - OVSSwitch.start( self, controllers ) | ||
210 | - | ||
211 | -controllers = { 'onos': ONOS } | ||
212 | -switches = { 'ovso': OVSSwitchONOS } | ||
213 | - | ||
214 | -if __name__ == '__main__': | ||
215 | - # Simple test for ONOS() controller class | ||
216 | - setLogLevel( 'info' ) #TODO info | ||
217 | - size = 2 if len( argv ) != 2 else int( argv[ 1 ] ) | ||
218 | - net = Mininet( topo=LinearTopo( size ), | ||
219 | - #controller=ONOS, | ||
220 | - controller=partial( ONOSCluster, n=3 ), #TODO | ||
221 | - switch=OVSSwitchONOS ) | ||
222 | - net.start() | ||
223 | - #waitConnected( net.switches ) | ||
224 | - CLI( net ) | ||
225 | - net.stop() |
-
Please register or login to post a comment