blob: 281fcf01ae6c41a1c143c211258ec2d1a2785668 [file] [log] [blame]
adminbae64d82013-08-01 10:50:15 -07001#!/usr/bin/env python
2'''
3Created on 26-Oct-2012
4
5@author: Anil Kumar (anilkumar.s@paxterrasolutions.com)
6
7
8 TestON is free software: you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation, either version 2 of the License, or
11 (at your option) any later version.
12
13 TestON is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with TestON. If not, see <http://www.gnu.org/licenses/>.
20
21
22MininetCliDriver is the basic driver which will handle the Mininet functions
23'''
admin2a9548d2014-06-17 14:08:07 -070024import traceback
adminbae64d82013-08-01 10:50:15 -070025import pexpect
26import struct
27import fcntl
28import os
29import signal
30import re
31import sys
32import core.teston
33sys.path.append("../")
34from drivers.common.cli.emulatordriver import Emulator
35from drivers.common.clidriver import CLI
36
37class MininetCliDriver(Emulator):
38 '''
Jon Hall41f40e82014-04-08 16:43:17 -070039 MininetCliDriver is the basic driver which will handle the Mininet functions
adminbae64d82013-08-01 10:50:15 -070040 '''
41 def __init__(self):
42 super(Emulator, self).__init__()
43 self.handle = self
44 self.wrapped = sys.modules[__name__]
45 self.flag = 0
46
47 def connect(self, **connectargs):
Jon Hall41f40e82014-04-08 16:43:17 -070048 '''
49 Here the main is the TestON instance after creating all the log handles.
50 '''
adminbae64d82013-08-01 10:50:15 -070051 for key in connectargs:
52 vars(self)[key] = connectargs[key]
53
54 self.name = self.options['name']
55 self.handle = super(MininetCliDriver, self).connect(user_name = self.user_name, ip_address = self.ip_address,port = None, pwd = self.pwd)
56
57 self.ssh_handle = self.handle
58
adminbae64d82013-08-01 10:50:15 -070059 if self.handle :
Jon Hallf2942ce2014-04-10 16:00:16 -070060 main.log.info(self.name+": Clearing any residual state or processes")
adminbae64d82013-08-01 10:50:15 -070061 self.handle.sendline("sudo mn -c")
adminf939f8b2014-04-03 17:22:56 -070062 i=self.handle.expect(['password\sfor\s','Cleanup\scomplete',pexpect.EOF,pexpect.TIMEOUT],120)
adminbae64d82013-08-01 10:50:15 -070063 if i==0:
Jon Hallf2942ce2014-04-10 16:00:16 -070064 main.log.info(self.name+": Sending sudo password")
adminf939f8b2014-04-03 17:22:56 -070065 self.handle.sendline(self.pwd)
66 i=self.handle.expect(['%s:'%(self.user),'\$',pexpect.EOF,pexpect.TIMEOUT],120)
adminbae64d82013-08-01 10:50:15 -070067 if i==1:
Jon Hallf2942ce2014-04-10 16:00:16 -070068 main.log.info(self.name+": Clean")
adminbae64d82013-08-01 10:50:15 -070069 elif i==2:
Jon Hallf2942ce2014-04-10 16:00:16 -070070 main.log.error(self.name+": Connection terminated")
adminbae64d82013-08-01 10:50:15 -070071 elif i==3: #timeout
Jon Hallf2942ce2014-04-10 16:00:16 -070072 main.log.error(self.name+": Something while cleaning MN took too long... " )
adminbae64d82013-08-01 10:50:15 -070073
Jon Hallf2942ce2014-04-10 16:00:16 -070074 main.log.info(self.name+": building fresh mininet")
adminbeea0032014-01-23 14:54:13 -080075 #### for reactive/PARP enabled tests
admin07529932013-11-22 14:58:28 -080076 cmdString = "sudo mn " + self.options['arg1'] + " " + self.options['arg2'] + " --mac --controller " + self.options['controller']
adminbeea0032014-01-23 14:54:13 -080077 #### for proactive flow with static ARP entries
78 #cmdString = "sudo mn " + self.options['arg1'] + " " + self.options['arg2'] + " --mac --arp --controller " + self.options['controller']
adminbae64d82013-08-01 10:50:15 -070079 self.handle.sendline(cmdString)
Jon Hall333fa8c2014-04-11 11:24:58 -070080 self.handle.expect(["sudo mn",pexpect.EOF,pexpect.TIMEOUT])
adminbae64d82013-08-01 10:50:15 -070081 while 1:
82 i=self.handle.expect(['mininet>','\*\*\*','Exception',pexpect.EOF,pexpect.TIMEOUT],300)
83 if i==0:
Jon Hallf2942ce2014-04-10 16:00:16 -070084 main.log.info(self.name+": mininet built")
adminbae64d82013-08-01 10:50:15 -070085 return main.TRUE
86 if i==1:
Jon Hall333fa8c2014-04-11 11:24:58 -070087 self.handle.expect(["\n",pexpect.EOF,pexpect.TIMEOUT])
adminbae64d82013-08-01 10:50:15 -070088 main.log.info(self.handle.before)
89 elif i==2:
Jon Hallf2942ce2014-04-10 16:00:16 -070090 main.log.error(self.name+": Launching mininet failed...")
adminbae64d82013-08-01 10:50:15 -070091 return main.FALSE
92 elif i==3:
Jon Hallf2942ce2014-04-10 16:00:16 -070093 main.log.error(self.name+": Connection timeout")
adminbae64d82013-08-01 10:50:15 -070094 return main.FALSE
95 elif i==4: #timeout
Jon Hallf2942ce2014-04-10 16:00:16 -070096 main.log.error(self.name+": Something took too long... " )
adminbae64d82013-08-01 10:50:15 -070097 return main.FALSE
adminbae64d82013-08-01 10:50:15 -070098 #if utilities.assert_matches(expect=patterns,actual=resultCommand,onpass="Network is being launched",onfail="Network launching is being failed "):
99 return main.TRUE
Jon Hallf2942ce2014-04-10 16:00:16 -0700100 else:#if no handle
101 main.log.error(self.name+": Connection failed to the host "+self.user_name+"@"+self.ip_address)
102 main.log.error(self.name+": Failed to connect to the Mininet")
adminbae64d82013-08-01 10:50:15 -0700103 return main.FALSE
104
105 def pingall(self):
106 '''
Jon Hall41f40e82014-04-08 16:43:17 -0700107 Verifies the reachability of the hosts using pingall command.
adminbae64d82013-08-01 10:50:15 -0700108 '''
109 if self.handle :
Jon Hallf2942ce2014-04-10 16:00:16 -0700110 main.log.info(self.name+": Checking reachabilty to the hosts using pingall")
Jon Hall6094a362014-04-11 14:46:56 -0700111 try:
Jon Hallefa4fa12014-04-14 11:40:21 -0700112 response = self.execute(cmd="pingall",prompt="mininet>",timeout=120)
Jon Hall6094a362014-04-11 14:46:56 -0700113 except pexpect.EOF:
114 main.log.error(self.name + ": EOF exception found")
115 main.log.error(self.name + ": " + self.handle.before)
116 main.cleanup()
117 main.exit()
adminbae64d82013-08-01 10:50:15 -0700118 pattern = 'Results\:\s0\%\sdropped\s\(0\/\d+\slost\)\s*$'
Jon Hallf2942ce2014-04-10 16:00:16 -0700119 #if utilities.assert_matches(expect=pattern,actual=response,onpass="All hosts are reaching",onfail="Unable to reach all the hosts"):
120 if re.search(pattern,response):
121 main.log.info(self.name+": All hosts are reachable")
adminbae64d82013-08-01 10:50:15 -0700122 return main.TRUE
123 else:
Jon Hallf2942ce2014-04-10 16:00:16 -0700124 main.log.error(self.name+": Unable to reach all the hosts")
adminbae64d82013-08-01 10:50:15 -0700125 return main.FALSE
126 else :
Jon Hallf2942ce2014-04-10 16:00:16 -0700127 main.log.error(self.name+": Connection failed to the host")
adminbae64d82013-08-01 10:50:15 -0700128 return main.FALSE
adminaeedddd2013-08-02 15:14:15 -0700129
130 def fpingHost(self,**pingParams):
131 '''
132 Uses the fping package for faster pinging...
133 *requires fping to be installed on machine running mininet
134 '''
135 args = utilities.parse_args(["SRC","TARGET"],**pingParams)
admin530b4c92013-08-14 16:54:35 -0700136 command = args["SRC"] + " fping -i 100 -t 20 -C 1 -q "+args["TARGET"]
adminaeedddd2013-08-02 15:14:15 -0700137 self.handle.sendline(command)
Jon Hall333fa8c2014-04-11 11:24:58 -0700138 self.handle.expect([args["TARGET"],pexpect.EOF,pexpect.TIMEOUT])
139 self.handle.expect(["mininet",pexpect.EOF,pexpect.TIMEOUT])
adminaeedddd2013-08-02 15:14:15 -0700140 response = self.handle.before
141 if re.search(":\s-" ,response):
Jon Hallf2942ce2014-04-10 16:00:16 -0700142 main.log.info(self.name+": Ping fail")
adminaeedddd2013-08-02 15:14:15 -0700143 return main.FALSE
admin530b4c92013-08-14 16:54:35 -0700144 elif re.search(":\s\d{1,2}\.\d\d", response):
Jon Hallf2942ce2014-04-10 16:00:16 -0700145 main.log.info(self.name+": Ping good!")
adminaeedddd2013-08-02 15:14:15 -0700146 return main.TRUE
Jon Hallf2942ce2014-04-10 16:00:16 -0700147 main.log.info(self.name+": Install fping on mininet machine... ")
148 main.log.info(self.name+": \n---\n"+response)
adminaeedddd2013-08-02 15:14:15 -0700149 return main.FALSE
adminbae64d82013-08-01 10:50:15 -0700150
151 def pingHost(self,**pingParams):
Jon Hallf2942ce2014-04-10 16:00:16 -0700152 '''
153 Ping from one mininet host to another
154 Currently the only supported Params: SRC and TARGET
155 '''
adminbae64d82013-08-01 10:50:15 -0700156 args = utilities.parse_args(["SRC","TARGET"],**pingParams)
157 #command = args["SRC"] + " ping -" + args["CONTROLLER"] + " " +args ["TARGET"]
Jon Hall0819fd92014-05-23 12:08:13 -0700158 command = args["SRC"] + " ping "+args ["TARGET"]+" -c 1 -i 1 -W 8"
Jon Hall6094a362014-04-11 14:46:56 -0700159 try:
Jon Hall6e18c7b2014-04-23 16:26:33 -0700160 main.log.warn("Sending: " + command)
161 #response = self.execute(cmd=command,prompt="mininet",timeout=10 )
162 self.handle.sendline(command)
163 i = self.handle.expect([command,pexpect.TIMEOUT])
164 if i == 1:
165 main.log.error(self.name + ": timeout when waiting for response from mininet")
166 main.log.error("response: " + str(self.handle.before))
167 i = self.handle.expect(["mininet>",pexpect.TIMEOUT])
168 if i == 1:
169 main.log.error(self.name + ": timeout when waiting for response from mininet")
170 main.log.error("response: " + str(self.handle.before))
171 response = self.handle.before
Jon Hall6094a362014-04-11 14:46:56 -0700172 except pexpect.EOF:
173 main.log.error(self.name + ": EOF exception found")
174 main.log.error(self.name + ": " + self.handle.before)
175 main.cleanup()
176 main.exit()
Jon Hallf2942ce2014-04-10 16:00:16 -0700177 main.log.info(self.name+": Ping Response: "+ response )
178 #if utilities.assert_matches(expect=',\s0\%\spacket\sloss',actual=response,onpass="No Packet loss",onfail="Host is not reachable"):
179 if re.search(',\s0\%\spacket\sloss',response):
Jon Hall6e18c7b2014-04-23 16:26:33 -0700180 main.log.info(self.name+": no packets lost, host is reachable")
adminbae64d82013-08-01 10:50:15 -0700181 main.last_result = main.TRUE
182 return main.TRUE
183 else :
Jon Hallf2942ce2014-04-10 16:00:16 -0700184 main.log.error(self.name+": PACKET LOST, HOST IS NOT REACHABLE")
adminbae64d82013-08-01 10:50:15 -0700185 main.last_result = main.FALSE
186 return main.FALSE
adminbae64d82013-08-01 10:50:15 -0700187
188 def checkIP(self,host):
189 '''
Jon Hall41f40e82014-04-08 16:43:17 -0700190 Verifies the host's ip configured or not.
adminbae64d82013-08-01 10:50:15 -0700191 '''
Jon Hallbd795bf2014-06-18 09:46:32 -0700192 self.handle.sendline("")
adminbae64d82013-08-01 10:50:15 -0700193 if self.handle :
Jon Hall6094a362014-04-11 14:46:56 -0700194 try:
195 response = self.execute(cmd=host+" ifconfig",prompt="mininet>",timeout=10)
196 except pexpect.EOF:
197 main.log.error(self.name + ": EOF exception found")
198 main.log.error(self.name + ": " + self.handle.before)
199 main.cleanup()
200 main.exit()
adminbae64d82013-08-01 10:50:15 -0700201
202 pattern = "inet\s(addr|Mask):([0-1]{1}[0-9]{1,2}|2[0-4][0-9]|25[0-5]|[0-9]{1,2}).([0-1]{1}[0-9]{1,2}|2[0-4][0-9]|25[0-5]|[0-9]{1,2}).([0-1]{1}[0-9]{1,2}|2[0-4][0-9]|25[0-5]|[0-9]{1,2}).([0-1]{1}[0-9]{1,2}|2[0-4][0-9]|25[0-5]|[0-9]{1,2})"
admin2a9548d2014-06-17 14:08:07 -0700203 #pattern = "inet addr:10.0.0.6"
Jon Hallf2942ce2014-04-10 16:00:16 -0700204 #if utilities.assert_matches(expect=pattern,actual=response,onpass="Host Ip configured properly",onfail="Host IP not found") :
205 if re.search(pattern,response):
206 main.log.info(self.name+": Host Ip configured properly")
adminbae64d82013-08-01 10:50:15 -0700207 return main.TRUE
208 else:
Jon Hallf2942ce2014-04-10 16:00:16 -0700209 main.log.error(self.name+": Host IP not found")
adminbae64d82013-08-01 10:50:15 -0700210 return main.FALSE
211 else :
Jon Hallf2942ce2014-04-10 16:00:16 -0700212 main.log.error(self.name+": Connection failed to the host")
adminbae64d82013-08-01 10:50:15 -0700213
214 def verifySSH(self,**connectargs):
Jon Hall6094a362014-04-11 14:46:56 -0700215 try:
216 response = self.execute(cmd="h1 /usr/sbin/sshd -D&",prompt="mininet>",timeout=10)
217 response = self.execute(cmd="h4 /usr/sbin/sshd -D&",prompt="mininet>",timeout=10)
218 for key in connectargs:
219 vars(self)[key] = connectargs[key]
220 response = self.execute(cmd="xterm h1 h4 ",prompt="mininet>",timeout=10)
221 except pexpect.EOF:
222 main.log.error(self.name + ": EOF exception found")
223 main.log.error(self.name + ": " + self.handle.before)
224 main.cleanup()
225 main.exit()
adminbae64d82013-08-01 10:50:15 -0700226 import time
227 time.sleep(20)
228 if self.flag == 0:
229 self.flag = 1
230 return main.FALSE
231 else :
232 return main.TRUE
233
234 def getMacAddress(self,host):
235 '''
Jon Hall41f40e82014-04-08 16:43:17 -0700236 Verifies the host's ip configured or not.
adminbae64d82013-08-01 10:50:15 -0700237 '''
238 if self.handle :
Jon Hall6094a362014-04-11 14:46:56 -0700239 try:
240 response = self.execute(cmd=host+" ifconfig",prompt="mininet>",timeout=10)
241 except pexpect.EOF:
242 main.log.error(self.name + ": EOF exception found")
243 main.log.error(self.name + ": " + self.handle.before)
244 main.cleanup()
245 main.exit()
adminbae64d82013-08-01 10:50:15 -0700246
Ahmed El-Hassanyf720e202014-04-04 16:11:36 -0700247 pattern = r'HWaddr\s([0-9A-F]{2}[:-]){5}([0-9A-F]{2})'
248 mac_address_search = re.search(pattern, response, re.I)
249 mac_address = mac_address_search.group().split(" ")[1]
Jon Hallf2942ce2014-04-10 16:00:16 -0700250 main.log.info(self.name+": Mac-Address of Host "+ host + " is " + mac_address)
Ahmed El-Hassanyf720e202014-04-04 16:11:36 -0700251 return mac_address
adminbae64d82013-08-01 10:50:15 -0700252 else :
Jon Hallf2942ce2014-04-10 16:00:16 -0700253 main.log.error(self.name+": Connection failed to the host")
Ahmed El-Hassanyfd329182014-04-10 11:38:16 -0700254
255 def getInterfaceMACAddress(self,host, interface):
256 '''
257 Return the IP address of the interface on the given host
258 '''
259 if self.handle :
Jon Hall6094a362014-04-11 14:46:56 -0700260 try:
261 response = self.execute(cmd=host+" ifconfig " + interface,
Ahmed El-Hassanyfd329182014-04-10 11:38:16 -0700262 prompt="mininet>",timeout=10)
Jon Hall6094a362014-04-11 14:46:56 -0700263 except pexpect.EOF:
264 main.log.error(self.name + ": EOF exception found")
265 main.log.error(self.name + ": " + self.handle.before)
266 main.cleanup()
267 main.exit()
Ahmed El-Hassanyfd329182014-04-10 11:38:16 -0700268
269 pattern = r'HWaddr\s([0-9A-F]{2}[:-]){5}([0-9A-F]{2})'
270 mac_address_search = re.search(pattern, response, re.I)
271 if mac_address_search is None:
272 main.log.info("No mac address found in %s" % response)
273 return main.FALSE
274 mac_address = mac_address_search.group().split(" ")[1]
275 main.log.info("Mac-Address of "+ host + ":"+ interface + " is " + mac_address)
276 return mac_address
277 else:
278 main.log.error("Connection failed to the host")
279
adminbae64d82013-08-01 10:50:15 -0700280 def getIPAddress(self,host):
281 '''
Jon Hall41f40e82014-04-08 16:43:17 -0700282 Verifies the host's ip configured or not.
adminbae64d82013-08-01 10:50:15 -0700283 '''
284 if self.handle :
Jon Hall6094a362014-04-11 14:46:56 -0700285 try:
286 response = self.execute(cmd=host+" ifconfig",prompt="mininet>",timeout=10)
287 except pexpect.EOF:
288 main.log.error(self.name + ": EOF exception found")
289 main.log.error(self.name + ": " + self.handle.before)
290 main.cleanup()
291 main.exit()
adminbae64d82013-08-01 10:50:15 -0700292
293 pattern = "inet\saddr:(\d+\.\d+\.\d+\.\d+)"
294 ip_address_search = re.search(pattern, response)
Jon Hallf2942ce2014-04-10 16:00:16 -0700295 main.log.info(self.name+": IP-Address of Host "+host +" is "+ip_address_search.group(1))
adminbae64d82013-08-01 10:50:15 -0700296 return ip_address_search.group(1)
297 else :
Jon Hallf2942ce2014-04-10 16:00:16 -0700298 main.log.error(self.name+": Connection failed to the host")
adminbae64d82013-08-01 10:50:15 -0700299
Ahmed El-Hassanyfd329182014-04-10 11:38:16 -0700300 def getSwitchDPID(self,switch):
301 '''
302 return the datapath ID of the switch
303 '''
304 if self.handle :
305 cmd = "py %s.dpid" % switch
Jon Hall6094a362014-04-11 14:46:56 -0700306 try:
307 response = self.execute(cmd=cmd,prompt="mininet>",timeout=10)
308 except pexpect.EOF:
309 main.log.error(self.name + ": EOF exception found")
310 main.log.error(self.name + ": " + self.handle.before)
311 main.cleanup()
312 main.exit()
Ahmed El-Hassanyfd329182014-04-10 11:38:16 -0700313 pattern = r'^(?P<dpid>\d)+'
314 result = re.search(pattern, response, re.MULTILINE)
315 if result is None:
316 main.log.info("Couldn't find DPID for switch '', found: %s" % (switch, response))
317 return main.FALSE
Jon Hallc1a1d242014-07-21 16:03:33 -0700318 return str(result.group(0))
Ahmed El-Hassanyfd329182014-04-10 11:38:16 -0700319 else:
320 main.log.error("Connection failed to the host")
321
322 def getInterfaces(self, node):
323 '''
324 return information dict about interfaces connected to the node
325 '''
326 if self.handle :
327 cmd = 'py "\\n".join(["name=%s,mac=%s,ip=%s,isUp=%s" % (i.name, i.MAC(), i.IP(), i.isUp())'
328 cmd += ' for i in %s.intfs.values()])' % node
Jon Hall6094a362014-04-11 14:46:56 -0700329 try:
330 response = self.execute(cmd=cmd,prompt="mininet>",timeout=10)
331 except pexpect.EOF:
332 main.log.error(self.name + ": EOF exception found")
333 main.log.error(self.name + ": " + self.handle.before)
334 main.cleanup()
335 main.exit()
Ahmed El-Hassanyfd329182014-04-10 11:38:16 -0700336 return response
337 else:
338 main.log.error("Connection failed to the node")
339
adminbae64d82013-08-01 10:50:15 -0700340 def dump(self):
Jon Hallf2942ce2014-04-10 16:00:16 -0700341 main.log.info(self.name+": Dump node info")
Jon Hall6094a362014-04-11 14:46:56 -0700342 try:
343 response = self.execute(cmd = 'dump',prompt = 'mininet>',timeout = 10)
344 except pexpect.EOF:
345 main.log.error(self.name + ": EOF exception found")
346 main.log.error(self.name + ": " + self.handle.before)
347 main.cleanup()
348 main.exit()
Ahmed El-Hassanyd1f71702014-04-04 16:12:45 -0700349 return response
adminbae64d82013-08-01 10:50:15 -0700350
351 def intfs(self):
Jon Hallf2942ce2014-04-10 16:00:16 -0700352 main.log.info(self.name+": List interfaces")
Jon Hall6094a362014-04-11 14:46:56 -0700353 try:
354 response = self.execute(cmd = 'intfs',prompt = 'mininet>',timeout = 10)
355 except pexpect.EOF:
356 main.log.error(self.name + ": EOF exception found")
357 main.log.error(self.name + ": " + self.handle.before)
358 main.cleanup()
359 main.exit()
Jon Hall668ed802014-04-08 17:17:59 -0700360 return response
adminbae64d82013-08-01 10:50:15 -0700361
362 def net(self):
Jon Hallf2942ce2014-04-10 16:00:16 -0700363 main.log.info(self.name+": List network connections")
Jon Hall6094a362014-04-11 14:46:56 -0700364 try:
365 response = self.execute(cmd = 'net',prompt = 'mininet>',timeout = 10)
366 except pexpect.EOF:
367 main.log.error(self.name + ": EOF exception found")
368 main.log.error(self.name + ": " + self.handle.before)
369 main.cleanup()
370 main.exit()
Jon Hall668ed802014-04-08 17:17:59 -0700371 return response
adminbae64d82013-08-01 10:50:15 -0700372
373 def iperf(self):
Jon Hallf2942ce2014-04-10 16:00:16 -0700374 main.log.info(self.name+": Simple iperf TCP test between two (optionally specified) hosts")
Jon Hall6094a362014-04-11 14:46:56 -0700375 try:
376 response = self.execute(cmd = 'iperf',prompt = 'mininet>',timeout = 10)
377 except pexpect.EOF:
378 main.log.error(self.name + ": EOF exception found")
379 main.log.error(self.name + ": " + self.handle.before)
380 main.cleanup()
381 main.exit()
Jon Hall668ed802014-04-08 17:17:59 -0700382 return response
adminbae64d82013-08-01 10:50:15 -0700383
384 def iperfudp(self):
Jon Hallf2942ce2014-04-10 16:00:16 -0700385 main.log.info(self.name+": Simple iperf TCP test between two (optionally specified) hosts")
Jon Hall6094a362014-04-11 14:46:56 -0700386 try:
387 response = self.execute(cmd = 'iperfudp',prompt = 'mininet>',timeout = 10)
388 except pexpect.EOF:
389 main.log.error(self.name + ": EOF exception found")
390 main.log.error(self.name + ": " + self.handle.before)
391 main.cleanup()
392 main.exit()
Jon Hall668ed802014-04-08 17:17:59 -0700393 return response
adminbae64d82013-08-01 10:50:15 -0700394
395 def nodes(self):
Jon Hallf2942ce2014-04-10 16:00:16 -0700396 main.log.info(self.name+": List all nodes.")
Jon Hall6094a362014-04-11 14:46:56 -0700397 try:
398 response = self.execute(cmd = 'nodes',prompt = 'mininet>',timeout = 10)
399 except pexpect.EOF:
400 main.log.error(self.name + ": EOF exception found")
401 main.log.error(self.name + ": " + self.handle.before)
402 main.cleanup()
403 main.exit()
Jon Hall668ed802014-04-08 17:17:59 -0700404 return response
adminbae64d82013-08-01 10:50:15 -0700405
406 def pingpair(self):
Jon Hallf2942ce2014-04-10 16:00:16 -0700407 main.log.info(self.name+": Ping between first two hosts")
Jon Hall6094a362014-04-11 14:46:56 -0700408 try:
409 response = self.execute(cmd = 'pingpair',prompt = 'mininet>',timeout = 20)
410 except pexpect.EOF:
411 main.log.error(self.name + ": EOF exception found")
412 main.log.error(self.name + ": " + self.handle.before)
413 main.cleanup()
414 main.exit()
adminbae64d82013-08-01 10:50:15 -0700415
Jon Hallf2942ce2014-04-10 16:00:16 -0700416 #if utilities.assert_matches(expect='0% packet loss',actual=response,onpass="No Packet loss",onfail="Hosts not reachable"):
417 if re.search(',\s0\%\spacket\sloss',response):
418 main.log.info(self.name+": Ping between two hosts SUCCESSFUL")
adminbae64d82013-08-01 10:50:15 -0700419 main.last_result = main.TRUE
420 return main.TRUE
421 else :
Jon Hallf2942ce2014-04-10 16:00:16 -0700422 main.log.error(self.name+": PACKET LOST, HOSTS NOT REACHABLE")
adminbae64d82013-08-01 10:50:15 -0700423 main.last_result = main.FALSE
424 return main.FALSE
425
426 def link(self,**linkargs):
427 '''
428 Bring link(s) between two nodes up or down
429 '''
430 main.log.info('Bring link(s) between two nodes up or down')
431 args = utilities.parse_args(["END1","END2","OPTION"],**linkargs)
432 end1 = args["END1"] if args["END1"] != None else ""
433 end2 = args["END2"] if args["END2"] != None else ""
434 option = args["OPTION"] if args["OPTION"] != None else ""
435 command = "link "+str(end1) + " " + str(end2)+ " " + str(option)
Jon Hall6094a362014-04-11 14:46:56 -0700436 try:
Jon Halle80ef8c2014-04-29 15:29:13 -0700437 #response = self.execute(cmd=command,prompt="mininet>",timeout=10)
438 self.handle.sendline(command)
439 self.handle.expect("mininet>")
Jon Hall6094a362014-04-11 14:46:56 -0700440 except pexpect.EOF:
441 main.log.error(self.name + ": EOF exception found")
442 main.log.error(self.name + ": " + self.handle.before)
443 main.cleanup()
444 main.exit()
adminbae64d82013-08-01 10:50:15 -0700445 return main.TRUE
446
447
admin530b4c92013-08-14 16:54:35 -0700448 def yank(self,**yankargs):
adminaeedddd2013-08-02 15:14:15 -0700449 '''
admin530b4c92013-08-14 16:54:35 -0700450 yank a mininet switch interface to a host
adminaeedddd2013-08-02 15:14:15 -0700451 '''
admin530b4c92013-08-14 16:54:35 -0700452 main.log.info('Yank the switch interface attached to a host')
453 args = utilities.parse_args(["SW","INTF"],**yankargs)
adminaeedddd2013-08-02 15:14:15 -0700454 sw = args["SW"] if args["SW"] !=None else ""
455 intf = args["INTF"] if args["INTF"] != None else ""
456 command = "py "+ str(sw) + '.detach("' + str(intf) + '")'
Jon Hall6094a362014-04-11 14:46:56 -0700457 try:
458 response = self.execute(cmd=command,prompt="mininet>",timeout=10)
459 except pexpect.EOF:
460 main.log.error(self.name + ": EOF exception found")
461 main.log.error(self.name + ": " + self.handle.before)
462 main.cleanup()
463 main.exit()
adminaeedddd2013-08-02 15:14:15 -0700464 return main.TRUE
465
466 def plug(self, **plugargs):
467 '''
468 plug the yanked mininet switch interface to a switch
469 '''
470 main.log.info('Plug the switch interface attached to a switch')
admin530b4c92013-08-14 16:54:35 -0700471 args = utilities.parse_args(["SW","INTF"],**plugargs)
adminaeedddd2013-08-02 15:14:15 -0700472 sw = args["SW"] if args["SW"] !=None else ""
473 intf = args["INTF"] if args["INTF"] != None else ""
474 command = "py "+ str(sw) + '.attach("' + str(intf) + '")'
Jon Hall6094a362014-04-11 14:46:56 -0700475 try:
476 response = self.execute(cmd=command,prompt="mininet>",timeout=10)
477 except pexpect.EOF:
478 main.log.error(self.name + ": EOF exception found")
479 main.log.error(self.name + ": " + self.handle.before)
480 main.cleanup()
481 main.exit()
adminaeedddd2013-08-02 15:14:15 -0700482 return main.TRUE
483
484
485
adminbae64d82013-08-01 10:50:15 -0700486 def dpctl(self,**dpctlargs):
487 '''
Jon Hall41f40e82014-04-08 16:43:17 -0700488 Run dpctl command on all switches.
adminbae64d82013-08-01 10:50:15 -0700489 '''
490 main.log.info('Run dpctl command on all switches')
491 args = utilities.parse_args(["CMD","ARGS"],**dpctlargs)
492 cmd = args["CMD"] if args["CMD"] != None else ""
493 cmdargs = args["ARGS"] if args["ARGS"] != None else ""
494 command = "dpctl "+cmd + " " + str(cmdargs)
Jon Hall6094a362014-04-11 14:46:56 -0700495 try:
496 response = self.execute(cmd=command,prompt="mininet>",timeout=10)
497 except pexpect.EOF:
498 main.log.error(self.name + ": EOF exception found")
499 main.log.error(self.name + ": " + self.handle.before)
500 main.cleanup()
501 main.exit()
adminbae64d82013-08-01 10:50:15 -0700502 return main.TRUE
503
504
505 def get_version(self):
506 file_input = path+'/lib/Mininet/INSTALL'
507 version = super(Mininet, self).get_version()
508 pattern = 'Mininet\s\w\.\w\.\w\w*'
509 for line in open(file_input,'r').readlines():
510 result = re.match(pattern, line)
511 if result:
512 version = result.group(0)
513 return version
514
admin2a9548d2014-06-17 14:08:07 -0700515 def get_sw_controller_sanity(self, sw):
516 command = "sh ovs-vsctl get-controller "+str(sw)
517 try:
518 response = self.execute(cmd=command,prompt="mininet>",timeout=10)
519 if response:
520 return main.TRUE
521 else:
522 return main.FALSE
523 except pexpect.EOF:
524 main.log.error(self.name + ": EOF exception found")
525 main.log.error(self.name + ": " + self.handle.before)
526 main.cleanup()
527 main.exit()
528 else:
529 main.log.info(response)
530
adminbae64d82013-08-01 10:50:15 -0700531 def get_sw_controller(self,sw):
532 command = "sh ovs-vsctl get-controller "+str(sw)
Jon Hall6094a362014-04-11 14:46:56 -0700533 try:
Jon Hallbd795bf2014-06-18 09:46:32 -0700534 self.handle.expect("mininet")
Jon Hall6094a362014-04-11 14:46:56 -0700535 response = self.execute(cmd=command,prompt="mininet>",timeout=10)
admin2a9548d2014-06-17 14:08:07 -0700536 print(response)
537 if response:
admindc1c5072014-06-24 15:57:19 -0700538 print("**********************")
admin2a9548d2014-06-17 14:08:07 -0700539 return response
540 else:
541 return main.FALSE
Jon Hall6094a362014-04-11 14:46:56 -0700542 except pexpect.EOF:
543 main.log.error(self.name + ": EOF exception found")
544 main.log.error(self.name + ": " + self.handle.before)
545 main.cleanup()
546 main.exit()
547 else:
548 main.log.info(response)
adminbae64d82013-08-01 10:50:15 -0700549
550 def assign_sw_controller(self,**kwargs):
Jon Hallf89c8552014-04-02 13:14:06 -0700551 '''
552 count is only needed if there is more than 1 controller
553 '''
554 args = utilities.parse_args(["COUNT"],**kwargs)
555 count = args["COUNT"] if args!={} else 1
556
557 argstring = "SW"
558 for j in range(count):
559 argstring = argstring + ",IP" + str(j+1) + ",PORT" + str(j+1)
560 args = utilities.parse_args(argstring.split(","),**kwargs)
561
adminbae64d82013-08-01 10:50:15 -0700562 sw = args["SW"] if args["SW"] != None else ""
admin530b4c92013-08-14 16:54:35 -0700563 ptcpA = int(args["PORT1"])+int(sw) if args["PORT1"] != None else ""
Jon Hallf89c8552014-04-02 13:14:06 -0700564 ptcpB = "ptcp:"+str(ptcpA) if ptcpA != "" else ""
565
566 command = "sh ovs-vsctl set-controller s" + str(sw) + " " + ptcpB + " "
567 for j in range(count):
568 i=j+1
569 args = utilities.parse_args(["IP"+str(i),"PORT"+str(i)],**kwargs)
570 ip = args["IP"+str(i)] if args["IP"+str(i)] != None else ""
571 port = args["PORT" + str(i)] if args["PORT" + str(i)] != None else ""
572 tcp = "tcp:" + str(ip) + ":" + str(port) + " " if ip != "" else ""
573 command = command + tcp
Jon Hall6094a362014-04-11 14:46:56 -0700574 try:
575 self.execute(cmd=command,prompt="mininet>",timeout=5)
576 except pexpect.EOF:
577 main.log.error(self.name + ": EOF exception found")
578 main.log.error(self.name + ": " + self.handle.before)
579 main.cleanup()
580 main.exit()
581 except:
582 main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
583 main.log.error( traceback.print_exc() )
584 main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
585 main.cleanup()
586 main.exit()
adminbae64d82013-08-01 10:50:15 -0700587
Jon Hall0819fd92014-05-23 12:08:13 -0700588 def delete_sw_controller(self,sw):
589 '''
590 Removes the controller target from sw
591 '''
592
593 command = "sh ovs-vsctl del-controller "+str(sw)
594 try:
595 response = self.execute(cmd=command,prompt="mininet>",timeout=10)
596 except pexpect.EOF:
597 main.log.error(self.name + ": EOF exception found")
598 main.log.error(self.name + ": " + self.handle.before)
599 main.cleanup()
600 main.exit()
601 else:
602 main.log.info(response)
603
604
adminbae64d82013-08-01 10:50:15 -0700605 def disconnect(self):
Jon Hallf2942ce2014-04-10 16:00:16 -0700606 main.log.info(self.name+": Disconnecting mininet...")
adminbae64d82013-08-01 10:50:15 -0700607 response = ''
608 if self.handle:
Jon Hall6094a362014-04-11 14:46:56 -0700609 try:
610 response = self.execute(cmd="exit",prompt="(.*)",timeout=120)
611 response = self.execute(cmd="exit",prompt="(.*)",timeout=120)
Jon Halle80ef8c2014-04-29 15:29:13 -0700612 self.handle.sendline("sudo mn -c")
Jon Hall6094a362014-04-11 14:46:56 -0700613 except pexpect.EOF:
614 main.log.error(self.name + ": EOF exception found")
615 main.log.error(self.name + ": " + self.handle.before)
616 main.cleanup()
617 main.exit()
adminbae64d82013-08-01 10:50:15 -0700618 else :
Jon Hallf2942ce2014-04-10 16:00:16 -0700619 main.log.error(self.name+": Connection failed to the host")
adminbae64d82013-08-01 10:50:15 -0700620 response = main.FALSE
621 return response
admin07529932013-11-22 14:58:28 -0800622
623 def arping(self, src, dest, destmac):
624 self.handle.sendline('')
Jon Hall333fa8c2014-04-11 11:24:58 -0700625 self.handle.expect(["mininet",pexpect.EOF,pexpect.TIMEOUT])
admin07529932013-11-22 14:58:28 -0800626
627 self.handle.sendline(src + ' arping ' + dest)
628 try:
Jon Hall333fa8c2014-04-11 11:24:58 -0700629 self.handle.expect([destmac,pexpect.EOF,pexpect.TIMEOUT])
Jon Hallf2942ce2014-04-10 16:00:16 -0700630 main.log.info(self.name+": ARP successful")
Jon Hall333fa8c2014-04-11 11:24:58 -0700631 self.handle.expect(["mininet",pexpect.EOF,pexpect.TIMEOUT])
admin07529932013-11-22 14:58:28 -0800632 return main.TRUE
633 except:
Jon Hallf2942ce2014-04-10 16:00:16 -0700634 main.log.warn(self.name+": ARP FAILURE")
Jon Hall333fa8c2014-04-11 11:24:58 -0700635 self.handle.expect(["mininet",pexpect.EOF,pexpect.TIMEOUT])
admin07529932013-11-22 14:58:28 -0800636 return main.FALSE
637
638 def decToHex(num):
639 return hex(num).split('x')[1]
admin2a9548d2014-06-17 14:08:07 -0700640
641 def getSwitchFlowCount(self, switch):
642 '''
643 return the Flow Count of the switch
644 '''
645 if self.handle:
646 cmd = "sh ovs-ofctl dump-aggregate %s" % switch
647 try:
648 response = self.execute(cmd=cmd, prompt="mininet>", timeout=10)
649 except pexpect.EOF:
650 main.log.error(self.name + ": EOF exception found")
651 main.log.error(self.name + " " + self.handle.before)
652 main.cleanup()
653 main.exit()
654 pattern = "flow_count=(\d+)"
655 result = re.search(pattern, response, re.MULTILINE)
656 if result is None:
657 print "no flow on switch print test"
658 main.log.info("Couldn't find flows on switch '', found: %s" % (switch, response))
659 return main.FALSE
660 return result.group(1)
661 else:
662 main.log.error("Connection failed to the Mininet host")
663
664 def check_flows(self, sw):
665 command = "sh ovs-ofctl dump-flows "+str(sw)
666 try:
667 response=self.execute(cmd=command,prompt="mininet>",timeout=10)
668 return response
669 except pexpect.EOF:
670 main.log.error(self.name + ": EOF exception found")
671 main.log.error(self.name + ": " + self.handle.before)
672 main.cleanup()
673 main.exit()
674 else:
675 main.log.info(response)
676
677 def start_tcpdump(self, filename, intf = "eth0", port = "port 6633"):
678 '''
679 Runs tpdump on an intferface and saves the file
680 intf can be specified, or the default eth0 is used
681 '''
682 try:
683 self.handle.sendline("")
684 self.handle.expect("mininet>")
685 self.handle.sendline("sh sudo tcpdump -n -i "+ intf + " " + port + " -w " + filename.strip() + " &")
686 self.handle.sendline("")
687 self.handle.sendline("")
688 i=self.handle.expect(['No\ssuch\device','listening\son',pexpect.TIMEOUT,"mininet>"],timeout=10)
689 main.log.warn(self.handle.before + self.handle.after)
690 if i == 0:
691 main.log.error(self.name + ": tcpdump - No such device exists. tcpdump attempted on: " + intf)
692 return main.FALSE
693 elif i == 1:
694 main.log.info(self.name + ": tcpdump started on " + intf)
695 return main.TRUE
696 elif i == 2:
697 main.log.error(self.name + ": tcpdump command timed out! Check interface name, given interface was: " + intf)
698 return main.FALSE
699 elif i ==3:
700 main.log.info(self.name +": " + self.handle.before)
701 return main.TRUE
702 else:
703 main.log.error(self.name + ": tcpdump - unexpected response")
704 return main.FALSE
705 except pexpect.EOF:
706 main.log.error(self.name + ": EOF exception found")
707 main.log.error(self.name + ": " + self.handle.before)
708 main.cleanup()
709 main.exit()
710 except:
711 main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
712 main.log.error( traceback.print_exc() )
713 main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
714 main.cleanup()
715 main.exit()
716
717 def stop_tcpdump(self):
718 "pkills tcpdump"
719 try:
720 self.handle.sendline("sh sudo pkill tcpdump")
721 self.handle.sendline("")
722 self.handle.sendline("")
723 self.handle.expect("mininet>")
724 except pexpect.EOF:
725 main.log.error(self.name + ": EOF exception found")
726 main.log.error(self.name + ": " + self.handle.before)
727 main.cleanup()
728 main.exit()
729 except:
730 main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
731 main.log.error( traceback.print_exc() )
732 main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
733 main.cleanup()
734 main.exit()
735
Jon Hall8412ed12014-07-24 16:33:58 -0700736 def compare_topo(self, onos_list, onos_json):
737 '''
738 compares mn topology with ONOS topology
739 onos_list is a list of ONOS controllers, each element of the list should be (handle, name, ip, port)
740 onos_json is the output of the onos get_json function calling the /wm/onos/topology REST API
Jon Halle3a74502014-07-25 11:13:16 -0700741 Returns: True if MN and ONOS topology match and False if the differ.
742 Differences between ONOS and MN topology will be printed to the log.
743
744 Dependency: Requires STS to be installed on the TestON machine. STS can be pulled
745 from https://github.com/ucb-sts/sts.git . Currently the required functions from STS are located in the
746 topology_refactoring2 branch, but may be merged into the master branch soon. You may need to install some
747 python modules such as networkx to use the STS functions.
748
Jon Hall8412ed12014-07-24 16:33:58 -0700749 '''
750 from sts.topology.teston_topology import TestONTopology # assumes that sts already in you PYTHONPATH
Jon Hall0d88a252014-07-25 11:22:40 -0700751 #import sts.entities.base as base
752 import json
Jon Hall8412ed12014-07-24 16:33:58 -0700753 topo = TestONTopology(self, onos_list)
admin2a9548d2014-06-17 14:08:07 -0700754
Jon Hall8412ed12014-07-24 16:33:58 -0700755 link_results = main.TRUE
756 switch_results = main.TRUE
757 port_results = main.TRUE
758
759 ########Switches#######
760 output = {"switches":[]}
Jon Hall0d88a252014-07-25 11:22:40 -0700761 for switch in topo.graph.switches: #iterate through the MN topology and pull out switches and and port info
Jon Hall8412ed12014-07-24 16:33:58 -0700762 ports = []
763 for port in switch.ports.values():
764 ports.append({'of_port': port.port_no, 'mac': port.hw_addr.replace('\'',''), 'name': port.name})
765 output['switches'].append({"name": switch.name, "dpid": switch.dpid, "ports": ports })
766 #print output
767
Jon Hall8412ed12014-07-24 16:33:58 -0700768 #print json.dumps(output, sort_keys=True,indent=4,separators=(',', ': '))
769
770
Jon Hall0d88a252014-07-25 11:22:40 -0700771 # created sorted list of dpid's in MN and ONOS for comparison
Jon Hall8412ed12014-07-24 16:33:58 -0700772 mnDPIDs=[]
773 for switch in output['switches']:
774 mnDPIDs.append(switch['dpid'])
775 mnDPIDs.sort()
776 #print mnDPIDs
Jon Hall0d88a252014-07-25 11:22:40 -0700777 if onos_json == "":#if rest call fails
Jon Hall8412ed12014-07-24 16:33:58 -0700778 main.log.error(self.name + ".compare_topo(): Empty JSON object given from ONOS rest call")
779 return main.FALSE
780 onos=onos_json
781 onosDPIDs=[]
782 for switch in onos['switches']:
783 onosDPIDs.append(switch['dpid'].replace(":",''))
784 onosDPIDs.sort()
785 #print onosDPIDs
786
787 if mnDPIDs!=onosDPIDs:
788 switch_results = main.FALSE
789 main.log.report( "Switches in MN but not in ONOS:")
790 main.log.report( str([switch for switch in mnDPIDs if switch not in onosDPIDs]))
791 main.log.report( "Switches in ONOS but not in MN:")
792 main.log.report( str([switch for switch in onosDPIDs if switch not in mnDPIDs]))
793 else:#list of dpid's match in onos and mn
794 switch_results = main.TRUE
795
796 ################ports#############
797 for switch in output['switches']:
798 mn_ports = []
799 onos_ports = []
800 for port in switch['ports']:
801 mn_ports.append(port['of_port'])
802 for onos_switch in onos['switches']:
803 if onos_switch['dpid'].replace(':','') == switch['dpid']:
804 for port in onos_switch['ports']:
805 onos_ports.append(port['portNumber'])
806 mn_ports.sort()
807 onos_ports.sort()
808 if mn_ports == onos_ports:
809 pass #don't set results to true here as this is just one of many checks and it might override a failure
810 else: #the ports of this switch don't match
811 port_results = main.FALSE
812 main.log.report("ports in MN switch %s(%s) but not in ONOS:" % (switch['name'],switch['dpid']))
813 main.log.report( str([port for port in mn_ports if port not in onos_ports]))
814 main.log.report("ports in ONOS switch %s(%s) but not in MN:" % (switch['name'],switch['dpid']))
815 main.log.report( str([port for port in onos_ports if port not in mn_ports]))
816
817
818 #######Links########
Jon Hall0d88a252014-07-25 11:22:40 -0700819 # iterate through MN links and check if and ONOS link exists in both directions
Jon Hall8412ed12014-07-24 16:33:58 -0700820 for link in topo.patch_panel.network_links:
821 #print "Link: %s" % link
822 #TODO: Find a more efficient search method
823 node1 = None
824 port1 = None
825 node2 = None
826 port2 = None
827 first_dir = main.FALSE
828 second_dir = main.FALSE
829 for switch in output['switches']:
830 if switch['name'] == link.node1.name:
831 node1 = switch['dpid']
832 for port in switch['ports']:
833 if str(port['name']) == str(link.port1):
834 port1 = port['of_port']
835 if node1 is not None and node2 is not None:
836 break
837 if switch['name'] == link.node2.name:
838 node2 = switch['dpid']
839 for port in switch['ports']:
840 if str(port['name']) == str(link.port2):
841 port2 = port['of_port']
842 if node1 is not None and node2 is not None:
843 break
844 # check onos link from node1 to node2
845 for onos_link in onos['links']:
846 if onos_link['src']['dpid'].replace(":",'') == node1 and onos_link['dst']['dpid'].replace(":",'') == node2:
847 if onos_link['src']['portNumber'] == port1 and onos_link['dst']['portNumber'] == port2:
848 first_dir = main.TRUE
849 else:
850 main.log.report('the port numbers do not match for ' +str(link) + ' between ONOS and MN')
851 #print node1, ' to ', node2
852 elif onos_link['src']['dpid'].replace(":",'') == node2 and onos_link['dst']['dpid'].replace(":",'') == node1:
853 if onos_link['src']['portNumber'] == port2 and onos_link['dst']['portNumber'] == port1:
854 second_dir = main.TRUE
855 else:
856 main.log.report('the port numbers do not match for ' +str(link) + ' between ONOS and MN')
857 #print node2, ' to ', node1
858 else:#this is not the link you're looking for
859 pass
860 if not first_dir:
861 main.log.report('ONOS has issues with the link from '+str(link.node1.name) +"(dpid: "+ str(node1)+"):"+str(link.port1)+"(portNumber: "+str(port1)+")"+ ' to ' + str(link.node2.name) +"(dpid: "+ str(node2)+"):"+str(link.port2)+"(portNumber: "+str(port2)+")")
862 if not second_dir:
863 main.log.report('ONOS has issues with the link from '+str(link.node2.name) +"(dpid: "+ str(node2)+"):"+str(link.port2)+"(portNumber: "+str(port2)+")"+ ' to ' + str(link.node1.name) +"(dpid: "+ str(node1)+"):"+str(link.port1)+"(portNumber: "+str(port1)+")")
864 link_results = link_results and first_dir and second_dir
865
866
867 results = switch_results and port_results and link_results
868 '''
869 if not results: #To print out both topologies
870 main.log.error("Topology comparison failed, printing json objects, MN then ONOS")
871 main.log.error(str(json.dumps(output, sort_keys=True,indent=4,separators=(',', ': '))))
872 main.log.error('MN Links:')
873 for link in topo.patch_panel.network_links: main.log.error(str("\tLink: %s" % link))
874 main.log.error(str(json.dumps(onos, sort_keys=True,indent=4,separators=(',', ': '))))
875 '''
876 return results
admin2a9548d2014-06-17 14:08:07 -0700877
878
879
880
adminbae64d82013-08-01 10:50:15 -0700881
882if __name__ != "__main__":
883 import sys
884 sys.modules[__name__] = MininetCliDriver()
admin2a9548d2014-06-17 14:08:07 -0700885