blob: c8501cd12177f518e21d73a3934ac027b3dfad50 [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
178 else :
Jon Hallf0a494f2014-06-23 15:37:40 -0700179 main.log.warn(self.name + " WARNING: status recieved unknown response")
180 main.log.warn(response)
Jon Hallf89c8552014-04-02 13:14:06 -0700181 return main.FALSE
Jon Hallae05dc22014-04-16 10:56:28 -0700182 except pexpect.EOF:
183 main.log.error(self.name + ": EOF exception found")
184 main.log.error(self.name + ": " + self.handle.before)
185 main.cleanup()
186 main.exit()
Jon Hallf89c8552014-04-02 13:14:06 -0700187 except:
188 main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
189 main.log.error( traceback.print_exc() )
190 main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
191 main.cleanup()
192 main.exit()
193
adminbae64d82013-08-01 10:50:15 -0700194
195 def isup(self):
Jon Halld8dc5772014-04-08 16:26:29 -0700196 '''
197 A more complete check to see if ONOS is up and running properly.
198 First, it checks if the process is up.
199 Second, it reads the logs for "Exception: Connection refused"
200 Third, it makes sure the logs are actually moving.
201 returns TRUE/FALSE accordingly.
202 '''
Jon Hallf89c8552014-04-02 13:14:06 -0700203 try:
204 self.execute(cmd="\n",prompt="\$",timeout=10)
Jon Hall4a2b0482014-04-18 16:29:26 -0700205 self.handle.sendline("cd "+self.home)
206 response = self.execute(cmd= "./onos.sh core status ",prompt="running",timeout=10)
Jon Hallf89c8552014-04-02 13:14:06 -0700207 self.execute(cmd="\n",prompt="\$",timeout=10)
208 tail1 = self.execute(cmd="tail " + self.home + "/onos-logs/onos.*.log",prompt="\$",timeout=10)
admine8c47d02014-06-03 11:59:16 -0700209 time.sleep(10)
Jon Hallf89c8552014-04-02 13:14:06 -0700210 self.execute(cmd="\n",prompt="\$",timeout=10)
211 tail2 = self.execute(cmd="tail " + self.home + "/onos-logs/onos.*.log",prompt="\$",timeout=10)
212 pattern = '(.*)1 instance(.*)'
213 pattern2 = '(.*)Exception: Connection refused(.*)'
214 # if utilities.assert_matches(expect=pattern,actual=response,onpass="ONOS process is running...",onfail="ONOS process not running..."):
admin2a9548d2014-06-17 14:08:07 -0700215 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 -0700216 if re.search(pattern, response):
admin2a9548d2014-06-17 14:08:07 -0700217 if running != "":
Jon Halle80ef8c2014-04-29 15:29:13 -0700218 main.log.info(self.name + ": ONOS process is running...")
219 if tail1 == tail2:
220 main.log.error(self.name + ": ONOS is frozen...")#logs aren't moving
221 return main.FALSE
222 elif re.search( pattern2,tail1 ):
223 main.log.info(self.name + ": Connection Refused found in onos log")
224 return main.FALSE
225 elif re.search( pattern2,tail2 ):
226 main.log.info(self.name + ": Connection Refused found in onos log")
227 return main.FALSE
228 else:
229 main.log.info(self.name + ": Onos log is moving! It's looking good!")
230 return main.TRUE
Jon Hall55c79662014-05-19 15:03:40 -0700231 else:
232 main.log.info(self.name + ": ONOS not yet sending out LLDP messages")
233 return main.FALSE
adminbae64d82013-08-01 10:50:15 -0700234 else:
Jon Hallf89c8552014-04-02 13:14:06 -0700235 main.log.error(self.name + ": ONOS process not running...")
236 return main.FALSE
Jon Hallae05dc22014-04-16 10:56:28 -0700237 except pexpect.EOF:
238 main.log.error(self.name + ": EOF exception found")
239 main.log.error(self.name + ": " + self.handle.before)
240 main.cleanup()
241 main.exit()
Jon Hallf89c8552014-04-02 13:14:06 -0700242 except:
243 main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
244 main.log.error( traceback.print_exc() )
245 main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
246 main.cleanup()
247 main.exit()
adminbae64d82013-08-01 10:50:15 -0700248
Jon Hallf89c8552014-04-02 13:14:06 -0700249
250
James Leec9cacaf2014-04-08 09:17:39 -0700251 def rest_status(self):
Jon Halld8dc5772014-04-08 16:26:29 -0700252 '''
253 Checks if the rest server is running.
254 '''
Jon Hallf89c8552014-04-02 13:14:06 -0700255 try:
256 response = self.execute(cmd= self.home + "/start-rest.sh status ",prompt="running",timeout=10)
257 if re.search("rest\sserver\sis\srunning",response):
258 main.log.info(self.name + ": Rest Server is running")
Jon Hallae05dc22014-04-16 10:56:28 -0700259 return main.TRUE
Jon Hallf89c8552014-04-02 13:14:06 -0700260 elif re.search("rest\sserver\sis\snot\srunning",response):
261 main.log.warn(self.name + ": Rest Server is not Running")
Jon Hallae05dc22014-04-16 10:56:28 -0700262 return main.FALSE
Jon Hallf89c8552014-04-02 13:14:06 -0700263 else :
264 main.log.error(self.name + ": No response" +response)
Jon Hallae05dc22014-04-16 10:56:28 -0700265 return main.FALSE
266 except pexpect.EOF:
267 main.log.error(self.name + ": EOF exception found")
268 main.log.error(self.name + ": " + self.handle.before)
269 main.cleanup()
270 main.exit()
Jon Hallf89c8552014-04-02 13:14:06 -0700271 except:
272 main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
273 main.log.error( traceback.print_exc() )
274 main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
275 main.cleanup()
276 main.exit()
admine8c47d02014-06-03 11:59:16 -0700277
278 def stop_all(self):
279 '''
280 Runs ./onos.sh stop
281 '''
282 try:
283 self.handle.sendline("")
284 self.handle.expect(["\$",pexpect.EOF,pexpect.TIMEOUT])
285 self.handle.sendline("cd "+self.home)
286 self.handle.sendline("./onos.sh stop")
287 i=self.handle.expect(["Stop",pexpect.EOF,pexpect.TIMEOUT])
288 self.handle.expect(["\$",pexpect.EOF,pexpect.TIMEOUT], 60)
289 result = self.handle.before
290 if re.search("Killed", result):
291 main.log.info(self.name + ": ONOS Killed Successfully")
292 return main.TRUE
293 else :
294 main.log.warn(self.name + ": ONOS wasn't running")
295 return main.FALSE
296 except pexpect.EOF:
297 main.log.error(self.name + ": EOF exception found")
298 main.log.error(self.name + ": " + self.handle.before)
299 main.cleanup()
300 main.exit()
301 except:
302 main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
303 main.log.error( traceback.print_exc() )
304 main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
305 main.cleanup()
306 main.exit()
Jon Hallf89c8552014-04-02 13:14:06 -0700307
308
adminbae64d82013-08-01 10:50:15 -0700309 def stop(self):
Jon Halld8dc5772014-04-08 16:26:29 -0700310 '''
311 Runs ./onos.sh core stop to stop ONOS
312 '''
Jon Hallf89c8552014-04-02 13:14:06 -0700313 try:
314 self.handle.sendline("")
Jon Hallae05dc22014-04-16 10:56:28 -0700315 self.handle.expect(["\$",pexpect.EOF,pexpect.TIMEOUT])
Jon Hall4a2b0482014-04-18 16:29:26 -0700316 self.handle.sendline("cd "+self.home)
317 self.handle.sendline("./onos.sh core stop")
Jon Hallae05dc22014-04-16 10:56:28 -0700318 i=self.handle.expect(["Stop",pexpect.EOF,pexpect.TIMEOUT])
319 self.handle.expect(["\$",pexpect.EOF,pexpect.TIMEOUT], 60)
James Leec9cacaf2014-04-08 09:17:39 -0700320 result = self.handle.before
Jon Hallf89c8552014-04-02 13:14:06 -0700321 if re.search("Killed", result):
322 main.log.info(self.name + ": ONOS Killed Successfully")
323 return main.TRUE
324 else :
325 main.log.warn(self.name + ": ONOS wasn't running")
326 return main.FALSE
Jon Hallae05dc22014-04-16 10:56:28 -0700327 except pexpect.EOF:
328 main.log.error(self.name + ": EOF exception found")
329 main.log.error(self.name + ": " + self.handle.before)
330 main.cleanup()
331 main.exit()
Jon Hallf89c8552014-04-02 13:14:06 -0700332 except:
333 main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
334 main.log.error( traceback.print_exc() )
335 main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
336 main.cleanup()
337 main.exit()
338
adminbae64d82013-08-01 10:50:15 -0700339
340 def rest_stop(self):
Jon Halld8dc5772014-04-08 16:26:29 -0700341 '''
342 Runs ./start-rest.sh stop to stop ONOS rest server
343 '''
Jon Hallf89c8552014-04-02 13:14:06 -0700344 try:
345 response = self.execute(cmd= self.home + "/start-rest.sh stop ",prompt="killing",timeout=10)
346 self.execute(cmd="\n",prompt="\$",timeout=10)
347 if re.search("killing", response):
348 main.log.info(self.name + ": Rest Server Stopped")
349 return main.TRUE
350 else :
351 main.log.error(self.name + ": Failed to Stop, Rest Server is not Running")
352 return main.FALSE
Jon Hallae05dc22014-04-16 10:56:28 -0700353 except pexpect.EOF:
354 main.log.error(self.name + ": EOF exception found")
355 main.log.error(self.name + ": " + self.handle.before)
356 main.cleanup()
357 main.exit()
Jon Hallf89c8552014-04-02 13:14:06 -0700358 except:
359 main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
360 main.log.error( traceback.print_exc() )
361 main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
362 main.cleanup()
363 main.exit()
364
365
adminbae64d82013-08-01 10:50:15 -0700366 def disconnect(self):
Jon Halld8dc5772014-04-08 16:26:29 -0700367 '''
368 Called when Test is complete to disconnect the ONOS handle.
369 '''
adminaeedddd2013-08-02 15:14:15 -0700370 response = ''
371 try:
adminbae64d82013-08-01 10:50:15 -0700372 self.handle.sendline("exit")
adminaeedddd2013-08-02 15:14:15 -0700373 self.handle.expect("closed")
Jon Hallae05dc22014-04-16 10:56:28 -0700374 except pexpect.EOF:
375 main.log.error(self.name + ": EOF exception found")
376 main.log.error(self.name + ": " + self.handle.before)
James Leec9cacaf2014-04-08 09:17:39 -0700377 except:
Jon Hallf89c8552014-04-02 13:14:06 -0700378 main.log.error(self.name + ": Connection failed to the host")
adminbae64d82013-08-01 10:50:15 -0700379 response = main.FALSE
adminaeedddd2013-08-02 15:14:15 -0700380 return response
381
Jon Hall76f2c462014-04-17 11:37:15 -0700382 def print_version(self):
Jon Halld8dc5772014-04-08 16:26:29 -0700383 '''
384 Writes the COMMIT number to the report to be parsed by Jenkins data collecter.
385 '''
Jon Hallf89c8552014-04-02 13:14:06 -0700386 try:
387 self.handle.sendline("export TERM=xterm-256color")
388 self.handle.expect("xterm-256color")
James Leec9cacaf2014-04-08 09:17:39 -0700389 self.handle.expect("\$")
Jon Hall09944cd2014-06-25 11:28:43 -0700390 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 -0700391 self.handle.expect("cd ..")
392 self.handle.expect("\$")
admine0eeea22014-04-14 10:22:46 -0700393 response=(self.name +": \n"+ str(self.handle.before + self.handle.after))
394 main.log.report(response)
Jon Hall76f2c462014-04-17 11:37:15 -0700395 except pexpect.EOF:
396 main.log.error(self.name + ": EOF exception found")
397 main.log.error(self.name + ": " + self.handle.before)
398 main.cleanup()
399 main.exit()
400 except:
401 main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
402 main.log.error( traceback.print_exc() )
403 main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
404 main.cleanup()
405 def get_version(self):
406 '''
407 Writes the COMMIT number to the report to be parsed by Jenkins data collecter.
408 '''
409 try:
410 self.handle.sendline("export TERM=xterm-256color")
411 self.handle.expect("xterm-256color")
412 self.handle.expect("\$")
Jon Hall09944cd2014-06-25 11:28:43 -0700413 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 -0700414 self.handle.expect("cd ..")
415 self.handle.expect("\$")
416 response=(self.name +": \n"+ str(self.handle.before + self.handle.after))
admine0eeea22014-04-14 10:22:46 -0700417 lines=response.splitlines()
418 for line in lines:
419 print line
420 return lines[2]
Jon Hallae05dc22014-04-16 10:56:28 -0700421 except pexpect.EOF:
422 main.log.error(self.name + ": EOF exception found")
423 main.log.error(self.name + ": " + self.handle.before)
424 main.cleanup()
425 main.exit()
Jon Hallf89c8552014-04-02 13:14:06 -0700426 except:
427 main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
428 main.log.error( traceback.print_exc() )
429 main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
430 main.cleanup()
431 main.exit()
adminbae64d82013-08-01 10:50:15 -0700432
admin2a9548d2014-06-17 14:08:07 -0700433
admindc1c5072014-06-24 15:57:19 -0700434
435#*********************************************************************
436#*********************************************************************
437# shortest_path is a command to find the shortest path between two
438# switches. It is called using the IP, port, and source and
439# destination dpids
440#*********************************************************************
441#*********************************************************************
442
443 def shortest_path(self,ONOSIP,ONOSPort,srcDPID,dstDPID):
444 main.log.report("Finding the shortest Path between "+str(srcDPID) + " to " + str(dstDPID))
445 url = "http://%s:%s/wm/onos/intent/path/switch/%s/shortest-path/%s"%(ONOSIP,ONOSPort,srcDPID,dstDPID)
446 parsed_result = []
447 try:
448 response = urllib2.urlopen(url)
449 result = response.read()
450 response.close()
451 if len(result) != 0:
452 parsed_result = json.loads(result)
453 except HTTPError as exc:
454 print "ERROR:"
455 print " REST GET URL: %s" % url
456 # NOTE: exc.fp contains the object with the response payload
457 error_payload = json.loads(exc.fp.read())
458 print " REST Error Code: %s" % (error_payload['code'])
459 print " REST Error Summary: %s" % (error_payload['summary'])
460 print " REST Error Description: %s" % (error_payload['formattedDescription'])
461 print " HTTP Error Code: %s" % exc.code
462 print " HTTP Error Reason: %s" % exc.reason
463 except URLError as exc:
464 print "ERROR:"
465 print " REST GET URL: %s" % url
466 print " URL Error Reason: %s" % exc.reason
467
468 if len(parsed_result)==0:
469 return
470 result = json.dumps(parsed_result,indent=4)
471 print(str(result))
472 return result
473
474
475#*********************************************************************
476#*********************************************************************
477# show_intent is a command to show intents.
478# Parameters include intentIP, intentPort, intentURL, and intent_id
479# Based on the url, it will show either high or low intents
480# If intent_id is left blank, it will show all high or all low intents
481# Else it will show the intent with the id
482#*********************************************************************
483#*********************************************************************
484
485
486
487 def show_intent(self,intentIP,intentPort=8080,intentURL="wm/onos/intent",intent_type="high",intent_id="all"):
488 main.log.report("Getting (an) intent(s)")
489 if intent_id=="all":
490 url = "http://%s:%s/%s/%s"%(intentIP,intentPort,intentURL,intent_type)
491 else:
492 url = "http://%s:%s/%s/%s/%s"%(intentIP,intentPort,intentURL,intent_type,intent_id)
493 print(url)
494 parsed_result = []
495 try:
496 response = urllib2.urlopen(url)
497 result = response.read()
498 response.close()
499 if len(result) != 0:
500 parsed_result = json.loads(result)
501 except HTTPError as exc:
502 print "ERROR:"
503 print " REST GET URL: %s" % url
504 # NOTE: exc.fp contains the object with the response payload
505 error_payload = json.loads(exc.fp.read())
506 print " REST Error Code: %s" % (error_payload['code'])
507 print " REST Error Summary: %s" % (error_payload['summary'])
508 print " REST Error Description: %s" % (error_payload['formattedDescription'])
509 print " HTTP Error Code: %s" % exc.code
510 print " HTTP Error Reason: %s" % exc.reason
511 return str(error_payload['code'])
512 except URLError as exc:
513 print "ERROR:"
514 print " REST GET URL: %s" % url
515 print " URL Error Reason: %s" % exc.reason
516 return str(error_payload['code'])
517
518 if len(parsed_result)==0:
519 return
520 result = json.dumps(parsed_result,indent=4)
521 print(str(result))
522 return result
523
524
525#*********************************************************************
526#*********************************************************************
527# del_intent is to delete either all or some or one intents
528# if intent_id is left blank, it will delete all intents
529# else, intent_id should be of the form "intent_id=1,2,3"
530#*********************************************************************
531#*********************************************************************
532
533 def del_intent(self,intentIP,intentPort=8080,intentURL="wm/onos/intent",intent_id="all"):
534 main.log.report("Deleting (an) intent(s)")
535 if intent_id=="all":
536 url = "http://%s:%s/%s/high"%(intentIP,intentPort,intentURL)
537 else:
538 url = "http://%s:%s/%s/high?%s"%(intentIP,intentPort,intentURL,intent_id)
539
540 print(url)
541
542 parsed_result = []
543 try:
544 request = urllib2.Request(url)
545 request.get_method = lambda: 'DELETE'
546 response = urllib2.urlopen(request)
547 result = response.read()
548 response.close()
549 if len(result) != 0:
550 parsed_result = json.loads(result)
551 print(parsed_result)
552 except HTTPError as exc:
553 print "ERROR:"
554 print " REST DELETE URL: %s" % url
555 # NOTE: exc.fp contains the object with the response payload
556 error_payload = json.loads(exc.fp.read())
557 print " REST Error Code: %s" % (error_payload['code'])
558 print " REST Error Summary: %s" % (error_payload['summary'])
559 print " REST Error Description: %s" % (error_payload['formattedDescription'])
560 print " HTTP Error Code: %s" % exc.code
561 print " HTTP Error Reason: %s" % exc.reason
562 except URLError as exc:
563 print "ERROR:"
564 print " REST DELETE URL: %s" % url
565 print " URL Error Reason: %s" % exc.reason
566 return result
567
568#*********************************************************************
569#*********************************************************************
570# add_intent will add a single intent by using dpids and macs.
571#*********************************************************************
572#*********************************************************************
573
574
575 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 -0700576 "CLI command callback: set intent"
577
578 intents = []
579 oper = {}
580 # Create the POST payload
581 oper['intentId'] = intent_id
582 oper['intentType'] = intent_type # XXX: Hardcoded
583 oper['staticPath'] = static_path # XXX: Hardcoded
584 oper['srcSwitchDpid'] = src_dpid
585 oper['srcSwitchPort'] = src_port
586 oper['dstSwitchDpid'] = dst_dpid
587 oper['dstSwitchPort'] = dst_port
588 oper['matchSrcMac'] = src_mac
589 oper['matchDstMac'] = dst_mac
590 intents.append(oper)
admindc1c5072014-06-24 15:57:19 -0700591 url = "http://%s:%s/%s/high"%(intentIP,intentPort,intentURL)
admin2a9548d2014-06-17 14:08:07 -0700592 parsed_result = []
593 data_json = json.dumps(intents)
594 try:
595 request = urllib2.Request(url,data_json)
596 request.add_header("Content-Type", "application/json")
597 response=urllib2.urlopen(request)
598 result = response.read()
599 response.close()
600 if len(result) != 0:
601 parsed_result = json.loads(result)
602 except HTTPError as exc:
603 print "ERROR:"
604 print " REST GET URL: %s" % url
605 # NOTE: exc.fp contains the object with the response payload
606 error_payload = json.loads(exc.fp.read())
607 print " REST Error Code: %s" % (error_payload['code'])
608 print " REST Error Summary: %s" % (error_payload['summary'])
609 print " REST Error Description: %s" % (error_payload['formattedDescription'])
610 print " HTTP Error Code: %s" % exc.code
611 print " HTTP Error Reason: %s" % exc.reason
612 except URLError as exc:
613 print "ERROR:"
614 print " REST GET URL: %s" % url
615 print " URL Error Reason: %s" % exc.reason
admindc1c5072014-06-24 15:57:19 -0700616 return result
admin2a9548d2014-06-17 14:08:07 -0700617
618
619
620
621 def add_intents(self):
622 main.log.info("Sending new intents to ONOS")
adminc6cfc1c2014-04-21 13:55:21 -0700623 self.handle.sendline("cd "+self.home+ "/scripts")
624 self.handle.expect("scripts")
admin2a9548d2014-06-17 14:08:07 -0700625 main.log.info("Adding intents")
adminc6cfc1c2014-04-21 13:55:21 -0700626 self.handle.sendline("./pyintents.py")
Jon Hall9c6e2c02014-05-02 10:18:53 -0700627 self.handle.expect(["$",pexpect.EOF,pexpect.TIMEOUT])
628 response = self.handle.before
adminc6cfc1c2014-04-21 13:55:21 -0700629 self.handle.sendline("cd "+self.home)
630 return main.TRUE
631
admin2a9548d2014-06-17 14:08:07 -0700632 def rm_intents(self):
633 main.log.info("Deleteing Intents from ONOS")
adminc6cfc1c2014-04-21 13:55:21 -0700634 self.handle.sendline("cd "+self.home+ "/scripts")
635 self.handle.expect("scripts")
admin2a9548d2014-06-17 14:08:07 -0700636 main.log.info("Deleting Intnents")
adminc6cfc1c2014-04-21 13:55:21 -0700637 self.handle.sendline("./rmpyintents.py")
Jon Hall9c6e2c02014-05-02 10:18:53 -0700638 self.handle.expect(["$",pexpect.EOF,pexpect.TIMEOUT])
639 response = self.handle.before
adminc6cfc1c2014-04-21 13:55:21 -0700640 self.handle.sendline("cd "+self.home)
641 return main.TRUE
642
admin2a9548d2014-06-17 14:08:07 -0700643 def purge_intents(self):
Jon Hall265149f2014-04-25 13:39:52 -0700644 main.log.info("Purging dead intents")
645 self.handle.sendline("cd "+self.home+ "/scripts")
646 self.handle.expect("scripts")
admin2a9548d2014-06-17 14:08:07 -0700647 main.log.info("Sending Purge Intent Rest call to ONOS")
Jon Hall265149f2014-04-25 13:39:52 -0700648 self.handle.sendline("./purgeintents.py")
649 self.handle.sendline("cd "+self.home)
650 return main.TRUE
adminc6cfc1c2014-04-21 13:55:21 -0700651
652
653
Jon Hall4a2b0482014-04-18 16:29:26 -0700654 def add_flow(self, testONip, user = "admin", password = "", flowDef = "/flowdef.txt"):
Jon Halld8dc5772014-04-08 16:26:29 -0700655 '''
656 Copies the flowdef file from TestStation -> ONOS machine
657 Then runs ./add_flow.py to add the flows to ONOS
658 '''
Jon Hallf89c8552014-04-02 13:14:06 -0700659 try:
660 main.log.info("Adding Flows...")
661 self.handle.sendline("scp %s@%s:%s /tmp/flowtmp" %(user,testONip,flowDef))
662 i=self.handle.expect(['[pP]assword:', '100%', pexpect.TIMEOUT],30)
663 if(i==0):
664 self.handle.sendline("%s" %(password))
665 self.handle.sendline("")
666 self.handle.expect("100%")
667 self.handle.expect("\$", 30)
668 self.handle.sendline(self.home + "/web/add_flow.py -m onos -f /tmp/flowtmp")
669 self.handle.expect("\$", 1000)
670 main.log.info("Flows added")
671 return main.TRUE
672
673 elif(i==1):
674 self.handle.sendline("")
675 self.handle.expect("\$", 10)
676 self.handle.sendline( self.home + "/web/add_flow.py -m onos -f /tmp/flowtmp")
677 self.handle.expect("\$", 1000)
678 main.log.info("Flows added")
679 return main.TRUE
680
681 elif(i==2):
682 main.log.error("Flow Def file SCP Timed out...")
683 return main.FALSE
684
685 else:
686 main.log.error("Failed to add flows...")
James Leec9cacaf2014-04-08 09:17:39 -0700687 return main.FALSE
Jon Hallae05dc22014-04-16 10:56:28 -0700688 except pexpect.EOF:
689 main.log.error(self.name + ": EOF exception found")
690 main.log.error(self.name + ": " + self.handle.before)
691 main.cleanup()
692 main.exit()
Jon Hallf89c8552014-04-02 13:14:06 -0700693 except:
694 main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
695 main.log.error( traceback.print_exc() )
696 main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
697 main.cleanup()
698 main.exit()
699
adminbae64d82013-08-01 10:50:15 -0700700
701 def delete_flow(self, *delParams):
Jon Halld8dc5772014-04-08 16:26:29 -0700702 '''
703 Deletes a specific flow, a range of flows, or all flows.
704 '''
Jon Hallf89c8552014-04-02 13:14:06 -0700705 try:
706 if len(delParams)==1:
707 if str(delParams[0])=="all":
708 main.log.info(self.name + ": Deleting ALL flows...")
709 #self.execute(cmd="~/ONOS/scripts/TestON_delete_flow.sh all",prompt="done",timeout=150)
710 self.handle.sendline(self.home + "/web/delete_flow.py all")
711 self.handle.expect("delete_flow")
712 self.handle.expect("\$",1000)
713 main.log.info(self.name + ": Flows deleted")
714 else:
715 main.log.info(self.name + ": Deleting flow "+str(delParams[0])+"...")
716 #self.execute(cmd="~/ONOS/scripts/TestON_delete_flow.sh "+str(delParams[0]),prompt="done",timeout=150)
717 #self.execute(cmd="\n",prompt="\$",timeout=60)
718 self.handle.sendline(self.home +"/web/delete_flow.py %d" % int(delParams[0]))
719 self.handle.expect("delete_flow")
720 self.handle.expect("\$",60)
721 main.log.info(self.name + ": Flow deleted")
722 elif len(delParams)==2:
723 main.log.info(self.name + ": Deleting flows "+str(delParams[0])+" through "+str(delParams[1])+"...")
724 #self.execute(cmd="~/ONOS/scripts/TestON_delete_flow.sh "+str(delParams[0])+" "+str(delParams[1]),prompt="done",timeout=150)
725 #self.execute(cmd="\n",prompt="\$",timeout=60)
726 self.handle.sendline(self.home + "/web/delete_flow.py %d %d" % (int(delParams[0]), int(delParams[1])))
727 self.handle.expect("delete_flow")
728 self.handle.expect("\$",600)
729 main.log.info(self.name + ": Flows deleted")
Jon Hallae05dc22014-04-16 10:56:28 -0700730 except pexpect.EOF:
731 main.log.error(self.name + ": EOF exception found")
732 main.log.error(self.name + ": " + self.handle.before)
733 main.cleanup()
734 main.exit()
Jon Hallf89c8552014-04-02 13:14:06 -0700735 except:
736 main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
737 main.log.error( traceback.print_exc() )
738 main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
739 main.cleanup()
740 main.exit()
adminbae64d82013-08-01 10:50:15 -0700741
742 def check_flow(self):
Jon Halld8dc5772014-04-08 16:26:29 -0700743 '''
744 Calls the ./get_flow.py all and checks:
745 - If each FlowPath has at least one FlowEntry
746 - That there are no "NOT"s found
747 returns TRUE/FALSE
748 '''
Jon Hallf89c8552014-04-02 13:14:06 -0700749 try:
750 flowEntryDetect = 1
751 count = 0
752 self.handle.sendline("clear")
753 time.sleep(1)
754 self.handle.sendline(self.home + "/web/get_flow.py all")
755 self.handle.expect("get_flow")
Jon Hall3bd7c792014-05-30 09:05:21 -0700756 for x in range(15):
Jon Hallf89c8552014-04-02 13:14:06 -0700757 i=self.handle.expect(['FlowPath','FlowEntry','NOT','\$',pexpect.TIMEOUT],timeout=180)
758 if i==0:
759 count = count + 1
760 if flowEntryDetect == 0:
761 main.log.info(self.name + ": FlowPath without FlowEntry")
762 return main.FALSE
763 else:
764 flowEntryDetect = 0
765 elif i==1:
766 flowEntryDetect = 1
767 elif i==2:
768 main.log.error(self.name + ": Found a NOT")
adminbae64d82013-08-01 10:50:15 -0700769 return main.FALSE
Jon Hallf89c8552014-04-02 13:14:06 -0700770 elif i==3:
771 if count == 0:
772 main.log.info(self.name + ": There don't seem to be any flows here...")
773 return main.FALSE
774 else:
775 main.log.info(self.name + ": All flows pass")
776 main.log.info(self.name + ": Number of FlowPaths: "+str(count))
777 return main.TRUE
778 elif i==4:
James Leec9cacaf2014-04-08 09:17:39 -0700779 main.log.error(self.name + ":Check_flow() - Command Timeout!")
Jon Hallf89c8552014-04-02 13:14:06 -0700780 return main.FALSE
Jon Hallae05dc22014-04-16 10:56:28 -0700781 except pexpect.EOF:
782 main.log.error(self.name + ": EOF exception found")
783 main.log.error(self.name + ": " + self.handle.before)
784 main.cleanup()
785 main.exit()
Jon Hallf89c8552014-04-02 13:14:06 -0700786 except:
787 main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
788 main.log.error( traceback.print_exc() )
789 main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
790 main.cleanup()
791 main.exit()
adminbae64d82013-08-01 10:50:15 -0700792
793 def get_flow(self, *flowParams):
Jon Halld8dc5772014-04-08 16:26:29 -0700794 '''
795 Returns verbose output of ./get_flow.py
796 '''
797 try:
798 if len(flowParams)==1:
799 if str(flowParams[0])=="all":
800 self.execute(cmd="\n",prompt="\$",timeout=60)
801 main.log.info(self.name + ": Getting all flow data...")
802 data = self.execute(cmd=self.home + "/scripts/TestON_get_flow.sh all",prompt="done",timeout=150)
803 self.execute(cmd="\n",prompt="\$",timeout=60)
804 return data
805 else:
806 main.log.info(self.name + ": Retrieving flow "+str(flowParams[0])+" data...")
807 data = self.execute(cmd=self.home +"/scripts/TestON_get_flow.sh "+str(flowParams[0]),prompt="done",timeout=150)
808 self.execute(cmd="\n",prompt="\$",timeout=60)
809 return data
810 elif len(flowParams)==5:
811 main.log.info(self.name + ": Retrieving flow installer data...")
812 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)
813 self.execute(cmd="\n",prompt="\$",timeout=60)
814 return data
815 elif len(flowParams)==4:
816 main.log.info(self.name + ": Retrieving flow endpoints...")
817 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)
818 self.execute(cmd="\n",prompt="\$",timeout=60)
819 return data
Jon Hallae05dc22014-04-16 10:56:28 -0700820 except pexpect.EOF:
821 main.log.error(self.name + ": EOF exception found")
822 main.log.error(self.name + ": " + self.handle.before)
823 main.cleanup()
824 main.exit()
Jon Halld8dc5772014-04-08 16:26:29 -0700825 except:
Jon Hallf89c8552014-04-02 13:14:06 -0700826 main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
827 main.log.error( traceback.print_exc() )
828 main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
829 main.cleanup()
830 main.exit()
adminbae64d82013-08-01 10:50:15 -0700831
832
Jon Hall2f42a672014-05-28 10:13:18 -0700833# http://localhost:8080/wm/onos/topology/switches
834# http://localhost:8080/wm/onos/topology/links
Jon Hall8060af02014-04-14 14:17:58 -0700835# http://localhost:8080/wm/onos/registry/controllers/json
836# http://localhost:8080/wm/onos/registry/switches/json"
adminbae64d82013-08-01 10:50:15 -0700837
838 def get_json(self, url):
Jon Halld8dc5772014-04-08 16:26:29 -0700839 '''
840 Helper functions used to parse the json output of a rest call
841 '''
adminbae64d82013-08-01 10:50:15 -0700842 try:
Jon Hallf89c8552014-04-02 13:14:06 -0700843 try:
844 command = "curl -s %s" % (url)
845 result = os.popen(command).read()
846 parsedResult = json.loads(result)
847 except:
848 print "REST IF %s has issue" % command
849 parsedResult = ""
850
851 if type(parsedResult) == 'dict' and parsedResult.has_key('code'):
852 print "REST %s returned code %s" % (command, parsedResult['code'])
853 parsedResult = ""
James Leec9cacaf2014-04-08 09:17:39 -0700854 return parsedResult
Jon Hallae05dc22014-04-16 10:56:28 -0700855 except pexpect.EOF:
856 main.log.error(self.name + ": EOF exception found")
857 main.log.error(self.name + ": " + self.handle.before)
858 main.cleanup()
859 main.exit()
adminbae64d82013-08-01 10:50:15 -0700860 except:
Jon Hallf89c8552014-04-02 13:14:06 -0700861 main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
862 main.log.error( traceback.print_exc() )
863 main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
864 main.cleanup()
865 main.exit()
adminbae64d82013-08-01 10:50:15 -0700866
Jon Hallf89c8552014-04-02 13:14:06 -0700867 def check_switch(self,RestIP,correct_nr_switch, RestPort ="8080" ):
Jon Halld8dc5772014-04-08 16:26:29 -0700868 '''
869 Used by check_status
870 '''
Jon Hallf89c8552014-04-02 13:14:06 -0700871 try:
872 buf = ""
873 retcode = 0
admin2e131ab2014-05-28 10:03:42 -0700874 url="http://%s:%s/wm/onos/topology/switches" % (RestIP, RestPort)
Jon Hallf89c8552014-04-02 13:14:06 -0700875 parsedResult = self.get_json(url)
876 if parsedResult == "":
877 retcode = 1
878 return (retcode, "Rest API has an issue")
879 url = "http://%s:%s/wm/onos/registry/switches/json" % (RestIP, RestPort)
880 registry = self.get_json(url)
881
882 if registry == "":
883 retcode = 1
884 return (retcode, "Rest API has an issue")
885
886 cnt = 0
887 active = 0
adminbae64d82013-08-01 10:50:15 -0700888
Jon Hallf89c8552014-04-02 13:14:06 -0700889 for s in parsedResult:
890 cnt += 1
James Leec9cacaf2014-04-08 09:17:39 -0700891 if s['state'] == "ACTIVE":
Jon Hallf89c8552014-04-02 13:14:06 -0700892 active += 1
adminbae64d82013-08-01 10:50:15 -0700893
Jon Hallf89c8552014-04-02 13:14:06 -0700894 buf += "switch: network %d : %d switches %d active\n" % (0+1, cnt, active)
895 if correct_nr_switch != cnt:
896 buf += "switch fail: network %d should have %d switches but has %d\n" % (1, correct_nr_switch, cnt)
897 retcode = 1
adminbae64d82013-08-01 10:50:15 -0700898
Jon Hallf89c8552014-04-02 13:14:06 -0700899 if correct_nr_switch != active:
900 buf += "switch fail: network %d should have %d active switches but has %d\n" % (1, correct_nr_switch, active)
901 retcode = 1
902
903 return (retcode, buf)
Jon Hallae05dc22014-04-16 10:56:28 -0700904 except pexpect.EOF:
905 main.log.error(self.name + ": EOF exception found")
906 main.log.error(self.name + ": " + self.handle.before)
907 main.cleanup()
908 main.exit()
Jon Hallf89c8552014-04-02 13:14:06 -0700909 except:
910 main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
911 main.log.error( traceback.print_exc() )
912 main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
913 main.cleanup()
914 main.exit()
adminbae64d82013-08-01 10:50:15 -0700915
Jon Hallf89c8552014-04-02 13:14:06 -0700916 def check_link(self,RestIP, nr_links, RestPort = "8080"):
Jon Halld8dc5772014-04-08 16:26:29 -0700917 '''
918 Used by check_status
919 '''
Jon Hallf89c8552014-04-02 13:14:06 -0700920 try:
921 buf = ""
922 retcode = 0
923
admin2e131ab2014-05-28 10:03:42 -0700924 url = "http://%s:%s/wm/onos/topology/links" % (RestIP, RestPort)
Jon Hallf89c8552014-04-02 13:14:06 -0700925 parsedResult = self.get_json(url)
926
927 if parsedResult == "":
928 retcode = 1
929 return (retcode, "Rest API has an issue")
930
931 buf += "link: total %d links (correct : %d)\n" % (len(parsedResult), nr_links)
932 intra = 0
933 interlink=0
934
935 for s in parsedResult:
James Leec9cacaf2014-04-08 09:17:39 -0700936 intra = intra + 1
Jon Hallf89c8552014-04-02 13:14:06 -0700937
938 if intra != nr_links:
939 buf += "link fail\n"
940 retcode = 1
941
942 return (retcode, buf)
Jon Hallae05dc22014-04-16 10:56:28 -0700943 except pexpect.EOF:
944 main.log.error(self.name + ": EOF exception found")
945 main.log.error(self.name + ": " + self.handle.before)
946 main.cleanup()
947 main.exit()
Jon Hallf89c8552014-04-02 13:14:06 -0700948 except:
949 main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
950 main.log.error( traceback.print_exc() )
951 main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
952 main.cleanup()
953 main.exit()
adminbae64d82013-08-01 10:50:15 -0700954
Jon Hallf89c8552014-04-02 13:14:06 -0700955 def check_status_report(self, ip, numoswitch, numolink, port="8080"):
Jon Halld8dc5772014-04-08 16:26:29 -0700956 '''
957 Checks the number of swithes & links that ONOS sees against the supplied values.
958 Writes to the report log.
959 '''
Jon Hallf89c8552014-04-02 13:14:06 -0700960 try:
James Leec9cacaf2014-04-08 09:17:39 -0700961 main.log.info(self.name + ": Making some rest calls...")
Jon Hallf89c8552014-04-02 13:14:06 -0700962 switch = self.check_switch(ip, int(numoswitch), port)
963 link = self.check_link(ip, int(numolink), port)
964 value = switch[0]
965 value += link[0]
966 main.log.report( self.name + ": \n-----\n%s%s-----\n" % ( switch[1], link[1]) )
967 if value != 0:
968 return main.FALSE
James Leec9cacaf2014-04-08 09:17:39 -0700969 else:
Jon Hallf89c8552014-04-02 13:14:06 -0700970 # "PASS"
971 return main.TRUE
Jon Hallae05dc22014-04-16 10:56:28 -0700972 except pexpect.EOF:
973 main.log.error(self.name + ": EOF exception found")
974 main.log.error(self.name + ": " + self.handle.before)
975 main.cleanup()
976 main.exit()
Jon Hallf89c8552014-04-02 13:14:06 -0700977 except:
978 main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
979 main.log.error( traceback.print_exc() )
980 main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
981 main.cleanup()
982 main.exit()
adminbae64d82013-08-01 10:50:15 -0700983
Jon Hallf89c8552014-04-02 13:14:06 -0700984 def check_status(self, ip, numoswitch, numolink, port = "8080"):
Jon Halld8dc5772014-04-08 16:26:29 -0700985 '''
986 Checks the number of swithes & links that ONOS sees against the supplied values.
987 Writes to the main log.
988 '''
Jon Hallf89c8552014-04-02 13:14:06 -0700989 try:
James Leec9cacaf2014-04-08 09:17:39 -0700990 main.log.info(self.name + ": Making some rest calls...")
Jon Hallf89c8552014-04-02 13:14:06 -0700991 switch = self.check_switch(ip, int(numoswitch), port)
992 link = self.check_link(ip, int(numolink), port)
993 value = switch[0]
994 value += link[0]
995 main.log.info(self.name + ": \n-----\n%s%s-----\n" % ( switch[1], link[1]) )
996 if value != 0:
997 return main.FALSE
James Leec9cacaf2014-04-08 09:17:39 -0700998 else:
Jon Hallf89c8552014-04-02 13:14:06 -0700999 # "PASS"
1000 return main.TRUE
Jon Hallae05dc22014-04-16 10:56:28 -07001001 except pexpect.EOF:
1002 main.log.error(self.name + ": EOF exception found")
1003 main.log.error(self.name + ": " + self.handle.before)
1004 main.cleanup()
1005 main.exit()
Jon Hallf89c8552014-04-02 13:14:06 -07001006 except:
1007 main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
1008 main.log.error( traceback.print_exc() )
1009 main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
1010 main.cleanup()
1011 main.exit()
adminbae64d82013-08-01 10:50:15 -07001012
adminbae64d82013-08-01 10:50:15 -07001013 def check_for_no_exceptions(self):
Jon Halld8dc5772014-04-08 16:26:29 -07001014 '''
1015 TODO: Rewrite
1016 Used by CassndraCheck.py to scan ONOS logs for Exceptions
1017 '''
Jon Hallf89c8552014-04-02 13:14:06 -07001018 try:
1019 self.handle.sendline("dsh 'grep Exception ~/ONOS/onos-logs/onos.*.log'")
James Leec9cacaf2014-04-08 09:17:39 -07001020 self.handle.expect("\$ dsh")
Jon Hallf89c8552014-04-02 13:14:06 -07001021 self.handle.expect("\$")
1022 output = self.handle.before
James Leec9cacaf2014-04-08 09:17:39 -07001023 main.log.info(self.name + ": " + output )
Jon Hallf89c8552014-04-02 13:14:06 -07001024 if re.search("Exception",output):
1025 return main.FALSE
1026 else :
1027 return main.TRUE
Jon Hallae05dc22014-04-16 10:56:28 -07001028 except pexpect.EOF:
1029 main.log.error(self.name + ": EOF exception found")
1030 main.log.error(self.name + ": " + self.handle.before)
1031 main.cleanup()
1032 main.exit()
Jon Hallf89c8552014-04-02 13:14:06 -07001033 except:
1034 main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
1035 main.log.error( traceback.print_exc() )
1036 main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
1037 main.cleanup()
1038 main.exit()
1039
1040
admine0eeea22014-04-14 10:22:46 -07001041 def git_pull(self, comp1=""):
Jon Halld8dc5772014-04-08 16:26:29 -07001042 '''
Jon Halld8dc5772014-04-08 16:26:29 -07001043 Assumes that "git pull" works without login
admine0eeea22014-04-14 10:22:46 -07001044
1045 This function will perform a git pull on the ONOS instance.
1046 If used as git_pull("NODE") it will do git pull + NODE. This is
1047 for the purpose of pulling from other nodes if necessary.
1048
1049 Otherwise, this function will perform a git pull in the
1050 ONOS repository. If it has any problems, it will return main.ERROR
1051 If it successfully does a git_pull, it will return a 1.
1052 If it has no updates, it will return a 0.
1053
Jon Halld8dc5772014-04-08 16:26:29 -07001054 '''
Jon Hallae05dc22014-04-16 10:56:28 -07001055 try:
Jon Halle80ef8c2014-04-29 15:29:13 -07001056 # main.log.info(self.name + ": Stopping ONOS")
1057 #self.stop()
Jon Hallae05dc22014-04-16 10:56:28 -07001058 self.handle.sendline("cd " + self.home)
1059 self.handle.expect("ONOS\$")
1060 if comp1=="":
1061 self.handle.sendline("git pull")
1062 else:
1063 self.handle.sendline("git pull " + comp1)
1064
1065 uptodate = 0
Jon Hall5a8aac62014-06-03 09:30:21 -07001066 i=self.handle.expect(['fatal','Username\sfor\s(.*):\s','Unpacking\sobjects',pexpect.TIMEOUT,'Already up-to-date','Aborting','You\sare\snot\scurrently\son\sa\sbranch'],timeout=1700)
Jon Hallae05dc22014-04-16 10:56:28 -07001067 #debug
1068 #main.log.report(self.name +": \n"+"git pull response: " + str(self.handle.before) + str(self.handle.after))
1069 if i==0:
1070 main.log.error(self.name + ": Git pull had some issue...")
1071 return main.ERROR
1072 elif i==1:
1073 main.log.error(self.name + ": Git Pull Asking for username!!! BADD!")
1074 return main.ERROR
1075 elif i==2:
1076 main.log.info(self.name + ": Git Pull - pulling repository now")
1077 self.handle.expect("ONOS\$", 120)
1078 return 0
1079 elif i==3:
1080 main.log.error(self.name + ": Git Pull - TIMEOUT")
1081 return main.ERROR
1082 elif i==4:
1083 main.log.info(self.name + ": Git Pull - Already up to date")
1084 return 1
1085 elif i==5:
1086 main.log.info(self.name + ": Git Pull - Aborting... Are there conflicting git files?")
1087 return main.ERROR
Jon Hall5a8aac62014-06-03 09:30:21 -07001088 elif i==6:
1089 main.log.info(self.name + ": Git Pull - You are not currently on a branch so git pull failed!")
1090 return main.ERROR
Jon Hallae05dc22014-04-16 10:56:28 -07001091 else:
1092 main.log.error(self.name + ": Git Pull - Unexpected response, check for pull errors")
1093 return main.ERROR
1094 except pexpect.EOF:
1095 main.log.error(self.name + ": EOF exception found")
1096 main.log.error(self.name + ": " + self.handle.before)
1097 main.cleanup()
1098 main.exit()
1099 except:
1100 main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
1101 main.log.error( traceback.print_exc() )
1102 main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
1103 main.cleanup()
1104 main.exit()
admine0eeea22014-04-14 10:22:46 -07001105#********************************************************
1106
1107
admin7373a812014-04-16 09:49:02 -07001108 def git_compile(self):
Jon Hallae05dc22014-04-16 10:56:28 -07001109 '''
1110 Compiles ONOS
1111 First runs mvn clean then mvn compile
1112 '''
1113 try:
1114 main.log.info(self.name + ": mvn clean")
admin8fc02822014-04-16 13:31:23 -07001115 self.handle.sendline("cd " + self.home)
Jon Hallae05dc22014-04-16 10:56:28 -07001116 self.handle.sendline("mvn clean")
1117 while 1:
Jon Hall1636f942014-04-17 10:07:23 -07001118 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 -07001119 if i == 0:
Jon Hall1636f942014-04-17 10:07:23 -07001120 main.log.error(self.name + ":There is insufficient memory for the Java Runtime Environment to continue.")
Jon Hallae05dc22014-04-16 10:56:28 -07001121 return main.FALSE
1122 elif i == 1:
Jon Hall1636f942014-04-17 10:07:23 -07001123 main.log.error(self.name + ": Clean failure!")
1124 return main.FALSE
Jon Hallae05dc22014-04-16 10:56:28 -07001125 elif i == 2:
Jon Hall1636f942014-04-17 10:07:23 -07001126 main.log.info(self.name + ": Clean success!")
1127 elif i == 3:
admin8fc02822014-04-16 13:31:23 -07001128 main.log.info(self.name + ": Clean complete")
Jon Hallae05dc22014-04-16 10:56:28 -07001129 break;
Jon Hall1636f942014-04-17 10:07:23 -07001130 elif i == 4:
Jon Hallae05dc22014-04-16 10:56:28 -07001131 main.log.error(self.name + ": mvn clean TIMEOUT!")
1132 return main.FALSE
Jon Hall1636f942014-04-17 10:07:23 -07001133 else:
1134 main.log.error(self.name + ": unexpected response from mvn clean")
1135 return main.FALSE
Jon Hallae05dc22014-04-16 10:56:28 -07001136
1137 main.log.info(self.name + ": mvn compile")
1138 self.handle.sendline("mvn compile")
1139 while 1:
Jon Hall1636f942014-04-17 10:07:23 -07001140 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 -07001141 if i == 0:
Jon Hall1636f942014-04-17 10:07:23 -07001142 main.log.error(self.name + ":There is insufficient memory for the Java Runtime Environment to continue.")
1143 return main.FALSE
1144 if i == 1:
Jon Hallae05dc22014-04-16 10:56:28 -07001145 main.log.error(self.name + ": Build failure!")
1146 return main.FALSE
Jon Hall1636f942014-04-17 10:07:23 -07001147 elif i == 2:
Jon Hallae05dc22014-04-16 10:56:28 -07001148 main.log.info(self.name + ": Build success!")
Jon Hall1636f942014-04-17 10:07:23 -07001149 elif i == 3:
Jon Hallae05dc22014-04-16 10:56:28 -07001150 main.log.info(self.name + ": Build complete")
Jon Hall010f5412014-05-21 15:10:12 -07001151 self.handle.expect("\$", timeout=60)
Jon Hallae05dc22014-04-16 10:56:28 -07001152 return main.TRUE
Jon Hall1636f942014-04-17 10:07:23 -07001153 elif i == 4:
Jon Hallae05dc22014-04-16 10:56:28 -07001154 main.log.error(self.name + ": mvn compile TIMEOUT!")
1155 return main.FALSE
1156 else:
Jon Hall1636f942014-04-17 10:07:23 -07001157 main.log.error(self.name + ": unexpected response from mvn compile")
1158 return main.FALSE
Jon Hallae05dc22014-04-16 10:56:28 -07001159 except pexpect.EOF:
1160 main.log.error(self.name + ": EOF exception found")
1161 main.log.error(self.name + ": " + self.handle.before)
1162 main.cleanup()
1163 main.exit()
1164 except:
1165 main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
1166 main.log.error( traceback.print_exc() )
1167 main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
1168 main.cleanup()
1169 main.exit()
admin4a58db92013-09-30 12:04:54 -07001170
Jon Hallf89c8552014-04-02 13:14:06 -07001171 def tcpdump(self, intf = "eth0"):
Jon Hallae05dc22014-04-16 10:56:28 -07001172 '''
1173 Runs tpdump on an intferface and saves in onos-logs under the ONOS home directory
1174 intf can be specified, or the default eth0 is used
1175 '''
Jon Hallf89c8552014-04-02 13:14:06 -07001176 try:
1177 self.handle.sendline("")
1178 self.handle.expect("\$")
Jon Hall26f316b2014-04-11 11:21:25 -07001179 self.handle.sendline("sudo tcpdump -n -i "+ intf + " -s0 -w " + self.home +"/onos-logs/tcpdump &")
Jon Hallf89c8552014-04-02 13:14:06 -07001180 i=self.handle.expect(['No\ssuch\device','listening\son',pexpect.TIMEOUT],timeout=10)
1181 if i == 0:
1182 main.log.error(self.name + ": tcpdump - No such device exists. tcpdump attempted on: " + intf)
1183 return main.FALSE
James Leec9cacaf2014-04-08 09:17:39 -07001184 elif i == 1:
Jon Hallf89c8552014-04-02 13:14:06 -07001185 main.log.info(self.name + ": tcpdump started on " + intf)
1186 return main.TRUE
James Leec9cacaf2014-04-08 09:17:39 -07001187 elif i == 2:
Jon Hallf89c8552014-04-02 13:14:06 -07001188 main.log.error(self.name + ": tcpdump command timed out! Check interface name, given interface was: " + intf)
1189 return main.FALSE
1190 else:
1191 main.log.error(self.name + ": tcpdump - unexpected response")
1192 return main.FALSE
Jon Hallae05dc22014-04-16 10:56:28 -07001193 except pexpect.EOF:
1194 main.log.error(self.name + ": EOF exception found")
1195 main.log.error(self.name + ": " + self.handle.before)
1196 main.cleanup()
1197 main.exit()
Jon Hallf89c8552014-04-02 13:14:06 -07001198 except:
1199 main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
1200 main.log.error( traceback.print_exc() )
1201 main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
1202 main.cleanup()
1203 main.exit()
1204
admin4a58db92013-09-30 12:04:54 -07001205 def kill_tcpdump(self):
Jon Hallae05dc22014-04-16 10:56:28 -07001206 '''
1207 Kills any tcpdump processes running
1208 '''
Jon Hallf89c8552014-04-02 13:14:06 -07001209 try:
1210 self.handle.sendline("")
1211 self.handle.expect("\$")
1212 self.handle.sendline("sudo kill -9 `ps -ef | grep \"tcpdump -n\" | grep -v grep | awk '{print $2}'`")
Jon Hallae05dc22014-04-16 10:56:28 -07001213 except pexpect.EOF:
1214 main.log.error(self.name + ": EOF exception found")
1215 main.log.error(self.name + ": " + self.handle.before)
1216 main.cleanup()
1217 main.exit()
Jon Hallf89c8552014-04-02 13:14:06 -07001218 except:
1219 main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
1220 main.log.error( traceback.print_exc() )
1221 main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
1222 main.cleanup()
1223 main.exit()
1224
Jon Hallf15f7852014-05-20 10:37:23 -07001225 def find_host(self,RestIP,RestPort,RestAPI,hostMAC):
admin2a9548d2014-06-17 14:08:07 -07001226 retcode = 0 # number of hosts found with given MAC
1227 retswitch = [] # Switch DPID's of hosts found with MAC
1228 retport = [] # Switch port connected to to hosts found with MAC
Jon Hallf15f7852014-05-20 10:37:23 -07001229 foundHost = []
Jon Hallf89c8552014-04-02 13:14:06 -07001230 try:
Jon Hall2f42a672014-05-28 10:13:18 -07001231 ##### device rest API is: 'host:8080/wm/onos/topology/switches' ###
Jon Hallf89c8552014-04-02 13:14:06 -07001232 url ="http://%s:%s%s" %(RestIP,RestPort,RestAPI)
1233
1234 try:
1235 command = "curl -s %s" % (url)
1236 result = os.popen(command).read()
1237 parsedResult = json.loads(result)
1238 # print parsedResult
1239 except:
1240 print "REST IF %s has issue" % command
1241 parsedResult = ""
1242
1243 if parsedResult == "":
Jon Hallf15f7852014-05-20 10:37:23 -07001244 return (retcode, "Rest API has an error", retport)
Jon Hallf89c8552014-04-02 13:14:06 -07001245 else:
Jon Hallf15f7852014-05-20 10:37:23 -07001246 for host in enumerate(parsedResult):
1247 print host
1248 if (host[1] != []):
1249 try:
1250 foundHost = host[1]['mac']
1251 except:
1252 print "Error in detecting MAC address."
1253 print foundHost
1254 print hostMAC
1255 if foundHost == hostMAC:
1256 for switch in enumerate(host[1]['attachmentPoints']):
1257 retswitch.append(switch[1]['dpid'])
1258 retport.append(switch[1]['port'])
1259 retcode = retcode +1
1260 foundHost =''
1261 '''
Jon Hallf89c8552014-04-02 13:14:06 -07001262 for switch in enumerate(parsedResult):
1263 for port in enumerate(switch[1]['ports']):
admin2a9548d2014-06-17 14:08:07 -07001264 if ( port[1]['hosts'] != [] ):
Jon Hallf89c8552014-04-02 13:14:06 -07001265 try:
admin2a9548d2014-06-17 14:08:07 -07001266 foundHost = port[1]['hosts'][0]['ipv4addresses'][0]['ipv4']
Jon Hallf89c8552014-04-02 13:14:06 -07001267 except:
Jon Hallf15f7852014-05-20 10:37:23 -07001268 print "Error in detecting MAC address."
1269 if foundHost == hostMAC:
Jon Hallf89c8552014-04-02 13:14:06 -07001270 retswitch.append(switch[1]['dpid'])
1271 retport.append(port[1]['desc'])
admin2a9548d2014-06-17 14:08:07 -07001272 retmac.append(port[1]['hosts'][0]['mac'])
Jon Hallf89c8552014-04-02 13:14:06 -07001273 retcode = retcode +1
Jon Hallf15f7852014-05-20 10:37:23 -07001274 foundHost =''
1275 '''
1276 return(retcode, retswitch, retport)
Jon Hallae05dc22014-04-16 10:56:28 -07001277 except pexpect.EOF:
1278 main.log.error(self.name + ": EOF exception found")
1279 main.log.error(self.name + ": " + self.handle.before)
1280 main.cleanup()
1281 main.exit()
Jon Hallf89c8552014-04-02 13:14:06 -07001282 except:
1283 main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
1284 main.log.error( traceback.print_exc() )
1285 main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
1286 main.cleanup()
1287 main.exit()
SeanCorcoran29b70542014-05-14 14:53:42 -07001288
1289 def check_exceptions(self):
1290 '''
1291 Greps the logs for "xception"
1292 '''
1293 try:
1294 output = ''
1295 self.handle.sendline("")
Jon Halla78cf9a2014-05-16 10:49:30 -07001296 i = self.handle.expect(["\$",pexpect.EOF,pexpect.TIMEOUT])
1297 #main.log.warn("first expect response: " +str(i))
SeanCorcoran29b70542014-05-14 14:53:42 -07001298 self.handle.sendline("cd "+self.home+"/onos-logs")
Jon Hall724a2f42014-06-23 16:04:22 -07001299 self.handle.sendline("zgrep \"xception\" *")
Jon Halla78cf9a2014-05-16 10:49:30 -07001300 i = self.handle.expect(["\*",pexpect.EOF,pexpect.TIMEOUT])
1301 #main.log.warn("second expect response: " +str(i))
Jon Hall724a2f42014-06-23 16:04:22 -07001302 i = self.handle.expect(["\$",pexpect.EOF,pexpect.TIMEOUT],timeout=120)
Jon Halla78cf9a2014-05-16 10:49:30 -07001303 #main.log.warn("third expect response: " +str(i))
SeanCorcoran29b70542014-05-14 14:53:42 -07001304 response = self.handle.before
Jon Halla78cf9a2014-05-16 10:49:30 -07001305 count = 0
SeanCorcoran29b70542014-05-14 14:53:42 -07001306 for line in response.splitlines():
1307 if re.search("log:", line):
1308 output +="Exceptions found in " + line + "\n"
Jon Halla78cf9a2014-05-16 10:49:30 -07001309 count +=1
Jon Hall724a2f42014-06-23 16:04:22 -07001310 elif re.search("log\.gz:",line):
1311 output+="Exceptions found in " + line + "\n"
1312 count +=1
SeanCorcoran29b70542014-05-14 14:53:42 -07001313 elif re.search("std...:",line):
1314 output+="Exceptions found in " + line + "\n"
Jon Halla78cf9a2014-05-16 10:49:30 -07001315 count +=1
SeanCorcoran29b70542014-05-14 14:53:42 -07001316 else:
1317 pass
1318 #these should be the old logs
admin1723f1c2014-05-19 16:08:39 -07001319 main.log.report(str(count) + " Exceptions were found on "+self.name)
SeanCorcoran29b70542014-05-14 14:53:42 -07001320 return output
1321 except pexpect.TIMEOUT:
1322 main.log.error(self.name + ": Timeout exception found in check_exceptions function")
1323 except pexpect.EOF:
1324 main.log.error(self.name + ": EOF exception found")
1325 main.log.error(self.name + ": " + self.handle.before)
1326 main.cleanup()
1327 main.exit()
1328 except:
1329 main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
1330 main.log.error( traceback.print_exc() )
1331 main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
1332 main.cleanup()
1333 main.exit()