blob: d2761f0f59f18f335f0b5bfaa79b1131221dd60c [file] [log] [blame]
adminbae64d82013-08-01 10:50:15 -07001#!/usr/bin/env python
2'''
James Leec9cacaf2014-04-08 09:17:39 -07003Created on 31-May-2013
adminbae64d82013-08-01 10:50:15 -07004
James Leec9cacaf2014-04-08 09:17:39 -07005@author: Anil Kumar (anilkumar.s@paxterrasolutions.com)
adminbae64d82013-08-01 10:50:15 -07006
James Leec9cacaf2014-04-08 09:17:39 -07007TestON is free software: you can redistribute it and/or modify
8it under the terms of the GNU General Public License as published by
9the Free Software Foundation, either version 2 of the License, or
10(at your option) any later version.
adminbae64d82013-08-01 10:50:15 -070011
James Leec9cacaf2014-04-08 09:17:39 -070012TestON is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
adminbae64d82013-08-01 10:50:15 -070016
James Leec9cacaf2014-04-08 09:17:39 -070017You should have received a copy of the GNU General Public License
18along with TestON. If not, see <http://www.gnu.org/licenses/>.
adminbae64d82013-08-01 10:50:15 -070019
20
James Leec9cacaf2014-04-08 09:17:39 -070021'''
adminbae64d82013-08-01 10:50:15 -070022import time
23import pexpect
24import struct, fcntl, os, sys, signal
adminbae64d82013-08-01 10:50:15 -070025import re
26import json
Jon Hallf89c8552014-04-02 13:14:06 -070027import traceback
admin2a9548d2014-06-17 14:08:07 -070028import urllib2
29from urllib2 import URLError, HTTPError
adminbae64d82013-08-01 10:50:15 -070030sys.path.append("../")
31from drivers.common.clidriver import CLI
32
33class OnosCliDriver(CLI):
34
35 def __init__(self):
36 super(CLI, self).__init__()
37
38 def connect(self,**connectargs):
Jon Halld8dc5772014-04-08 16:26:29 -070039 '''
40 Creates ssh handle for ONOS.
41 '''
Jon Hallf89c8552014-04-02 13:14:06 -070042 try:
43 for key in connectargs:
admine0eeea22014-04-14 10:22:46 -070044 vars(self)[key] = connectargs[key]
Jon Hallf89c8552014-04-02 13:14:06 -070045 self.home = "~/ONOS"
46 for key in self.options:
admine0eeea22014-04-14 10:22:46 -070047 if key == "home":
48 self.home = self.options['home']
49 break
adminbae64d82013-08-01 10:50:15 -070050
Jon Hallf89c8552014-04-02 13:14:06 -070051
52 self.name = self.options['name']
53 self.handle = super(OnosCliDriver,self).connect(user_name = self.user_name, ip_address = self.ip_address,port = self.port, pwd = self.pwd, home = self.home)
adminbae64d82013-08-01 10:50:15 -070054
Jon Hallf89c8552014-04-02 13:14:06 -070055 if self.handle:
Jon Hallf89c8552014-04-02 13:14:06 -070056 return self.handle
57 else :
58 main.log.info("NO ONOS HANDLE")
59 return main.FALSE
Jon Hallae05dc22014-04-16 10:56:28 -070060 except pexpect.EOF:
61 main.log.error(self.name + ": EOF exception found")
62 main.log.error(self.name + ": " + self.handle.before)
63 main.cleanup()
64 main.exit()
Jon Hallf89c8552014-04-02 13:14:06 -070065 except:
66 main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
67 main.log.error( traceback.print_exc() )
68 main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
69 main.cleanup()
70 main.exit()
adminbae64d82013-08-01 10:50:15 -070071
Jon Hallf0a494f2014-06-23 15:37:40 -070072 def start(self, env = ''):
Jon Halld8dc5772014-04-08 16:26:29 -070073 '''
74 Starts ONOS on remote machine.
75 Returns false if any errors were encountered.
76 '''
James Leec9cacaf2014-04-08 09:17:39 -070077 try:
Jon Hallf89c8552014-04-02 13:14:06 -070078 self.handle.sendline("")
Jon Hallae05dc22014-04-16 10:56:28 -070079 self.handle.expect(["\$",pexpect.EOF,pexpect.TIMEOUT])
Jon Hall4a2b0482014-04-18 16:29:26 -070080 self.handle.sendline("cd "+self.home)
Jon Hallf0a494f2014-06-23 15:37:40 -070081 self.handle.sendline(env + "./onos.sh core start")
Jon Hallae05dc22014-04-16 10:56:28 -070082 i=self.handle.expect(["STARTED","FAILED",pexpect.EOF,pexpect.TIMEOUT])
83 response = self.handle.before + str(self.handle.after)
Jon Hallf89c8552014-04-02 13:14:06 -070084 if i==0:
Jon Hallae05dc22014-04-16 10:56:28 -070085 j = self.handle.expect(["\$",pexpect.EOF,pexpect.TIMEOUT], timeout=60)
86 if re.search("Killed",response):
87 main.log.warn(self.name + ": Killed existing process")
88 if j==0:
Jon Hallf89c8552014-04-02 13:14:06 -070089 main.log.info(self.name + ": ONOS Started ")
Jon Hallae05dc22014-04-16 10:56:28 -070090 return main.TRUE
91 elif j==1:
92 main.log.error(self.name + ": EOF exception found")
93 main.log.error(self.name + ": " + self.handle.before)
94 main.cleanup()
95 main.exit()
96 elif j==2:
Jon Hallf89c8552014-04-02 13:14:06 -070097 main.log.info(self.name + ": ONOS NOT Started, stuck while waiting for it to start ")
98 return main.FALSE
Jon Hallae05dc22014-04-16 10:56:28 -070099 else:
100 main.log.warn(self.name +": Unexpected response in start")
101 return main.TRUE
Jon Hallf89c8552014-04-02 13:14:06 -0700102 elif i==1:
Jon Hallae05dc22014-04-16 10:56:28 -0700103 main.log.error(self.name + ": ONOS Failed to start")
adminbae64d82013-08-01 10:50:15 -0700104 return main.FALSE
Jon Hallae05dc22014-04-16 10:56:28 -0700105 elif i==2:
106 main.log.error(self.name + ": EOF exception found")
107 main.log.error(self.name + ": " + self.handle.before)
108 main.cleanup()
109 main.exit()
110 elif i==3:
111 main.log.error(self.name + ": ONOS timedout while starting")
112 return main.FALSE
113 else:
114 main.log.error(self.name + ": ONOS start expect script missed something... ")
adminbae64d82013-08-01 10:50:15 -0700115 return main.FALSE
Jon Hallae05dc22014-04-16 10:56:28 -0700116 except pexpect.EOF:
117 main.log.error(self.name + ": EOF exception found")
118 main.log.error(self.name + ": " + self.handle.before)
119 main.cleanup()
120 main.exit()
Jon Hallf89c8552014-04-02 13:14:06 -0700121 except:
122 main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
123 main.log.error( traceback.print_exc() )
124 main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
125 main.cleanup()
126 main.exit()
Jon Halle80ef8c2014-04-29 15:29:13 -0700127
128 def start_all(self):
129 '''
130 starts ZK, RC, and ONOS
131 '''
132 self.handle.sendline("cd "+self.home)
133 self.handle.sendline("./onos.sh start")
134 self.handle.expect("./onos.sh start")
135 self.handle.expect(["\$",pexpect.TIMEOUT])
136
137
138
adminbae64d82013-08-01 10:50:15 -0700139 def start_rest(self):
Jon Halld8dc5772014-04-08 16:26:29 -0700140 '''
141 Starts the rest server on ONOS.
142 '''
Jon Hallf89c8552014-04-02 13:14:06 -0700143 try:
Jon Hall4a2b0482014-04-18 16:29:26 -0700144 self.handle.sendline("cd "+self.home)
145 response = self.execute(cmd= "./start-rest.sh start",prompt="\$",timeout=10)
Jon Hallf89c8552014-04-02 13:14:06 -0700146 if re.search("admin",response):
147 main.log.info(self.name + ": Rest Server Started Successfully")
148 time.sleep(5)
149 return main.TRUE
150 else :
James Leec9cacaf2014-04-08 09:17:39 -0700151 main.log.warn(self.name + ": Failed to start Rest Server")
152 return main.FALSE
Jon Hallae05dc22014-04-16 10:56:28 -0700153 except pexpect.EOF:
154 main.log.error(self.name + ": EOF exception found")
155 main.log.error(self.name + ": " + self.handle.before)
156 main.cleanup()
157 main.exit()
Jon Hallf89c8552014-04-02 13:14:06 -0700158 except:
159 main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
160 main.log.error( traceback.print_exc() )
161 main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
162 main.cleanup()
163 main.exit()
164
adminbae64d82013-08-01 10:50:15 -0700165 def status(self):
Jon Halld8dc5772014-04-08 16:26:29 -0700166 '''
167 Called onos.sh core status and returns TRUE/FALSE accordingly
168 '''
Jon Hallf89c8552014-04-02 13:14:06 -0700169 try:
170 self.execute(cmd="\n",prompt="\$",timeout=10)
Jon Hall4a2b0482014-04-18 16:29:26 -0700171 self.handle.sendline("cd "+self.home)
172 response = self.execute(cmd="./onos.sh core status ",prompt="\d+\sinstance\sof\sonos\srunning",timeout=10)
Jon Hallf89c8552014-04-02 13:14:06 -0700173 self.execute(cmd="\n",prompt="\$",timeout=10)
174 if re.search("1\sinstance\sof\sonos\srunning",response):
175 return main.TRUE
176 elif re.search("0\sinstance\sof\sonos\srunning",response):
177 return main.FALSE
Jon Hallbb650fe2014-07-14 14:54:48 -0700178 elif re.search("Expected\sPrompt\snot found\s,\sTime Out!!",response):
179 return main.ERROR
Jon Hallf89c8552014-04-02 13:14:06 -0700180 else :
Jon Hallf0a494f2014-06-23 15:37:40 -0700181 main.log.warn(self.name + " WARNING: status recieved unknown response")
182 main.log.warn(response)
Jon Hallf89c8552014-04-02 13:14:06 -0700183 return main.FALSE
Jon Hallae05dc22014-04-16 10:56:28 -0700184 except pexpect.EOF:
185 main.log.error(self.name + ": EOF exception found")
186 main.log.error(self.name + ": " + self.handle.before)
187 main.cleanup()
188 main.exit()
Jon Hallf89c8552014-04-02 13:14:06 -0700189 except:
190 main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
191 main.log.error( traceback.print_exc() )
192 main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
193 main.cleanup()
194 main.exit()
195
adminbae64d82013-08-01 10:50:15 -0700196
197 def isup(self):
Jon Halld8dc5772014-04-08 16:26:29 -0700198 '''
199 A more complete check to see if ONOS is up and running properly.
200 First, it checks if the process is up.
201 Second, it reads the logs for "Exception: Connection refused"
202 Third, it makes sure the logs are actually moving.
203 returns TRUE/FALSE accordingly.
204 '''
Jon Hallf89c8552014-04-02 13:14:06 -0700205 try:
206 self.execute(cmd="\n",prompt="\$",timeout=10)
Jon Hall4a2b0482014-04-18 16:29:26 -0700207 self.handle.sendline("cd "+self.home)
208 response = self.execute(cmd= "./onos.sh core status ",prompt="running",timeout=10)
Jon Hallf89c8552014-04-02 13:14:06 -0700209 self.execute(cmd="\n",prompt="\$",timeout=10)
210 tail1 = self.execute(cmd="tail " + self.home + "/onos-logs/onos.*.log",prompt="\$",timeout=10)
admine8c47d02014-06-03 11:59:16 -0700211 time.sleep(10)
Jon Hallf89c8552014-04-02 13:14:06 -0700212 self.execute(cmd="\n",prompt="\$",timeout=10)
213 tail2 = self.execute(cmd="tail " + self.home + "/onos-logs/onos.*.log",prompt="\$",timeout=10)
214 pattern = '(.*)1 instance(.*)'
215 pattern2 = '(.*)Exception: Connection refused(.*)'
216 # if utilities.assert_matches(expect=pattern,actual=response,onpass="ONOS process is running...",onfail="ONOS process not running..."):
admin2a9548d2014-06-17 14:08:07 -0700217 running = self.execute(cmd="cat "+self.home+"/onos-logs/onos.*.log | grep 'Sending LLDP out on all ports'",prompt="\$",timeout=10)
Jon Hallf89c8552014-04-02 13:14:06 -0700218 if re.search(pattern, response):
admin2a9548d2014-06-17 14:08:07 -0700219 if running != "":
Jon Halle80ef8c2014-04-29 15:29:13 -0700220 main.log.info(self.name + ": ONOS process is running...")
221 if tail1 == tail2:
222 main.log.error(self.name + ": ONOS is frozen...")#logs aren't moving
223 return main.FALSE
224 elif re.search( pattern2,tail1 ):
225 main.log.info(self.name + ": Connection Refused found in onos log")
226 return main.FALSE
227 elif re.search( pattern2,tail2 ):
228 main.log.info(self.name + ": Connection Refused found in onos log")
229 return main.FALSE
230 else:
231 main.log.info(self.name + ": Onos log is moving! It's looking good!")
232 return main.TRUE
Jon Hall55c79662014-05-19 15:03:40 -0700233 else:
234 main.log.info(self.name + ": ONOS not yet sending out LLDP messages")
235 return main.FALSE
adminbae64d82013-08-01 10:50:15 -0700236 else:
Jon Hallf89c8552014-04-02 13:14:06 -0700237 main.log.error(self.name + ": ONOS process not running...")
238 return main.FALSE
Jon Hallae05dc22014-04-16 10:56:28 -0700239 except pexpect.EOF:
240 main.log.error(self.name + ": EOF exception found")
241 main.log.error(self.name + ": " + self.handle.before)
242 main.cleanup()
243 main.exit()
Jon Hallf89c8552014-04-02 13:14:06 -0700244 except:
245 main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
246 main.log.error( traceback.print_exc() )
247 main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
248 main.cleanup()
249 main.exit()
adminbae64d82013-08-01 10:50:15 -0700250
Jon Hallf89c8552014-04-02 13:14:06 -0700251
252
James Leec9cacaf2014-04-08 09:17:39 -0700253 def rest_status(self):
Jon Halld8dc5772014-04-08 16:26:29 -0700254 '''
255 Checks if the rest server is running.
256 '''
Jon Hallf89c8552014-04-02 13:14:06 -0700257 try:
258 response = self.execute(cmd= self.home + "/start-rest.sh status ",prompt="running",timeout=10)
259 if re.search("rest\sserver\sis\srunning",response):
260 main.log.info(self.name + ": Rest Server is running")
Jon Hallae05dc22014-04-16 10:56:28 -0700261 return main.TRUE
Jon Hallf89c8552014-04-02 13:14:06 -0700262 elif re.search("rest\sserver\sis\snot\srunning",response):
263 main.log.warn(self.name + ": Rest Server is not Running")
Jon Hallae05dc22014-04-16 10:56:28 -0700264 return main.FALSE
Jon Hallf89c8552014-04-02 13:14:06 -0700265 else :
266 main.log.error(self.name + ": No response" +response)
Jon Hallae05dc22014-04-16 10:56:28 -0700267 return main.FALSE
268 except pexpect.EOF:
269 main.log.error(self.name + ": EOF exception found")
270 main.log.error(self.name + ": " + self.handle.before)
271 main.cleanup()
272 main.exit()
Jon Hallf89c8552014-04-02 13:14:06 -0700273 except:
274 main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
275 main.log.error( traceback.print_exc() )
276 main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
277 main.cleanup()
278 main.exit()
admine8c47d02014-06-03 11:59:16 -0700279
280 def stop_all(self):
281 '''
282 Runs ./onos.sh stop
283 '''
284 try:
285 self.handle.sendline("")
286 self.handle.expect(["\$",pexpect.EOF,pexpect.TIMEOUT])
287 self.handle.sendline("cd "+self.home)
288 self.handle.sendline("./onos.sh stop")
289 i=self.handle.expect(["Stop",pexpect.EOF,pexpect.TIMEOUT])
290 self.handle.expect(["\$",pexpect.EOF,pexpect.TIMEOUT], 60)
291 result = self.handle.before
292 if re.search("Killed", result):
293 main.log.info(self.name + ": ONOS Killed Successfully")
294 return main.TRUE
295 else :
296 main.log.warn(self.name + ": ONOS wasn't running")
297 return main.FALSE
298 except pexpect.EOF:
299 main.log.error(self.name + ": EOF exception found")
300 main.log.error(self.name + ": " + self.handle.before)
301 main.cleanup()
302 main.exit()
303 except:
304 main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
305 main.log.error( traceback.print_exc() )
306 main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
307 main.cleanup()
308 main.exit()
Jon Hallf89c8552014-04-02 13:14:06 -0700309
310
adminbae64d82013-08-01 10:50:15 -0700311 def stop(self):
Jon Halld8dc5772014-04-08 16:26:29 -0700312 '''
313 Runs ./onos.sh core stop to stop ONOS
314 '''
Jon Hallf89c8552014-04-02 13:14:06 -0700315 try:
316 self.handle.sendline("")
Jon Hallae05dc22014-04-16 10:56:28 -0700317 self.handle.expect(["\$",pexpect.EOF,pexpect.TIMEOUT])
Jon Hall4a2b0482014-04-18 16:29:26 -0700318 self.handle.sendline("cd "+self.home)
319 self.handle.sendline("./onos.sh core stop")
Jon Hallae05dc22014-04-16 10:56:28 -0700320 i=self.handle.expect(["Stop",pexpect.EOF,pexpect.TIMEOUT])
321 self.handle.expect(["\$",pexpect.EOF,pexpect.TIMEOUT], 60)
James Leec9cacaf2014-04-08 09:17:39 -0700322 result = self.handle.before
Jon Hallf89c8552014-04-02 13:14:06 -0700323 if re.search("Killed", result):
324 main.log.info(self.name + ": ONOS Killed Successfully")
325 return main.TRUE
326 else :
327 main.log.warn(self.name + ": ONOS wasn't running")
328 return main.FALSE
Jon Hallae05dc22014-04-16 10:56:28 -0700329 except pexpect.EOF:
330 main.log.error(self.name + ": EOF exception found")
331 main.log.error(self.name + ": " + self.handle.before)
332 main.cleanup()
333 main.exit()
Jon Hallf89c8552014-04-02 13:14:06 -0700334 except:
335 main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
336 main.log.error( traceback.print_exc() )
337 main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
338 main.cleanup()
339 main.exit()
admin6903e462014-07-22 15:30:54 -0700340#**********************************************************************************************
341#**********************************************************************************************
342# The purpose of comp_intents is to find if the high level intents have changed. preIntents
343# and postIntents should be the output of curl of the intents. preIntents being the original
344# and postIntents being the later. We are looking at the intents with the same id from both
345# and comparing the dst and src DPIDs and macs, and the state. If any of these are changed
346# we print that there are changes, then return a list of the intents that have changes`
347#**********************************************************************************************
348#**********************************************************************************************
349 def comp_intents(self,preIntents,postIntents):
350 import json
351 preDecoded = json.loads(preIntents)
352 postDecoded = json.loads(postIntents)
353 changes = []
354 if not preDecoded:
355 if postDecoded:
356 print "THERE ARE CHANGES TO THE HIGH LEVEL INTENTS!!!!"
357 return postDecoded
358 for k in preDecoded:
359 for l in postDecoded:
360 if l['id']==k['id']:
361 if k['dstSwitchDpid']==l['dstSwitchDpid'] and k['srcMac']==l['srcMac'] and k['dstMac']==l['dstMac'] and k['srcSwitchDpid']==l['srcSwitchDpid'] and k['state']==l['state']:
362 postDecoded.remove(l)
363 else:
364 changes.append(k)
365 print ("THERE ARE CHANGES TO THE HIGH LEVEL INTENTS!!!")
366 return changes
Jon Hallf89c8552014-04-02 13:14:06 -0700367
admin6903e462014-07-22 15:30:54 -0700368#**********************************************************************************************
369#**********************************************************************************************
370# the purpose of comp_low is to find if the low level intents have changed. The main idea
371# is to determine if the path has changed. Again, like with the comp_intents function, the
372# pre and post Intents variables are the json dumps of wm/onos/intent/low. The variables
373# that will be compared are the state, and the path.
374#**********************************************************************************************
375#**********************************************************************************************
376 def comp_low(self, preIntents,postIntents):
377 import json
378 preDecoded = json.loads(preIntents)
379 postDecoded = json.loads(postIntents)
380 changes = []
381 if not preDecoded:
382 if postDecoded:
383 print "THERE ARE CHANGES TO THE LOW LEVEL INTENTS!!!"
384 return postDecoded
385 for k in preDecoded:
386 for l in postDecoded:
387 if l['id']==k['id']:
388 if l['path']!=k['path']:
389 changes.append(l)
390 print "\n\n\n\nTHERE ARE CHANGES TO THE LOW LEVEL INTENTS!!!"
391 else:
392 if k['state']!=l['state']:
393 changes.append(l)
394 print "\n\n\n\nTHERE ARE CHANGES TO THE LOW LEVEL INTENTS!!!"
395 else:
396 print "NO CHANGES SO FAR\n\n\n"
397
398
399 return changes
400
401
adminbae64d82013-08-01 10:50:15 -0700402 def rest_stop(self):
Jon Halld8dc5772014-04-08 16:26:29 -0700403 '''
404 Runs ./start-rest.sh stop to stop ONOS rest server
405 '''
Jon Hallf89c8552014-04-02 13:14:06 -0700406 try:
407 response = self.execute(cmd= self.home + "/start-rest.sh stop ",prompt="killing",timeout=10)
408 self.execute(cmd="\n",prompt="\$",timeout=10)
409 if re.search("killing", response):
410 main.log.info(self.name + ": Rest Server Stopped")
411 return main.TRUE
412 else :
413 main.log.error(self.name + ": Failed to Stop, Rest Server is not Running")
414 return main.FALSE
Jon Hallae05dc22014-04-16 10:56:28 -0700415 except pexpect.EOF:
416 main.log.error(self.name + ": EOF exception found")
417 main.log.error(self.name + ": " + self.handle.before)
418 main.cleanup()
419 main.exit()
Jon Hallf89c8552014-04-02 13:14:06 -0700420 except:
421 main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
422 main.log.error( traceback.print_exc() )
423 main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
424 main.cleanup()
425 main.exit()
426
427
adminbae64d82013-08-01 10:50:15 -0700428 def disconnect(self):
Jon Halld8dc5772014-04-08 16:26:29 -0700429 '''
430 Called when Test is complete to disconnect the ONOS handle.
431 '''
adminaeedddd2013-08-02 15:14:15 -0700432 response = ''
433 try:
adminbae64d82013-08-01 10:50:15 -0700434 self.handle.sendline("exit")
adminaeedddd2013-08-02 15:14:15 -0700435 self.handle.expect("closed")
Jon Hallae05dc22014-04-16 10:56:28 -0700436 except pexpect.EOF:
437 main.log.error(self.name + ": EOF exception found")
438 main.log.error(self.name + ": " + self.handle.before)
James Leec9cacaf2014-04-08 09:17:39 -0700439 except:
Jon Hallf89c8552014-04-02 13:14:06 -0700440 main.log.error(self.name + ": Connection failed to the host")
adminbae64d82013-08-01 10:50:15 -0700441 response = main.FALSE
adminaeedddd2013-08-02 15:14:15 -0700442 return response
443
Jon Hall76f2c462014-04-17 11:37:15 -0700444 def print_version(self):
Jon Halld8dc5772014-04-08 16:26:29 -0700445 '''
446 Writes the COMMIT number to the report to be parsed by Jenkins data collecter.
447 '''
Jon Hallf89c8552014-04-02 13:14:06 -0700448 try:
449 self.handle.sendline("export TERM=xterm-256color")
450 self.handle.expect("xterm-256color")
James Leec9cacaf2014-04-08 09:17:39 -0700451 self.handle.expect("\$")
Jon Hall09944cd2014-06-25 11:28:43 -0700452 self.handle.sendline("cd " + self.home + "; git log -1 --pretty=fuller | grep -A 5 \"commit\" --color=never; cd \.\.")
Jon Hallf89c8552014-04-02 13:14:06 -0700453 self.handle.expect("cd ..")
454 self.handle.expect("\$")
admine0eeea22014-04-14 10:22:46 -0700455 response=(self.name +": \n"+ str(self.handle.before + self.handle.after))
456 main.log.report(response)
Jon Hall76f2c462014-04-17 11:37:15 -0700457 except pexpect.EOF:
458 main.log.error(self.name + ": EOF exception found")
459 main.log.error(self.name + ": " + self.handle.before)
460 main.cleanup()
461 main.exit()
462 except:
463 main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
464 main.log.error( traceback.print_exc() )
465 main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
466 main.cleanup()
467 def get_version(self):
468 '''
469 Writes the COMMIT number to the report to be parsed by Jenkins data collecter.
470 '''
471 try:
472 self.handle.sendline("export TERM=xterm-256color")
473 self.handle.expect("xterm-256color")
474 self.handle.expect("\$")
Jon Hall09944cd2014-06-25 11:28:43 -0700475 self.handle.sendline("cd " + self.home + "; git log -1 --pretty=fuller | grep -A 5 \"commit\" --color=never; cd \.\.")
Jon Hall76f2c462014-04-17 11:37:15 -0700476 self.handle.expect("cd ..")
477 self.handle.expect("\$")
478 response=(self.name +": \n"+ str(self.handle.before + self.handle.after))
admine0eeea22014-04-14 10:22:46 -0700479 lines=response.splitlines()
480 for line in lines:
481 print line
482 return lines[2]
Jon Hallae05dc22014-04-16 10:56:28 -0700483 except pexpect.EOF:
484 main.log.error(self.name + ": EOF exception found")
485 main.log.error(self.name + ": " + self.handle.before)
486 main.cleanup()
487 main.exit()
Jon Hallf89c8552014-04-02 13:14:06 -0700488 except:
489 main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
490 main.log.error( traceback.print_exc() )
491 main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
492 main.cleanup()
493 main.exit()
adminbae64d82013-08-01 10:50:15 -0700494
admin2a9548d2014-06-17 14:08:07 -0700495
admindc1c5072014-06-24 15:57:19 -0700496
497#*********************************************************************
498#*********************************************************************
499# shortest_path is a command to find the shortest path between two
500# switches. It is called using the IP, port, and source and
501# destination dpids
502#*********************************************************************
503#*********************************************************************
504
505 def shortest_path(self,ONOSIP,ONOSPort,srcDPID,dstDPID):
506 main.log.report("Finding the shortest Path between "+str(srcDPID) + " to " + str(dstDPID))
507 url = "http://%s:%s/wm/onos/intent/path/switch/%s/shortest-path/%s"%(ONOSIP,ONOSPort,srcDPID,dstDPID)
508 parsed_result = []
509 try:
510 response = urllib2.urlopen(url)
511 result = response.read()
512 response.close()
513 if len(result) != 0:
514 parsed_result = json.loads(result)
515 except HTTPError as exc:
516 print "ERROR:"
517 print " REST GET URL: %s" % url
518 # NOTE: exc.fp contains the object with the response payload
519 error_payload = json.loads(exc.fp.read())
520 print " REST Error Code: %s" % (error_payload['code'])
521 print " REST Error Summary: %s" % (error_payload['summary'])
522 print " REST Error Description: %s" % (error_payload['formattedDescription'])
523 print " HTTP Error Code: %s" % exc.code
524 print " HTTP Error Reason: %s" % exc.reason
525 except URLError as exc:
526 print "ERROR:"
527 print " REST GET URL: %s" % url
528 print " URL Error Reason: %s" % exc.reason
529
530 if len(parsed_result)==0:
531 return
532 result = json.dumps(parsed_result,indent=4)
533 print(str(result))
534 return result
535
536
537#*********************************************************************
538#*********************************************************************
539# show_intent is a command to show intents.
540# Parameters include intentIP, intentPort, intentURL, and intent_id
541# Based on the url, it will show either high or low intents
542# If intent_id is left blank, it will show all high or all low intents
543# Else it will show the intent with the id
544#*********************************************************************
545#*********************************************************************
546
547
548
549 def show_intent(self,intentIP,intentPort=8080,intentURL="wm/onos/intent",intent_type="high",intent_id="all"):
550 main.log.report("Getting (an) intent(s)")
551 if intent_id=="all":
552 url = "http://%s:%s/%s/%s"%(intentIP,intentPort,intentURL,intent_type)
553 else:
554 url = "http://%s:%s/%s/%s/%s"%(intentIP,intentPort,intentURL,intent_type,intent_id)
555 print(url)
556 parsed_result = []
557 try:
558 response = urllib2.urlopen(url)
559 result = response.read()
560 response.close()
561 if len(result) != 0:
562 parsed_result = json.loads(result)
563 except HTTPError as exc:
564 print "ERROR:"
565 print " REST GET URL: %s" % url
566 # NOTE: exc.fp contains the object with the response payload
567 error_payload = json.loads(exc.fp.read())
568 print " REST Error Code: %s" % (error_payload['code'])
569 print " REST Error Summary: %s" % (error_payload['summary'])
570 print " REST Error Description: %s" % (error_payload['formattedDescription'])
571 print " HTTP Error Code: %s" % exc.code
572 print " HTTP Error Reason: %s" % exc.reason
573 return str(error_payload['code'])
574 except URLError as exc:
575 print "ERROR:"
576 print " REST GET URL: %s" % url
577 print " URL Error Reason: %s" % exc.reason
578 return str(error_payload['code'])
579
580 if len(parsed_result)==0:
581 return
582 result = json.dumps(parsed_result,indent=4)
583 print(str(result))
584 return result
585
586
587#*********************************************************************
588#*********************************************************************
589# del_intent is to delete either all or some or one intents
590# if intent_id is left blank, it will delete all intents
591# else, intent_id should be of the form "intent_id=1,2,3"
592#*********************************************************************
593#*********************************************************************
594
595 def del_intent(self,intentIP,intentPort=8080,intentURL="wm/onos/intent",intent_id="all"):
596 main.log.report("Deleting (an) intent(s)")
597 if intent_id=="all":
598 url = "http://%s:%s/%s/high"%(intentIP,intentPort,intentURL)
599 else:
600 url = "http://%s:%s/%s/high?%s"%(intentIP,intentPort,intentURL,intent_id)
601
602 print(url)
603
604 parsed_result = []
605 try:
606 request = urllib2.Request(url)
607 request.get_method = lambda: 'DELETE'
608 response = urllib2.urlopen(request)
609 result = response.read()
610 response.close()
611 if len(result) != 0:
612 parsed_result = json.loads(result)
613 print(parsed_result)
614 except HTTPError as exc:
615 print "ERROR:"
616 print " REST DELETE URL: %s" % url
617 # NOTE: exc.fp contains the object with the response payload
618 error_payload = json.loads(exc.fp.read())
619 print " REST Error Code: %s" % (error_payload['code'])
620 print " REST Error Summary: %s" % (error_payload['summary'])
621 print " REST Error Description: %s" % (error_payload['formattedDescription'])
622 print " HTTP Error Code: %s" % exc.code
623 print " HTTP Error Reason: %s" % exc.reason
624 except URLError as exc:
625 print "ERROR:"
626 print " REST DELETE URL: %s" % url
627 print " URL Error Reason: %s" % exc.reason
628 return result
629
630#*********************************************************************
631#*********************************************************************
632# add_intent will add a single intent by using dpids and macs.
633#*********************************************************************
634#*********************************************************************
635
636
637 def add_intent(self, intent_id,src_dpid,dst_dpid,src_mac,dst_mac,intentIP,intentPort=8080,intentURL="wm/onos/intent" , intent_type = 'SHORTEST_PATH', static_path=False, src_port=1,dst_port=1):
admin2a9548d2014-06-17 14:08:07 -0700638 "CLI command callback: set intent"
639
640 intents = []
641 oper = {}
642 # Create the POST payload
643 oper['intentId'] = intent_id
644 oper['intentType'] = intent_type # XXX: Hardcoded
645 oper['staticPath'] = static_path # XXX: Hardcoded
646 oper['srcSwitchDpid'] = src_dpid
647 oper['srcSwitchPort'] = src_port
648 oper['dstSwitchDpid'] = dst_dpid
649 oper['dstSwitchPort'] = dst_port
650 oper['matchSrcMac'] = src_mac
651 oper['matchDstMac'] = dst_mac
652 intents.append(oper)
admindc1c5072014-06-24 15:57:19 -0700653 url = "http://%s:%s/%s/high"%(intentIP,intentPort,intentURL)
admin2a9548d2014-06-17 14:08:07 -0700654 parsed_result = []
655 data_json = json.dumps(intents)
656 try:
657 request = urllib2.Request(url,data_json)
658 request.add_header("Content-Type", "application/json")
659 response=urllib2.urlopen(request)
660 result = response.read()
661 response.close()
662 if len(result) != 0:
663 parsed_result = json.loads(result)
664 except HTTPError as exc:
665 print "ERROR:"
666 print " REST GET URL: %s" % url
667 # NOTE: exc.fp contains the object with the response payload
668 error_payload = json.loads(exc.fp.read())
669 print " REST Error Code: %s" % (error_payload['code'])
670 print " REST Error Summary: %s" % (error_payload['summary'])
671 print " REST Error Description: %s" % (error_payload['formattedDescription'])
672 print " HTTP Error Code: %s" % exc.code
673 print " HTTP Error Reason: %s" % exc.reason
674 except URLError as exc:
675 print "ERROR:"
676 print " REST GET URL: %s" % url
677 print " URL Error Reason: %s" % exc.reason
admindc1c5072014-06-24 15:57:19 -0700678 return result
admin2a9548d2014-06-17 14:08:07 -0700679
680
681
682
683 def add_intents(self):
684 main.log.info("Sending new intents to ONOS")
adminc6cfc1c2014-04-21 13:55:21 -0700685 self.handle.sendline("cd "+self.home+ "/scripts")
686 self.handle.expect("scripts")
admin2a9548d2014-06-17 14:08:07 -0700687 main.log.info("Adding intents")
adminc6cfc1c2014-04-21 13:55:21 -0700688 self.handle.sendline("./pyintents.py")
Jon Hall9c6e2c02014-05-02 10:18:53 -0700689 self.handle.expect(["$",pexpect.EOF,pexpect.TIMEOUT])
690 response = self.handle.before
adminc6cfc1c2014-04-21 13:55:21 -0700691 self.handle.sendline("cd "+self.home)
692 return main.TRUE
693
admin2a9548d2014-06-17 14:08:07 -0700694 def rm_intents(self):
695 main.log.info("Deleteing Intents from ONOS")
adminc6cfc1c2014-04-21 13:55:21 -0700696 self.handle.sendline("cd "+self.home+ "/scripts")
697 self.handle.expect("scripts")
admin2a9548d2014-06-17 14:08:07 -0700698 main.log.info("Deleting Intnents")
adminc6cfc1c2014-04-21 13:55:21 -0700699 self.handle.sendline("./rmpyintents.py")
Jon Hall9c6e2c02014-05-02 10:18:53 -0700700 self.handle.expect(["$",pexpect.EOF,pexpect.TIMEOUT])
701 response = self.handle.before
adminc6cfc1c2014-04-21 13:55:21 -0700702 self.handle.sendline("cd "+self.home)
703 return main.TRUE
704
admin2a9548d2014-06-17 14:08:07 -0700705 def purge_intents(self):
Jon Hall265149f2014-04-25 13:39:52 -0700706 main.log.info("Purging dead intents")
707 self.handle.sendline("cd "+self.home+ "/scripts")
708 self.handle.expect("scripts")
admin2a9548d2014-06-17 14:08:07 -0700709 main.log.info("Sending Purge Intent Rest call to ONOS")
Jon Hall265149f2014-04-25 13:39:52 -0700710 self.handle.sendline("./purgeintents.py")
711 self.handle.sendline("cd "+self.home)
712 return main.TRUE
adminc6cfc1c2014-04-21 13:55:21 -0700713
714
715
Jon Hall4a2b0482014-04-18 16:29:26 -0700716 def add_flow(self, testONip, user = "admin", password = "", flowDef = "/flowdef.txt"):
Jon Halld8dc5772014-04-08 16:26:29 -0700717 '''
718 Copies the flowdef file from TestStation -> ONOS machine
719 Then runs ./add_flow.py to add the flows to ONOS
720 '''
Jon Hallf89c8552014-04-02 13:14:06 -0700721 try:
722 main.log.info("Adding Flows...")
723 self.handle.sendline("scp %s@%s:%s /tmp/flowtmp" %(user,testONip,flowDef))
724 i=self.handle.expect(['[pP]assword:', '100%', pexpect.TIMEOUT],30)
725 if(i==0):
726 self.handle.sendline("%s" %(password))
727 self.handle.sendline("")
728 self.handle.expect("100%")
729 self.handle.expect("\$", 30)
730 self.handle.sendline(self.home + "/web/add_flow.py -m onos -f /tmp/flowtmp")
731 self.handle.expect("\$", 1000)
732 main.log.info("Flows added")
733 return main.TRUE
734
735 elif(i==1):
736 self.handle.sendline("")
737 self.handle.expect("\$", 10)
738 self.handle.sendline( self.home + "/web/add_flow.py -m onos -f /tmp/flowtmp")
739 self.handle.expect("\$", 1000)
740 main.log.info("Flows added")
741 return main.TRUE
742
743 elif(i==2):
744 main.log.error("Flow Def file SCP Timed out...")
745 return main.FALSE
746
747 else:
748 main.log.error("Failed to add flows...")
James Leec9cacaf2014-04-08 09:17:39 -0700749 return main.FALSE
Jon Hallae05dc22014-04-16 10:56:28 -0700750 except pexpect.EOF:
751 main.log.error(self.name + ": EOF exception found")
752 main.log.error(self.name + ": " + self.handle.before)
753 main.cleanup()
754 main.exit()
Jon Hallf89c8552014-04-02 13:14:06 -0700755 except:
756 main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
757 main.log.error( traceback.print_exc() )
758 main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
759 main.cleanup()
760 main.exit()
761
adminbae64d82013-08-01 10:50:15 -0700762
763 def delete_flow(self, *delParams):
Jon Halld8dc5772014-04-08 16:26:29 -0700764 '''
765 Deletes a specific flow, a range of flows, or all flows.
766 '''
Jon Hallf89c8552014-04-02 13:14:06 -0700767 try:
768 if len(delParams)==1:
769 if str(delParams[0])=="all":
770 main.log.info(self.name + ": Deleting ALL flows...")
771 #self.execute(cmd="~/ONOS/scripts/TestON_delete_flow.sh all",prompt="done",timeout=150)
772 self.handle.sendline(self.home + "/web/delete_flow.py all")
773 self.handle.expect("delete_flow")
774 self.handle.expect("\$",1000)
775 main.log.info(self.name + ": Flows deleted")
776 else:
777 main.log.info(self.name + ": Deleting flow "+str(delParams[0])+"...")
778 #self.execute(cmd="~/ONOS/scripts/TestON_delete_flow.sh "+str(delParams[0]),prompt="done",timeout=150)
779 #self.execute(cmd="\n",prompt="\$",timeout=60)
780 self.handle.sendline(self.home +"/web/delete_flow.py %d" % int(delParams[0]))
781 self.handle.expect("delete_flow")
782 self.handle.expect("\$",60)
783 main.log.info(self.name + ": Flow deleted")
784 elif len(delParams)==2:
785 main.log.info(self.name + ": Deleting flows "+str(delParams[0])+" through "+str(delParams[1])+"...")
786 #self.execute(cmd="~/ONOS/scripts/TestON_delete_flow.sh "+str(delParams[0])+" "+str(delParams[1]),prompt="done",timeout=150)
787 #self.execute(cmd="\n",prompt="\$",timeout=60)
788 self.handle.sendline(self.home + "/web/delete_flow.py %d %d" % (int(delParams[0]), int(delParams[1])))
789 self.handle.expect("delete_flow")
790 self.handle.expect("\$",600)
791 main.log.info(self.name + ": Flows deleted")
Jon Hallae05dc22014-04-16 10:56:28 -0700792 except pexpect.EOF:
793 main.log.error(self.name + ": EOF exception found")
794 main.log.error(self.name + ": " + self.handle.before)
795 main.cleanup()
796 main.exit()
Jon Hallf89c8552014-04-02 13:14:06 -0700797 except:
798 main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
799 main.log.error( traceback.print_exc() )
800 main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
801 main.cleanup()
802 main.exit()
adminbae64d82013-08-01 10:50:15 -0700803
804 def check_flow(self):
Jon Halld8dc5772014-04-08 16:26:29 -0700805 '''
806 Calls the ./get_flow.py all and checks:
807 - If each FlowPath has at least one FlowEntry
808 - That there are no "NOT"s found
809 returns TRUE/FALSE
810 '''
Jon Hallf89c8552014-04-02 13:14:06 -0700811 try:
812 flowEntryDetect = 1
813 count = 0
814 self.handle.sendline("clear")
815 time.sleep(1)
816 self.handle.sendline(self.home + "/web/get_flow.py all")
817 self.handle.expect("get_flow")
Jon Hall3bd7c792014-05-30 09:05:21 -0700818 for x in range(15):
Jon Hallf89c8552014-04-02 13:14:06 -0700819 i=self.handle.expect(['FlowPath','FlowEntry','NOT','\$',pexpect.TIMEOUT],timeout=180)
820 if i==0:
821 count = count + 1
822 if flowEntryDetect == 0:
823 main.log.info(self.name + ": FlowPath without FlowEntry")
824 return main.FALSE
825 else:
826 flowEntryDetect = 0
827 elif i==1:
828 flowEntryDetect = 1
829 elif i==2:
830 main.log.error(self.name + ": Found a NOT")
adminbae64d82013-08-01 10:50:15 -0700831 return main.FALSE
Jon Hallf89c8552014-04-02 13:14:06 -0700832 elif i==3:
833 if count == 0:
834 main.log.info(self.name + ": There don't seem to be any flows here...")
835 return main.FALSE
836 else:
837 main.log.info(self.name + ": All flows pass")
838 main.log.info(self.name + ": Number of FlowPaths: "+str(count))
839 return main.TRUE
840 elif i==4:
James Leec9cacaf2014-04-08 09:17:39 -0700841 main.log.error(self.name + ":Check_flow() - Command Timeout!")
Jon Hallf89c8552014-04-02 13:14:06 -0700842 return main.FALSE
Jon Hallae05dc22014-04-16 10:56:28 -0700843 except pexpect.EOF:
844 main.log.error(self.name + ": EOF exception found")
845 main.log.error(self.name + ": " + self.handle.before)
846 main.cleanup()
847 main.exit()
Jon Hallf89c8552014-04-02 13:14:06 -0700848 except:
849 main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
850 main.log.error( traceback.print_exc() )
851 main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
852 main.cleanup()
853 main.exit()
adminbae64d82013-08-01 10:50:15 -0700854
855 def get_flow(self, *flowParams):
Jon Halld8dc5772014-04-08 16:26:29 -0700856 '''
857 Returns verbose output of ./get_flow.py
858 '''
859 try:
860 if len(flowParams)==1:
861 if str(flowParams[0])=="all":
862 self.execute(cmd="\n",prompt="\$",timeout=60)
863 main.log.info(self.name + ": Getting all flow data...")
864 data = self.execute(cmd=self.home + "/scripts/TestON_get_flow.sh all",prompt="done",timeout=150)
865 self.execute(cmd="\n",prompt="\$",timeout=60)
866 return data
867 else:
868 main.log.info(self.name + ": Retrieving flow "+str(flowParams[0])+" data...")
869 data = self.execute(cmd=self.home +"/scripts/TestON_get_flow.sh "+str(flowParams[0]),prompt="done",timeout=150)
870 self.execute(cmd="\n",prompt="\$",timeout=60)
871 return data
872 elif len(flowParams)==5:
873 main.log.info(self.name + ": Retrieving flow installer data...")
874 data = self.execute(cmd=self.home + "/scripts/TestON_get_flow.sh "+str(flowParams[0])+" "+str(flowParams[1])+" "+str(flowParams[2])+" "+str(flowParams[3])+" "+str(flowParams[4]),prompt="done",timeout=150)
875 self.execute(cmd="\n",prompt="\$",timeout=60)
876 return data
877 elif len(flowParams)==4:
878 main.log.info(self.name + ": Retrieving flow endpoints...")
879 data = self.execute(cmd=self.home + "/scripts/TestON_get_flow.sh "+str(flowParams[0])+" "+str(flowParams[1])+" "+str(flowParams[2])+" "+str(flowParams[3]),prompt="done",timeout=150)
880 self.execute(cmd="\n",prompt="\$",timeout=60)
881 return data
Jon Hallae05dc22014-04-16 10:56:28 -0700882 except pexpect.EOF:
883 main.log.error(self.name + ": EOF exception found")
884 main.log.error(self.name + ": " + self.handle.before)
885 main.cleanup()
886 main.exit()
Jon Halld8dc5772014-04-08 16:26:29 -0700887 except:
Jon Hallf89c8552014-04-02 13:14:06 -0700888 main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
889 main.log.error( traceback.print_exc() )
890 main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
891 main.cleanup()
892 main.exit()
adminbae64d82013-08-01 10:50:15 -0700893
894
Jon Hall2f42a672014-05-28 10:13:18 -0700895# http://localhost:8080/wm/onos/topology/switches
896# http://localhost:8080/wm/onos/topology/links
Jon Hall8060af02014-04-14 14:17:58 -0700897# http://localhost:8080/wm/onos/registry/controllers/json
898# http://localhost:8080/wm/onos/registry/switches/json"
adminbae64d82013-08-01 10:50:15 -0700899
900 def get_json(self, url):
Jon Halld8dc5772014-04-08 16:26:29 -0700901 '''
902 Helper functions used to parse the json output of a rest call
903 '''
adminbae64d82013-08-01 10:50:15 -0700904 try:
Jon Hallf89c8552014-04-02 13:14:06 -0700905 try:
906 command = "curl -s %s" % (url)
907 result = os.popen(command).read()
908 parsedResult = json.loads(result)
909 except:
910 print "REST IF %s has issue" % command
911 parsedResult = ""
912
913 if type(parsedResult) == 'dict' and parsedResult.has_key('code'):
914 print "REST %s returned code %s" % (command, parsedResult['code'])
915 parsedResult = ""
James Leec9cacaf2014-04-08 09:17:39 -0700916 return parsedResult
Jon Hallae05dc22014-04-16 10:56:28 -0700917 except pexpect.EOF:
918 main.log.error(self.name + ": EOF exception found")
919 main.log.error(self.name + ": " + self.handle.before)
920 main.cleanup()
921 main.exit()
adminbae64d82013-08-01 10:50:15 -0700922 except:
Jon Hallf89c8552014-04-02 13:14:06 -0700923 main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
924 main.log.error( traceback.print_exc() )
925 main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
926 main.cleanup()
927 main.exit()
adminbae64d82013-08-01 10:50:15 -0700928
Jon Hallf89c8552014-04-02 13:14:06 -0700929 def check_switch(self,RestIP,correct_nr_switch, RestPort ="8080" ):
Jon Halld8dc5772014-04-08 16:26:29 -0700930 '''
931 Used by check_status
932 '''
Jon Hallf89c8552014-04-02 13:14:06 -0700933 try:
934 buf = ""
935 retcode = 0
admin2e131ab2014-05-28 10:03:42 -0700936 url="http://%s:%s/wm/onos/topology/switches" % (RestIP, RestPort)
Jon Hallf89c8552014-04-02 13:14:06 -0700937 parsedResult = self.get_json(url)
938 if parsedResult == "":
939 retcode = 1
940 return (retcode, "Rest API has an issue")
941 url = "http://%s:%s/wm/onos/registry/switches/json" % (RestIP, RestPort)
942 registry = self.get_json(url)
943
944 if registry == "":
945 retcode = 1
946 return (retcode, "Rest API has an issue")
947
948 cnt = 0
949 active = 0
adminbae64d82013-08-01 10:50:15 -0700950
Jon Hallf89c8552014-04-02 13:14:06 -0700951 for s in parsedResult:
952 cnt += 1
James Leec9cacaf2014-04-08 09:17:39 -0700953 if s['state'] == "ACTIVE":
Jon Hallf89c8552014-04-02 13:14:06 -0700954 active += 1
adminbae64d82013-08-01 10:50:15 -0700955
Jon Hallf89c8552014-04-02 13:14:06 -0700956 buf += "switch: network %d : %d switches %d active\n" % (0+1, cnt, active)
957 if correct_nr_switch != cnt:
958 buf += "switch fail: network %d should have %d switches but has %d\n" % (1, correct_nr_switch, cnt)
959 retcode = 1
adminbae64d82013-08-01 10:50:15 -0700960
Jon Hallf89c8552014-04-02 13:14:06 -0700961 if correct_nr_switch != active:
962 buf += "switch fail: network %d should have %d active switches but has %d\n" % (1, correct_nr_switch, active)
963 retcode = 1
964
965 return (retcode, buf)
Jon Hallae05dc22014-04-16 10:56:28 -0700966 except pexpect.EOF:
967 main.log.error(self.name + ": EOF exception found")
968 main.log.error(self.name + ": " + self.handle.before)
969 main.cleanup()
970 main.exit()
Jon Hallf89c8552014-04-02 13:14:06 -0700971 except:
972 main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
973 main.log.error( traceback.print_exc() )
974 main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
975 main.cleanup()
976 main.exit()
adminbae64d82013-08-01 10:50:15 -0700977
Jon Hallf89c8552014-04-02 13:14:06 -0700978 def check_link(self,RestIP, nr_links, RestPort = "8080"):
Jon Halld8dc5772014-04-08 16:26:29 -0700979 '''
980 Used by check_status
981 '''
Jon Hallf89c8552014-04-02 13:14:06 -0700982 try:
983 buf = ""
984 retcode = 0
985
admin2e131ab2014-05-28 10:03:42 -0700986 url = "http://%s:%s/wm/onos/topology/links" % (RestIP, RestPort)
Jon Hallf89c8552014-04-02 13:14:06 -0700987 parsedResult = self.get_json(url)
988
989 if parsedResult == "":
990 retcode = 1
991 return (retcode, "Rest API has an issue")
992
993 buf += "link: total %d links (correct : %d)\n" % (len(parsedResult), nr_links)
994 intra = 0
995 interlink=0
996
997 for s in parsedResult:
James Leec9cacaf2014-04-08 09:17:39 -0700998 intra = intra + 1
Jon Hallf89c8552014-04-02 13:14:06 -0700999
1000 if intra != nr_links:
1001 buf += "link fail\n"
1002 retcode = 1
1003
1004 return (retcode, buf)
Jon Hallae05dc22014-04-16 10:56:28 -07001005 except pexpect.EOF:
1006 main.log.error(self.name + ": EOF exception found")
1007 main.log.error(self.name + ": " + self.handle.before)
1008 main.cleanup()
1009 main.exit()
Jon Hallf89c8552014-04-02 13:14:06 -07001010 except:
1011 main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
1012 main.log.error( traceback.print_exc() )
1013 main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
1014 main.cleanup()
1015 main.exit()
adminbae64d82013-08-01 10:50:15 -07001016
Jon Hallf89c8552014-04-02 13:14:06 -07001017 def check_status_report(self, ip, numoswitch, numolink, port="8080"):
Jon Halld8dc5772014-04-08 16:26:29 -07001018 '''
1019 Checks the number of swithes & links that ONOS sees against the supplied values.
1020 Writes to the report log.
1021 '''
Jon Hallf89c8552014-04-02 13:14:06 -07001022 try:
James Leec9cacaf2014-04-08 09:17:39 -07001023 main.log.info(self.name + ": Making some rest calls...")
Jon Hallf89c8552014-04-02 13:14:06 -07001024 switch = self.check_switch(ip, int(numoswitch), port)
1025 link = self.check_link(ip, int(numolink), port)
1026 value = switch[0]
1027 value += link[0]
1028 main.log.report( self.name + ": \n-----\n%s%s-----\n" % ( switch[1], link[1]) )
1029 if value != 0:
1030 return main.FALSE
James Leec9cacaf2014-04-08 09:17:39 -07001031 else:
Jon Hallf89c8552014-04-02 13:14:06 -07001032 # "PASS"
1033 return main.TRUE
Jon Hallae05dc22014-04-16 10:56:28 -07001034 except pexpect.EOF:
1035 main.log.error(self.name + ": EOF exception found")
1036 main.log.error(self.name + ": " + self.handle.before)
1037 main.cleanup()
1038 main.exit()
Jon Hallf89c8552014-04-02 13:14:06 -07001039 except:
1040 main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
1041 main.log.error( traceback.print_exc() )
1042 main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
1043 main.cleanup()
1044 main.exit()
adminbae64d82013-08-01 10:50:15 -07001045
Jon Hallf89c8552014-04-02 13:14:06 -07001046 def check_status(self, ip, numoswitch, numolink, port = "8080"):
Jon Halld8dc5772014-04-08 16:26:29 -07001047 '''
1048 Checks the number of swithes & links that ONOS sees against the supplied values.
1049 Writes to the main log.
1050 '''
Jon Hallf89c8552014-04-02 13:14:06 -07001051 try:
James Leec9cacaf2014-04-08 09:17:39 -07001052 main.log.info(self.name + ": Making some rest calls...")
Jon Hallf89c8552014-04-02 13:14:06 -07001053 switch = self.check_switch(ip, int(numoswitch), port)
1054 link = self.check_link(ip, int(numolink), port)
1055 value = switch[0]
1056 value += link[0]
1057 main.log.info(self.name + ": \n-----\n%s%s-----\n" % ( switch[1], link[1]) )
1058 if value != 0:
1059 return main.FALSE
James Leec9cacaf2014-04-08 09:17:39 -07001060 else:
Jon Hallf89c8552014-04-02 13:14:06 -07001061 # "PASS"
1062 return main.TRUE
Jon Hallae05dc22014-04-16 10:56:28 -07001063 except pexpect.EOF:
1064 main.log.error(self.name + ": EOF exception found")
1065 main.log.error(self.name + ": " + self.handle.before)
1066 main.cleanup()
1067 main.exit()
Jon Hallf89c8552014-04-02 13:14:06 -07001068 except:
1069 main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
1070 main.log.error( traceback.print_exc() )
1071 main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
1072 main.cleanup()
1073 main.exit()
adminbae64d82013-08-01 10:50:15 -07001074
Jon Hallf89c8552014-04-02 13:14:06 -07001075
admine0eeea22014-04-14 10:22:46 -07001076 def git_pull(self, comp1=""):
Jon Halld8dc5772014-04-08 16:26:29 -07001077 '''
Jon Halld8dc5772014-04-08 16:26:29 -07001078 Assumes that "git pull" works without login
admine0eeea22014-04-14 10:22:46 -07001079
1080 This function will perform a git pull on the ONOS instance.
1081 If used as git_pull("NODE") it will do git pull + NODE. This is
1082 for the purpose of pulling from other nodes if necessary.
1083
1084 Otherwise, this function will perform a git pull in the
1085 ONOS repository. If it has any problems, it will return main.ERROR
1086 If it successfully does a git_pull, it will return a 1.
1087 If it has no updates, it will return a 0.
1088
Jon Halld8dc5772014-04-08 16:26:29 -07001089 '''
Jon Hallae05dc22014-04-16 10:56:28 -07001090 try:
Jon Halle80ef8c2014-04-29 15:29:13 -07001091 # main.log.info(self.name + ": Stopping ONOS")
1092 #self.stop()
Jon Hallae05dc22014-04-16 10:56:28 -07001093 self.handle.sendline("cd " + self.home)
1094 self.handle.expect("ONOS\$")
1095 if comp1=="":
1096 self.handle.sendline("git pull")
1097 else:
1098 self.handle.sendline("git pull " + comp1)
1099
1100 uptodate = 0
Jon Hall96983632014-07-17 12:06:12 -07001101 i=self.handle.expect(['fatal','Username\sfor\s(.*):\s','\sfile(s*) changed,\s',pexpect.TIMEOUT,'Already up-to-date','Aborting','You\sare\snot\scurrently\son\sa\sbranch'],timeout=1700)
Jon Hallae05dc22014-04-16 10:56:28 -07001102 #debug
1103 #main.log.report(self.name +": \n"+"git pull response: " + str(self.handle.before) + str(self.handle.after))
1104 if i==0:
1105 main.log.error(self.name + ": Git pull had some issue...")
1106 return main.ERROR
1107 elif i==1:
1108 main.log.error(self.name + ": Git Pull Asking for username!!! BADD!")
1109 return main.ERROR
1110 elif i==2:
1111 main.log.info(self.name + ": Git Pull - pulling repository now")
1112 self.handle.expect("ONOS\$", 120)
1113 return 0
1114 elif i==3:
1115 main.log.error(self.name + ": Git Pull - TIMEOUT")
Jon Hall96983632014-07-17 12:06:12 -07001116 main.log.error(self.name + " Response was: " + str(self.handle.before))
Jon Hallae05dc22014-04-16 10:56:28 -07001117 return main.ERROR
1118 elif i==4:
1119 main.log.info(self.name + ": Git Pull - Already up to date")
1120 return 1
1121 elif i==5:
1122 main.log.info(self.name + ": Git Pull - Aborting... Are there conflicting git files?")
1123 return main.ERROR
Jon Hall5a8aac62014-06-03 09:30:21 -07001124 elif i==6:
1125 main.log.info(self.name + ": Git Pull - You are not currently on a branch so git pull failed!")
1126 return main.ERROR
Jon Hallae05dc22014-04-16 10:56:28 -07001127 else:
1128 main.log.error(self.name + ": Git Pull - Unexpected response, check for pull errors")
1129 return main.ERROR
1130 except pexpect.EOF:
1131 main.log.error(self.name + ": EOF exception found")
1132 main.log.error(self.name + ": " + self.handle.before)
1133 main.cleanup()
1134 main.exit()
1135 except:
1136 main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
1137 main.log.error( traceback.print_exc() )
1138 main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
1139 main.cleanup()
1140 main.exit()
admine0eeea22014-04-14 10:22:46 -07001141#********************************************************
1142
1143
admin7373a812014-04-16 09:49:02 -07001144 def git_compile(self):
Jon Hallae05dc22014-04-16 10:56:28 -07001145 '''
1146 Compiles ONOS
1147 First runs mvn clean then mvn compile
1148 '''
1149 try:
1150 main.log.info(self.name + ": mvn clean")
admin8fc02822014-04-16 13:31:23 -07001151 self.handle.sendline("cd " + self.home)
Jon Hallae05dc22014-04-16 10:56:28 -07001152 self.handle.sendline("mvn clean")
1153 while 1:
Jon Hall1636f942014-04-17 10:07:23 -07001154 i=self.handle.expect(['There\sis\sinsufficient\smemory\sfor\sthe\sJava\sRuntime\sEnvironment\sto\scontinue','BUILD\sFAILURE','BUILD\sSUCCESS','ONOS\$',pexpect.TIMEOUT],timeout=30)
Jon Hallae05dc22014-04-16 10:56:28 -07001155 if i == 0:
Jon Hall1636f942014-04-17 10:07:23 -07001156 main.log.error(self.name + ":There is insufficient memory for the Java Runtime Environment to continue.")
Jon Hallae05dc22014-04-16 10:56:28 -07001157 return main.FALSE
1158 elif i == 1:
Jon Hall1636f942014-04-17 10:07:23 -07001159 main.log.error(self.name + ": Clean failure!")
1160 return main.FALSE
Jon Hallae05dc22014-04-16 10:56:28 -07001161 elif i == 2:
Jon Hall1636f942014-04-17 10:07:23 -07001162 main.log.info(self.name + ": Clean success!")
1163 elif i == 3:
admin8fc02822014-04-16 13:31:23 -07001164 main.log.info(self.name + ": Clean complete")
Jon Hallae05dc22014-04-16 10:56:28 -07001165 break;
Jon Hall1636f942014-04-17 10:07:23 -07001166 elif i == 4:
Jon Hallae05dc22014-04-16 10:56:28 -07001167 main.log.error(self.name + ": mvn clean TIMEOUT!")
1168 return main.FALSE
Jon Hall1636f942014-04-17 10:07:23 -07001169 else:
1170 main.log.error(self.name + ": unexpected response from mvn clean")
1171 return main.FALSE
Jon Hallae05dc22014-04-16 10:56:28 -07001172
1173 main.log.info(self.name + ": mvn compile")
1174 self.handle.sendline("mvn compile")
1175 while 1:
Jon Hall1636f942014-04-17 10:07:23 -07001176 i=self.handle.expect(['There\sis\sinsufficient\smemory\sfor\sthe\sJava\sRuntime\sEnvironment\sto\scontinue','BUILD\sFAILURE','BUILD\sSUCCESS','ONOS\$',pexpect.TIMEOUT],timeout=60)
Jon Hallae05dc22014-04-16 10:56:28 -07001177 if i == 0:
Jon Hall1636f942014-04-17 10:07:23 -07001178 main.log.error(self.name + ":There is insufficient memory for the Java Runtime Environment to continue.")
1179 return main.FALSE
1180 if i == 1:
Jon Hallae05dc22014-04-16 10:56:28 -07001181 main.log.error(self.name + ": Build failure!")
1182 return main.FALSE
Jon Hall1636f942014-04-17 10:07:23 -07001183 elif i == 2:
Jon Hallae05dc22014-04-16 10:56:28 -07001184 main.log.info(self.name + ": Build success!")
Jon Hall1636f942014-04-17 10:07:23 -07001185 elif i == 3:
Jon Hallae05dc22014-04-16 10:56:28 -07001186 main.log.info(self.name + ": Build complete")
Jon Hall010f5412014-05-21 15:10:12 -07001187 self.handle.expect("\$", timeout=60)
Jon Hallae05dc22014-04-16 10:56:28 -07001188 return main.TRUE
Jon Hall1636f942014-04-17 10:07:23 -07001189 elif i == 4:
Jon Hallae05dc22014-04-16 10:56:28 -07001190 main.log.error(self.name + ": mvn compile TIMEOUT!")
1191 return main.FALSE
1192 else:
Jon Hall1636f942014-04-17 10:07:23 -07001193 main.log.error(self.name + ": unexpected response from mvn compile")
1194 return main.FALSE
Jon Hallae05dc22014-04-16 10:56:28 -07001195 except pexpect.EOF:
1196 main.log.error(self.name + ": EOF exception found")
1197 main.log.error(self.name + ": " + self.handle.before)
1198 main.cleanup()
1199 main.exit()
1200 except:
1201 main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
1202 main.log.error( traceback.print_exc() )
1203 main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
1204 main.cleanup()
1205 main.exit()
admin4a58db92013-09-30 12:04:54 -07001206
Jon Hallf89c8552014-04-02 13:14:06 -07001207 def tcpdump(self, intf = "eth0"):
Jon Hallae05dc22014-04-16 10:56:28 -07001208 '''
1209 Runs tpdump on an intferface and saves in onos-logs under the ONOS home directory
1210 intf can be specified, or the default eth0 is used
1211 '''
Jon Hallf89c8552014-04-02 13:14:06 -07001212 try:
1213 self.handle.sendline("")
1214 self.handle.expect("\$")
Jon Hall26f316b2014-04-11 11:21:25 -07001215 self.handle.sendline("sudo tcpdump -n -i "+ intf + " -s0 -w " + self.home +"/onos-logs/tcpdump &")
Jon Hallf89c8552014-04-02 13:14:06 -07001216 i=self.handle.expect(['No\ssuch\device','listening\son',pexpect.TIMEOUT],timeout=10)
1217 if i == 0:
1218 main.log.error(self.name + ": tcpdump - No such device exists. tcpdump attempted on: " + intf)
1219 return main.FALSE
James Leec9cacaf2014-04-08 09:17:39 -07001220 elif i == 1:
Jon Hallf89c8552014-04-02 13:14:06 -07001221 main.log.info(self.name + ": tcpdump started on " + intf)
1222 return main.TRUE
James Leec9cacaf2014-04-08 09:17:39 -07001223 elif i == 2:
Jon Hallf89c8552014-04-02 13:14:06 -07001224 main.log.error(self.name + ": tcpdump command timed out! Check interface name, given interface was: " + intf)
1225 return main.FALSE
1226 else:
1227 main.log.error(self.name + ": tcpdump - unexpected response")
1228 return main.FALSE
Jon Hallae05dc22014-04-16 10:56:28 -07001229 except pexpect.EOF:
1230 main.log.error(self.name + ": EOF exception found")
1231 main.log.error(self.name + ": " + self.handle.before)
1232 main.cleanup()
1233 main.exit()
Jon Hallf89c8552014-04-02 13:14:06 -07001234 except:
1235 main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
1236 main.log.error( traceback.print_exc() )
1237 main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
1238 main.cleanup()
1239 main.exit()
1240
admin4a58db92013-09-30 12:04:54 -07001241 def kill_tcpdump(self):
Jon Hallae05dc22014-04-16 10:56:28 -07001242 '''
1243 Kills any tcpdump processes running
1244 '''
Jon Hallf89c8552014-04-02 13:14:06 -07001245 try:
1246 self.handle.sendline("")
1247 self.handle.expect("\$")
1248 self.handle.sendline("sudo kill -9 `ps -ef | grep \"tcpdump -n\" | grep -v grep | awk '{print $2}'`")
Jon Hallae05dc22014-04-16 10:56:28 -07001249 except pexpect.EOF:
1250 main.log.error(self.name + ": EOF exception found")
1251 main.log.error(self.name + ": " + self.handle.before)
1252 main.cleanup()
1253 main.exit()
Jon Hallf89c8552014-04-02 13:14:06 -07001254 except:
1255 main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
1256 main.log.error( traceback.print_exc() )
1257 main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
1258 main.cleanup()
1259 main.exit()
1260
Jon Hallf15f7852014-05-20 10:37:23 -07001261 def find_host(self,RestIP,RestPort,RestAPI,hostMAC):
admin2a9548d2014-06-17 14:08:07 -07001262 retcode = 0 # number of hosts found with given MAC
1263 retswitch = [] # Switch DPID's of hosts found with MAC
1264 retport = [] # Switch port connected to to hosts found with MAC
Jon Hallf15f7852014-05-20 10:37:23 -07001265 foundHost = []
Jon Hallf89c8552014-04-02 13:14:06 -07001266 try:
Jon Hall2f42a672014-05-28 10:13:18 -07001267 ##### device rest API is: 'host:8080/wm/onos/topology/switches' ###
Jon Hallf89c8552014-04-02 13:14:06 -07001268 url ="http://%s:%s%s" %(RestIP,RestPort,RestAPI)
1269
1270 try:
1271 command = "curl -s %s" % (url)
1272 result = os.popen(command).read()
1273 parsedResult = json.loads(result)
1274 # print parsedResult
1275 except:
1276 print "REST IF %s has issue" % command
1277 parsedResult = ""
1278
1279 if parsedResult == "":
Jon Hallf15f7852014-05-20 10:37:23 -07001280 return (retcode, "Rest API has an error", retport)
Jon Hallf89c8552014-04-02 13:14:06 -07001281 else:
Jon Hallf15f7852014-05-20 10:37:23 -07001282 for host in enumerate(parsedResult):
1283 print host
1284 if (host[1] != []):
1285 try:
1286 foundHost = host[1]['mac']
1287 except:
1288 print "Error in detecting MAC address."
1289 print foundHost
1290 print hostMAC
1291 if foundHost == hostMAC:
1292 for switch in enumerate(host[1]['attachmentPoints']):
1293 retswitch.append(switch[1]['dpid'])
Jon Hallbb650fe2014-07-14 14:54:48 -07001294 retport.append(switch[1]['portNumber'])
Jon Hallf15f7852014-05-20 10:37:23 -07001295 retcode = retcode +1
1296 foundHost =''
1297 '''
Jon Hallf89c8552014-04-02 13:14:06 -07001298 for switch in enumerate(parsedResult):
1299 for port in enumerate(switch[1]['ports']):
admin2a9548d2014-06-17 14:08:07 -07001300 if ( port[1]['hosts'] != [] ):
Jon Hallf89c8552014-04-02 13:14:06 -07001301 try:
admin2a9548d2014-06-17 14:08:07 -07001302 foundHost = port[1]['hosts'][0]['ipv4addresses'][0]['ipv4']
Jon Hallf89c8552014-04-02 13:14:06 -07001303 except:
Jon Hallf15f7852014-05-20 10:37:23 -07001304 print "Error in detecting MAC address."
1305 if foundHost == hostMAC:
Jon Hallf89c8552014-04-02 13:14:06 -07001306 retswitch.append(switch[1]['dpid'])
1307 retport.append(port[1]['desc'])
admin2a9548d2014-06-17 14:08:07 -07001308 retmac.append(port[1]['hosts'][0]['mac'])
Jon Hallf89c8552014-04-02 13:14:06 -07001309 retcode = retcode +1
Jon Hallf15f7852014-05-20 10:37:23 -07001310 foundHost =''
1311 '''
1312 return(retcode, retswitch, retport)
Jon Hallae05dc22014-04-16 10:56:28 -07001313 except pexpect.EOF:
1314 main.log.error(self.name + ": EOF exception found")
1315 main.log.error(self.name + ": " + self.handle.before)
1316 main.cleanup()
1317 main.exit()
Jon Hallf89c8552014-04-02 13:14:06 -07001318 except:
1319 main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
1320 main.log.error( traceback.print_exc() )
1321 main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
1322 main.cleanup()
1323 main.exit()
SeanCorcoran29b70542014-05-14 14:53:42 -07001324
1325 def check_exceptions(self):
1326 '''
1327 Greps the logs for "xception"
1328 '''
1329 try:
1330 output = ''
1331 self.handle.sendline("")
Jon Halla78cf9a2014-05-16 10:49:30 -07001332 i = self.handle.expect(["\$",pexpect.EOF,pexpect.TIMEOUT])
1333 #main.log.warn("first expect response: " +str(i))
SeanCorcoran29b70542014-05-14 14:53:42 -07001334 self.handle.sendline("cd "+self.home+"/onos-logs")
Jon Hallbb650fe2014-07-14 14:54:48 -07001335 self.handle.sendline("zgrep \"xception\" *.log *.log.gz *.stderr *.stdout")
Jon Halla78cf9a2014-05-16 10:49:30 -07001336 i = self.handle.expect(["\*",pexpect.EOF,pexpect.TIMEOUT])
1337 #main.log.warn("second expect response: " +str(i))
Jon Hall724a2f42014-06-23 16:04:22 -07001338 i = self.handle.expect(["\$",pexpect.EOF,pexpect.TIMEOUT],timeout=120)
Jon Halla78cf9a2014-05-16 10:49:30 -07001339 #main.log.warn("third expect response: " +str(i))
SeanCorcoran29b70542014-05-14 14:53:42 -07001340 response = self.handle.before
admin6903e462014-07-22 15:30:54 -07001341 print response
Jon Halla78cf9a2014-05-16 10:49:30 -07001342 count = 0
Jon Hallbb650fe2014-07-14 14:54:48 -07001343 print response
SeanCorcoran29b70542014-05-14 14:53:42 -07001344 for line in response.splitlines():
Jon Hallbb650fe2014-07-14 14:54:48 -07001345 if re.search("gzip: \*\.log\.gz:", line):
1346 pass
1347 elif re.search("log:", line):
SeanCorcoran29b70542014-05-14 14:53:42 -07001348 output +="Exceptions found in " + line + "\n"
Jon Halla78cf9a2014-05-16 10:49:30 -07001349 count +=1
Jon Hall724a2f42014-06-23 16:04:22 -07001350 elif re.search("log\.gz:",line):
1351 output+="Exceptions found in " + line + "\n"
1352 count +=1
SeanCorcoran29b70542014-05-14 14:53:42 -07001353 elif re.search("std...:",line):
1354 output+="Exceptions found in " + line + "\n"
Jon Halla78cf9a2014-05-16 10:49:30 -07001355 count +=1
SeanCorcoran29b70542014-05-14 14:53:42 -07001356 else:
1357 pass
1358 #these should be the old logs
admin1723f1c2014-05-19 16:08:39 -07001359 main.log.report(str(count) + " Exceptions were found on "+self.name)
SeanCorcoran29b70542014-05-14 14:53:42 -07001360 return output
1361 except pexpect.TIMEOUT:
1362 main.log.error(self.name + ": Timeout exception found in check_exceptions function")
1363 except pexpect.EOF:
1364 main.log.error(self.name + ": EOF exception found")
1365 main.log.error(self.name + ": " + self.handle.before)
1366 main.cleanup()
1367 main.exit()
1368 except:
1369 main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
1370 main.log.error( traceback.print_exc() )
1371 main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
1372 main.cleanup()
1373 main.exit()