blob: 4eb1660d35a9c3f415cd0a044a7ce56059c635eb [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
adminbae64d82013-08-01 10:50:15 -070028sys.path.append("../")
29from drivers.common.clidriver import CLI
30
31class OnosCliDriver(CLI):
32
33 def __init__(self):
34 super(CLI, self).__init__()
35
36 def connect(self,**connectargs):
Jon Halld8dc5772014-04-08 16:26:29 -070037 '''
38 Creates ssh handle for ONOS.
39 '''
Jon Hallf89c8552014-04-02 13:14:06 -070040 try:
41 for key in connectargs:
admine0eeea22014-04-14 10:22:46 -070042 vars(self)[key] = connectargs[key]
Jon Hallf89c8552014-04-02 13:14:06 -070043 self.home = "~/ONOS"
44 for key in self.options:
admine0eeea22014-04-14 10:22:46 -070045 if key == "home":
46 self.home = self.options['home']
47 break
adminbae64d82013-08-01 10:50:15 -070048
Jon Hallf89c8552014-04-02 13:14:06 -070049
50 self.name = self.options['name']
51 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 -070052
Jon Hallf89c8552014-04-02 13:14:06 -070053 if self.handle:
Jon Hallf89c8552014-04-02 13:14:06 -070054 return self.handle
55 else :
56 main.log.info("NO ONOS HANDLE")
57 return main.FALSE
Jon Hallae05dc22014-04-16 10:56:28 -070058 except pexpect.EOF:
59 main.log.error(self.name + ": EOF exception found")
60 main.log.error(self.name + ": " + self.handle.before)
61 main.cleanup()
62 main.exit()
Jon Hallf89c8552014-04-02 13:14:06 -070063 except:
64 main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
65 main.log.error( traceback.print_exc() )
66 main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
67 main.cleanup()
68 main.exit()
adminbae64d82013-08-01 10:50:15 -070069
70 def start(self):
Jon Halld8dc5772014-04-08 16:26:29 -070071 '''
72 Starts ONOS on remote machine.
73 Returns false if any errors were encountered.
74 '''
James Leec9cacaf2014-04-08 09:17:39 -070075 try:
Jon Hallf89c8552014-04-02 13:14:06 -070076 self.handle.sendline("")
Jon Hallae05dc22014-04-16 10:56:28 -070077 self.handle.expect(["\$",pexpect.EOF,pexpect.TIMEOUT])
Jon Hall4a2b0482014-04-18 16:29:26 -070078 self.handle.sendline("cd "+self.home)
79 self.handle.sendline("./onos.sh core start")
Jon Hallae05dc22014-04-16 10:56:28 -070080 i=self.handle.expect(["STARTED","FAILED",pexpect.EOF,pexpect.TIMEOUT])
81 response = self.handle.before + str(self.handle.after)
Jon Hallf89c8552014-04-02 13:14:06 -070082 if i==0:
Jon Hallae05dc22014-04-16 10:56:28 -070083 j = self.handle.expect(["\$",pexpect.EOF,pexpect.TIMEOUT], timeout=60)
84 if re.search("Killed",response):
85 main.log.warn(self.name + ": Killed existing process")
86 if j==0:
Jon Hallf89c8552014-04-02 13:14:06 -070087 main.log.info(self.name + ": ONOS Started ")
Jon Hallae05dc22014-04-16 10:56:28 -070088 return main.TRUE
89 elif j==1:
90 main.log.error(self.name + ": EOF exception found")
91 main.log.error(self.name + ": " + self.handle.before)
92 main.cleanup()
93 main.exit()
94 elif j==2:
Jon Hallf89c8552014-04-02 13:14:06 -070095 main.log.info(self.name + ": ONOS NOT Started, stuck while waiting for it to start ")
96 return main.FALSE
Jon Hallae05dc22014-04-16 10:56:28 -070097 else:
98 main.log.warn(self.name +": Unexpected response in start")
99 return main.TRUE
Jon Hallf89c8552014-04-02 13:14:06 -0700100 elif i==1:
Jon Hallae05dc22014-04-16 10:56:28 -0700101 main.log.error(self.name + ": ONOS Failed to start")
adminbae64d82013-08-01 10:50:15 -0700102 return main.FALSE
Jon Hallae05dc22014-04-16 10:56:28 -0700103 elif i==2:
104 main.log.error(self.name + ": EOF exception found")
105 main.log.error(self.name + ": " + self.handle.before)
106 main.cleanup()
107 main.exit()
108 elif i==3:
109 main.log.error(self.name + ": ONOS timedout while starting")
110 return main.FALSE
111 else:
112 main.log.error(self.name + ": ONOS start expect script missed something... ")
adminbae64d82013-08-01 10:50:15 -0700113 return main.FALSE
Jon Hallae05dc22014-04-16 10:56:28 -0700114 except pexpect.EOF:
115 main.log.error(self.name + ": EOF exception found")
116 main.log.error(self.name + ": " + self.handle.before)
117 main.cleanup()
118 main.exit()
Jon Hallf89c8552014-04-02 13:14:06 -0700119 except:
120 main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
121 main.log.error( traceback.print_exc() )
122 main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
123 main.cleanup()
124 main.exit()
Jon Halle80ef8c2014-04-29 15:29:13 -0700125
126 def start_all(self):
127 '''
128 starts ZK, RC, and ONOS
129 '''
130 self.handle.sendline("cd "+self.home)
131 self.handle.sendline("./onos.sh start")
132 self.handle.expect("./onos.sh start")
133 self.handle.expect(["\$",pexpect.TIMEOUT])
134
135
136
adminbae64d82013-08-01 10:50:15 -0700137 def start_rest(self):
Jon Halld8dc5772014-04-08 16:26:29 -0700138 '''
139 Starts the rest server on ONOS.
140 '''
Jon Hallf89c8552014-04-02 13:14:06 -0700141 try:
Jon Hall4a2b0482014-04-18 16:29:26 -0700142 self.handle.sendline("cd "+self.home)
143 response = self.execute(cmd= "./start-rest.sh start",prompt="\$",timeout=10)
Jon Hallf89c8552014-04-02 13:14:06 -0700144 if re.search("admin",response):
145 main.log.info(self.name + ": Rest Server Started Successfully")
146 time.sleep(5)
147 return main.TRUE
148 else :
James Leec9cacaf2014-04-08 09:17:39 -0700149 main.log.warn(self.name + ": Failed to start Rest Server")
150 return main.FALSE
Jon Hallae05dc22014-04-16 10:56:28 -0700151 except pexpect.EOF:
152 main.log.error(self.name + ": EOF exception found")
153 main.log.error(self.name + ": " + self.handle.before)
154 main.cleanup()
155 main.exit()
Jon Hallf89c8552014-04-02 13:14:06 -0700156 except:
157 main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
158 main.log.error( traceback.print_exc() )
159 main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
160 main.cleanup()
161 main.exit()
162
adminbae64d82013-08-01 10:50:15 -0700163 def status(self):
Jon Halld8dc5772014-04-08 16:26:29 -0700164 '''
165 Called onos.sh core status and returns TRUE/FALSE accordingly
166 '''
Jon Hallf89c8552014-04-02 13:14:06 -0700167 try:
168 self.execute(cmd="\n",prompt="\$",timeout=10)
Jon Hall4a2b0482014-04-18 16:29:26 -0700169 self.handle.sendline("cd "+self.home)
170 response = self.execute(cmd="./onos.sh core status ",prompt="\d+\sinstance\sof\sonos\srunning",timeout=10)
Jon Hallf89c8552014-04-02 13:14:06 -0700171 self.execute(cmd="\n",prompt="\$",timeout=10)
172 if re.search("1\sinstance\sof\sonos\srunning",response):
173 return main.TRUE
174 elif re.search("0\sinstance\sof\sonos\srunning",response):
175 return main.FALSE
176 else :
177 main.log.info( self.name + " WARNING: status recieved unknown response")
178 return main.FALSE
Jon Hallae05dc22014-04-16 10:56:28 -0700179 except pexpect.EOF:
180 main.log.error(self.name + ": EOF exception found")
181 main.log.error(self.name + ": " + self.handle.before)
182 main.cleanup()
183 main.exit()
Jon Hallf89c8552014-04-02 13:14:06 -0700184 except:
185 main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
186 main.log.error( traceback.print_exc() )
187 main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
188 main.cleanup()
189 main.exit()
190
adminbae64d82013-08-01 10:50:15 -0700191
192 def isup(self):
Jon Halld8dc5772014-04-08 16:26:29 -0700193 '''
194 A more complete check to see if ONOS is up and running properly.
195 First, it checks if the process is up.
196 Second, it reads the logs for "Exception: Connection refused"
197 Third, it makes sure the logs are actually moving.
198 returns TRUE/FALSE accordingly.
199 '''
Jon Hallf89c8552014-04-02 13:14:06 -0700200 try:
201 self.execute(cmd="\n",prompt="\$",timeout=10)
Jon Hall4a2b0482014-04-18 16:29:26 -0700202 self.handle.sendline("cd "+self.home)
203 response = self.execute(cmd= "./onos.sh core status ",prompt="running",timeout=10)
Jon Hallf89c8552014-04-02 13:14:06 -0700204 self.execute(cmd="\n",prompt="\$",timeout=10)
205 tail1 = self.execute(cmd="tail " + self.home + "/onos-logs/onos.*.log",prompt="\$",timeout=10)
206 time.sleep(30)
207 self.execute(cmd="\n",prompt="\$",timeout=10)
208 tail2 = self.execute(cmd="tail " + self.home + "/onos-logs/onos.*.log",prompt="\$",timeout=10)
209 pattern = '(.*)1 instance(.*)'
Jon Halle80ef8c2014-04-29 15:29:13 -0700210 patternUp = 'Sending LLDP out'
Jon Hallf89c8552014-04-02 13:14:06 -0700211 pattern2 = '(.*)Exception: Connection refused(.*)'
212 # if utilities.assert_matches(expect=pattern,actual=response,onpass="ONOS process is running...",onfail="ONOS process not running..."):
213
214 if re.search(pattern, response):
Jon Halle80ef8c2014-04-29 15:29:13 -0700215 if re.search(patternUp,tail2):
216 main.log.info(self.name + ": ONOS process is running...")
217 if tail1 == tail2:
218 main.log.error(self.name + ": ONOS is frozen...")#logs aren't moving
219 return main.FALSE
220 elif re.search( pattern2,tail1 ):
221 main.log.info(self.name + ": Connection Refused found in onos log")
222 return main.FALSE
223 elif re.search( pattern2,tail2 ):
224 main.log.info(self.name + ": Connection Refused found in onos log")
225 return main.FALSE
226 else:
227 main.log.info(self.name + ": Onos log is moving! It's looking good!")
228 return main.TRUE
adminbae64d82013-08-01 10:50:15 -0700229 else:
Jon Hallf89c8552014-04-02 13:14:06 -0700230 main.log.error(self.name + ": ONOS process not running...")
231 return main.FALSE
Jon Hallae05dc22014-04-16 10:56:28 -0700232 except pexpect.EOF:
233 main.log.error(self.name + ": EOF exception found")
234 main.log.error(self.name + ": " + self.handle.before)
235 main.cleanup()
236 main.exit()
Jon Hallf89c8552014-04-02 13:14:06 -0700237 except:
238 main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
239 main.log.error( traceback.print_exc() )
240 main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
241 main.cleanup()
242 main.exit()
adminbae64d82013-08-01 10:50:15 -0700243
Jon Hallf89c8552014-04-02 13:14:06 -0700244
245
James Leec9cacaf2014-04-08 09:17:39 -0700246 def rest_status(self):
Jon Halld8dc5772014-04-08 16:26:29 -0700247 '''
248 Checks if the rest server is running.
249 '''
Jon Hallf89c8552014-04-02 13:14:06 -0700250 try:
251 response = self.execute(cmd= self.home + "/start-rest.sh status ",prompt="running",timeout=10)
252 if re.search("rest\sserver\sis\srunning",response):
253 main.log.info(self.name + ": Rest Server is running")
Jon Hallae05dc22014-04-16 10:56:28 -0700254 return main.TRUE
Jon Hallf89c8552014-04-02 13:14:06 -0700255 elif re.search("rest\sserver\sis\snot\srunning",response):
256 main.log.warn(self.name + ": Rest Server is not Running")
Jon Hallae05dc22014-04-16 10:56:28 -0700257 return main.FALSE
Jon Hallf89c8552014-04-02 13:14:06 -0700258 else :
259 main.log.error(self.name + ": No response" +response)
Jon Hallae05dc22014-04-16 10:56:28 -0700260 return main.FALSE
261 except pexpect.EOF:
262 main.log.error(self.name + ": EOF exception found")
263 main.log.error(self.name + ": " + self.handle.before)
264 main.cleanup()
265 main.exit()
Jon Hallf89c8552014-04-02 13:14:06 -0700266 except:
267 main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
268 main.log.error( traceback.print_exc() )
269 main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
270 main.cleanup()
271 main.exit()
272
273
adminbae64d82013-08-01 10:50:15 -0700274 def stop(self):
Jon Halld8dc5772014-04-08 16:26:29 -0700275 '''
276 Runs ./onos.sh core stop to stop ONOS
277 '''
Jon Hallf89c8552014-04-02 13:14:06 -0700278 try:
279 self.handle.sendline("")
Jon Hallae05dc22014-04-16 10:56:28 -0700280 self.handle.expect(["\$",pexpect.EOF,pexpect.TIMEOUT])
Jon Hall4a2b0482014-04-18 16:29:26 -0700281 self.handle.sendline("cd "+self.home)
282 self.handle.sendline("./onos.sh core stop")
Jon Hallae05dc22014-04-16 10:56:28 -0700283 i=self.handle.expect(["Stop",pexpect.EOF,pexpect.TIMEOUT])
284 self.handle.expect(["\$",pexpect.EOF,pexpect.TIMEOUT], 60)
James Leec9cacaf2014-04-08 09:17:39 -0700285 result = self.handle.before
Jon Hallf89c8552014-04-02 13:14:06 -0700286 if re.search("Killed", result):
287 main.log.info(self.name + ": ONOS Killed Successfully")
288 return main.TRUE
289 else :
290 main.log.warn(self.name + ": ONOS wasn't running")
291 return main.FALSE
Jon Hallae05dc22014-04-16 10:56:28 -0700292 except pexpect.EOF:
293 main.log.error(self.name + ": EOF exception found")
294 main.log.error(self.name + ": " + self.handle.before)
295 main.cleanup()
296 main.exit()
Jon Hallf89c8552014-04-02 13:14:06 -0700297 except:
298 main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
299 main.log.error( traceback.print_exc() )
300 main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
301 main.cleanup()
302 main.exit()
303
adminbae64d82013-08-01 10:50:15 -0700304
305 def rest_stop(self):
Jon Halld8dc5772014-04-08 16:26:29 -0700306 '''
307 Runs ./start-rest.sh stop to stop ONOS rest server
308 '''
Jon Hallf89c8552014-04-02 13:14:06 -0700309 try:
310 response = self.execute(cmd= self.home + "/start-rest.sh stop ",prompt="killing",timeout=10)
311 self.execute(cmd="\n",prompt="\$",timeout=10)
312 if re.search("killing", response):
313 main.log.info(self.name + ": Rest Server Stopped")
314 return main.TRUE
315 else :
316 main.log.error(self.name + ": Failed to Stop, Rest Server is not Running")
317 return main.FALSE
Jon Hallae05dc22014-04-16 10:56:28 -0700318 except pexpect.EOF:
319 main.log.error(self.name + ": EOF exception found")
320 main.log.error(self.name + ": " + self.handle.before)
321 main.cleanup()
322 main.exit()
Jon Hallf89c8552014-04-02 13:14:06 -0700323 except:
324 main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
325 main.log.error( traceback.print_exc() )
326 main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
327 main.cleanup()
328 main.exit()
329
330
adminbae64d82013-08-01 10:50:15 -0700331 def disconnect(self):
Jon Halld8dc5772014-04-08 16:26:29 -0700332 '''
333 Called when Test is complete to disconnect the ONOS handle.
334 '''
adminaeedddd2013-08-02 15:14:15 -0700335 response = ''
336 try:
adminbae64d82013-08-01 10:50:15 -0700337 self.handle.sendline("exit")
adminaeedddd2013-08-02 15:14:15 -0700338 self.handle.expect("closed")
Jon Hallae05dc22014-04-16 10:56:28 -0700339 except pexpect.EOF:
340 main.log.error(self.name + ": EOF exception found")
341 main.log.error(self.name + ": " + self.handle.before)
James Leec9cacaf2014-04-08 09:17:39 -0700342 except:
Jon Hallf89c8552014-04-02 13:14:06 -0700343 main.log.error(self.name + ": Connection failed to the host")
adminbae64d82013-08-01 10:50:15 -0700344 response = main.FALSE
adminaeedddd2013-08-02 15:14:15 -0700345 return response
346
Jon Hall76f2c462014-04-17 11:37:15 -0700347 def print_version(self):
Jon Halld8dc5772014-04-08 16:26:29 -0700348 '''
349 Writes the COMMIT number to the report to be parsed by Jenkins data collecter.
350 '''
Jon Hallf89c8552014-04-02 13:14:06 -0700351 try:
352 self.handle.sendline("export TERM=xterm-256color")
353 self.handle.expect("xterm-256color")
James Leec9cacaf2014-04-08 09:17:39 -0700354 self.handle.expect("\$")
adminf939f8b2014-04-03 17:22:56 -0700355 self.handle.sendline("cd " + self.home + "; git log -1 --pretty=fuller | grep -A 5 \"commit\"; cd \.\.")
Jon Hallf89c8552014-04-02 13:14:06 -0700356 self.handle.expect("cd ..")
357 self.handle.expect("\$")
admine0eeea22014-04-14 10:22:46 -0700358 response=(self.name +": \n"+ str(self.handle.before + self.handle.after))
359 main.log.report(response)
Jon Hall76f2c462014-04-17 11:37:15 -0700360 except pexpect.EOF:
361 main.log.error(self.name + ": EOF exception found")
362 main.log.error(self.name + ": " + self.handle.before)
363 main.cleanup()
364 main.exit()
365 except:
366 main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
367 main.log.error( traceback.print_exc() )
368 main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
369 main.cleanup()
370 def get_version(self):
371 '''
372 Writes the COMMIT number to the report to be parsed by Jenkins data collecter.
373 '''
374 try:
375 self.handle.sendline("export TERM=xterm-256color")
376 self.handle.expect("xterm-256color")
377 self.handle.expect("\$")
378 self.handle.sendline("cd " + self.home + "; git log -1 --pretty=fuller | grep -A 5 \"commit\"; cd \.\.")
379 self.handle.expect("cd ..")
380 self.handle.expect("\$")
381 response=(self.name +": \n"+ str(self.handle.before + self.handle.after))
admine0eeea22014-04-14 10:22:46 -0700382 lines=response.splitlines()
383 for line in lines:
384 print line
385 return lines[2]
Jon Hallae05dc22014-04-16 10:56:28 -0700386 except pexpect.EOF:
387 main.log.error(self.name + ": EOF exception found")
388 main.log.error(self.name + ": " + self.handle.before)
389 main.cleanup()
390 main.exit()
Jon Hallf89c8552014-04-02 13:14:06 -0700391 except:
392 main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
393 main.log.error( traceback.print_exc() )
394 main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
395 main.cleanup()
396 main.exit()
adminbae64d82013-08-01 10:50:15 -0700397
adminc6cfc1c2014-04-21 13:55:21 -0700398 def ad_flow(self):
399 main.log.info("AD_FLOW RUNNING!!!!")
400 self.handle.sendline("cd "+self.home+ "/scripts")
401 self.handle.expect("scripts")
Jon Hall9c6e2c02014-05-02 10:18:53 -0700402 main.log.info("Adding flows")
adminc6cfc1c2014-04-21 13:55:21 -0700403 self.handle.sendline("./pyintents.py")
Jon Hall9c6e2c02014-05-02 10:18:53 -0700404 self.handle.expect(["$",pexpect.EOF,pexpect.TIMEOUT])
405 response = self.handle.before
adminc6cfc1c2014-04-21 13:55:21 -0700406 self.handle.sendline("cd "+self.home)
407 return main.TRUE
408
409 def rm_flow(self):
410 main.log.info("RM_FLOW RUNNING!!!")
411 self.handle.sendline("cd "+self.home+ "/scripts")
412 self.handle.expect("scripts")
Jon Hall9c6e2c02014-05-02 10:18:53 -0700413 main.log.info("Removing flows")
adminc6cfc1c2014-04-21 13:55:21 -0700414 self.handle.sendline("./rmpyintents.py")
Jon Hall9c6e2c02014-05-02 10:18:53 -0700415 self.handle.expect(["$",pexpect.EOF,pexpect.TIMEOUT])
416 response = self.handle.before
adminc6cfc1c2014-04-21 13:55:21 -0700417 self.handle.sendline("cd "+self.home)
418 return main.TRUE
419
Jon Hall265149f2014-04-25 13:39:52 -0700420 def purge(self):
421 main.log.info("Purging dead intents")
422 self.handle.sendline("cd "+self.home+ "/scripts")
423 self.handle.expect("scripts")
424 print("Purging Intents")
425 self.handle.sendline("./purgeintents.py")
426 self.handle.sendline("cd "+self.home)
427 return main.TRUE
adminc6cfc1c2014-04-21 13:55:21 -0700428
429
430
Jon Hall4a2b0482014-04-18 16:29:26 -0700431 def add_flow(self, testONip, user = "admin", password = "", flowDef = "/flowdef.txt"):
Jon Halld8dc5772014-04-08 16:26:29 -0700432 '''
433 Copies the flowdef file from TestStation -> ONOS machine
434 Then runs ./add_flow.py to add the flows to ONOS
435 '''
Jon Hallf89c8552014-04-02 13:14:06 -0700436 try:
437 main.log.info("Adding Flows...")
438 self.handle.sendline("scp %s@%s:%s /tmp/flowtmp" %(user,testONip,flowDef))
439 i=self.handle.expect(['[pP]assword:', '100%', pexpect.TIMEOUT],30)
440 if(i==0):
441 self.handle.sendline("%s" %(password))
442 self.handle.sendline("")
443 self.handle.expect("100%")
444 self.handle.expect("\$", 30)
445 self.handle.sendline(self.home + "/web/add_flow.py -m onos -f /tmp/flowtmp")
446 self.handle.expect("\$", 1000)
447 main.log.info("Flows added")
448 return main.TRUE
449
450 elif(i==1):
451 self.handle.sendline("")
452 self.handle.expect("\$", 10)
453 self.handle.sendline( self.home + "/web/add_flow.py -m onos -f /tmp/flowtmp")
454 self.handle.expect("\$", 1000)
455 main.log.info("Flows added")
456 return main.TRUE
457
458 elif(i==2):
459 main.log.error("Flow Def file SCP Timed out...")
460 return main.FALSE
461
462 else:
463 main.log.error("Failed to add flows...")
James Leec9cacaf2014-04-08 09:17:39 -0700464 return main.FALSE
Jon Hallae05dc22014-04-16 10:56:28 -0700465 except pexpect.EOF:
466 main.log.error(self.name + ": EOF exception found")
467 main.log.error(self.name + ": " + self.handle.before)
468 main.cleanup()
469 main.exit()
Jon Hallf89c8552014-04-02 13:14:06 -0700470 except:
471 main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
472 main.log.error( traceback.print_exc() )
473 main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
474 main.cleanup()
475 main.exit()
476
adminbae64d82013-08-01 10:50:15 -0700477
478 def delete_flow(self, *delParams):
Jon Halld8dc5772014-04-08 16:26:29 -0700479 '''
480 Deletes a specific flow, a range of flows, or all flows.
481 '''
Jon Hallf89c8552014-04-02 13:14:06 -0700482 try:
483 if len(delParams)==1:
484 if str(delParams[0])=="all":
485 main.log.info(self.name + ": Deleting ALL flows...")
486 #self.execute(cmd="~/ONOS/scripts/TestON_delete_flow.sh all",prompt="done",timeout=150)
487 self.handle.sendline(self.home + "/web/delete_flow.py all")
488 self.handle.expect("delete_flow")
489 self.handle.expect("\$",1000)
490 main.log.info(self.name + ": Flows deleted")
491 else:
492 main.log.info(self.name + ": Deleting flow "+str(delParams[0])+"...")
493 #self.execute(cmd="~/ONOS/scripts/TestON_delete_flow.sh "+str(delParams[0]),prompt="done",timeout=150)
494 #self.execute(cmd="\n",prompt="\$",timeout=60)
495 self.handle.sendline(self.home +"/web/delete_flow.py %d" % int(delParams[0]))
496 self.handle.expect("delete_flow")
497 self.handle.expect("\$",60)
498 main.log.info(self.name + ": Flow deleted")
499 elif len(delParams)==2:
500 main.log.info(self.name + ": Deleting flows "+str(delParams[0])+" through "+str(delParams[1])+"...")
501 #self.execute(cmd="~/ONOS/scripts/TestON_delete_flow.sh "+str(delParams[0])+" "+str(delParams[1]),prompt="done",timeout=150)
502 #self.execute(cmd="\n",prompt="\$",timeout=60)
503 self.handle.sendline(self.home + "/web/delete_flow.py %d %d" % (int(delParams[0]), int(delParams[1])))
504 self.handle.expect("delete_flow")
505 self.handle.expect("\$",600)
506 main.log.info(self.name + ": Flows deleted")
Jon Hallae05dc22014-04-16 10:56:28 -0700507 except pexpect.EOF:
508 main.log.error(self.name + ": EOF exception found")
509 main.log.error(self.name + ": " + self.handle.before)
510 main.cleanup()
511 main.exit()
Jon Hallf89c8552014-04-02 13:14:06 -0700512 except:
513 main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
514 main.log.error( traceback.print_exc() )
515 main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
516 main.cleanup()
517 main.exit()
adminbae64d82013-08-01 10:50:15 -0700518
519 def check_flow(self):
Jon Halld8dc5772014-04-08 16:26:29 -0700520 '''
521 Calls the ./get_flow.py all and checks:
522 - If each FlowPath has at least one FlowEntry
523 - That there are no "NOT"s found
524 returns TRUE/FALSE
525 '''
Jon Hallf89c8552014-04-02 13:14:06 -0700526 try:
527 flowEntryDetect = 1
528 count = 0
529 self.handle.sendline("clear")
530 time.sleep(1)
531 self.handle.sendline(self.home + "/web/get_flow.py all")
532 self.handle.expect("get_flow")
533 while 1:
534 i=self.handle.expect(['FlowPath','FlowEntry','NOT','\$',pexpect.TIMEOUT],timeout=180)
535 if i==0:
536 count = count + 1
537 if flowEntryDetect == 0:
538 main.log.info(self.name + ": FlowPath without FlowEntry")
539 return main.FALSE
540 else:
541 flowEntryDetect = 0
542 elif i==1:
543 flowEntryDetect = 1
544 elif i==2:
545 main.log.error(self.name + ": Found a NOT")
adminbae64d82013-08-01 10:50:15 -0700546 return main.FALSE
Jon Hallf89c8552014-04-02 13:14:06 -0700547 elif i==3:
548 if count == 0:
549 main.log.info(self.name + ": There don't seem to be any flows here...")
550 return main.FALSE
551 else:
552 main.log.info(self.name + ": All flows pass")
553 main.log.info(self.name + ": Number of FlowPaths: "+str(count))
554 return main.TRUE
555 elif i==4:
James Leec9cacaf2014-04-08 09:17:39 -0700556 main.log.error(self.name + ":Check_flow() - Command Timeout!")
Jon Hallf89c8552014-04-02 13:14:06 -0700557 return main.FALSE
Jon Hallae05dc22014-04-16 10:56:28 -0700558 except pexpect.EOF:
559 main.log.error(self.name + ": EOF exception found")
560 main.log.error(self.name + ": " + self.handle.before)
561 main.cleanup()
562 main.exit()
Jon Hallf89c8552014-04-02 13:14:06 -0700563 except:
564 main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
565 main.log.error( traceback.print_exc() )
566 main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
567 main.cleanup()
568 main.exit()
adminbae64d82013-08-01 10:50:15 -0700569
570 def get_flow(self, *flowParams):
Jon Halld8dc5772014-04-08 16:26:29 -0700571 '''
572 Returns verbose output of ./get_flow.py
573 '''
574 try:
575 if len(flowParams)==1:
576 if str(flowParams[0])=="all":
577 self.execute(cmd="\n",prompt="\$",timeout=60)
578 main.log.info(self.name + ": Getting all flow data...")
579 data = self.execute(cmd=self.home + "/scripts/TestON_get_flow.sh all",prompt="done",timeout=150)
580 self.execute(cmd="\n",prompt="\$",timeout=60)
581 return data
582 else:
583 main.log.info(self.name + ": Retrieving flow "+str(flowParams[0])+" data...")
584 data = self.execute(cmd=self.home +"/scripts/TestON_get_flow.sh "+str(flowParams[0]),prompt="done",timeout=150)
585 self.execute(cmd="\n",prompt="\$",timeout=60)
586 return data
587 elif len(flowParams)==5:
588 main.log.info(self.name + ": Retrieving flow installer data...")
589 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)
590 self.execute(cmd="\n",prompt="\$",timeout=60)
591 return data
592 elif len(flowParams)==4:
593 main.log.info(self.name + ": Retrieving flow endpoints...")
594 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)
595 self.execute(cmd="\n",prompt="\$",timeout=60)
596 return data
Jon Hallae05dc22014-04-16 10:56:28 -0700597 except pexpect.EOF:
598 main.log.error(self.name + ": EOF exception found")
599 main.log.error(self.name + ": " + self.handle.before)
600 main.cleanup()
601 main.exit()
Jon Halld8dc5772014-04-08 16:26:29 -0700602 except:
Jon Hallf89c8552014-04-02 13:14:06 -0700603 main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
604 main.log.error( traceback.print_exc() )
605 main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
606 main.cleanup()
607 main.exit()
adminbae64d82013-08-01 10:50:15 -0700608
609
SeanCorcoran83a653a2014-04-22 15:03:18 -0700610# http://localhost:8080/wm/onos/topology/switches/json
611# http://localhost:8080/wm/onos/topology/links/json
Jon Hall8060af02014-04-14 14:17:58 -0700612# http://localhost:8080/wm/onos/registry/controllers/json
613# http://localhost:8080/wm/onos/registry/switches/json"
adminbae64d82013-08-01 10:50:15 -0700614
615 def get_json(self, url):
Jon Halld8dc5772014-04-08 16:26:29 -0700616 '''
617 Helper functions used to parse the json output of a rest call
618 '''
adminbae64d82013-08-01 10:50:15 -0700619 try:
Jon Hallf89c8552014-04-02 13:14:06 -0700620 try:
621 command = "curl -s %s" % (url)
622 result = os.popen(command).read()
623 parsedResult = json.loads(result)
624 except:
625 print "REST IF %s has issue" % command
626 parsedResult = ""
627
628 if type(parsedResult) == 'dict' and parsedResult.has_key('code'):
629 print "REST %s returned code %s" % (command, parsedResult['code'])
630 parsedResult = ""
James Leec9cacaf2014-04-08 09:17:39 -0700631 return parsedResult
Jon Hallae05dc22014-04-16 10:56:28 -0700632 except pexpect.EOF:
633 main.log.error(self.name + ": EOF exception found")
634 main.log.error(self.name + ": " + self.handle.before)
635 main.cleanup()
636 main.exit()
adminbae64d82013-08-01 10:50:15 -0700637 except:
Jon Hallf89c8552014-04-02 13:14:06 -0700638 main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
639 main.log.error( traceback.print_exc() )
640 main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
641 main.cleanup()
642 main.exit()
adminbae64d82013-08-01 10:50:15 -0700643
Jon Hallf89c8552014-04-02 13:14:06 -0700644 def check_switch(self,RestIP,correct_nr_switch, RestPort ="8080" ):
Jon Halld8dc5772014-04-08 16:26:29 -0700645 '''
646 Used by check_status
647 '''
Jon Hallf89c8552014-04-02 13:14:06 -0700648 try:
649 buf = ""
650 retcode = 0
SeanCorcoran83a653a2014-04-22 15:03:18 -0700651 url="http://%s:%s/wm/onos/topology/switches/json" % (RestIP, RestPort)
Jon Hallf89c8552014-04-02 13:14:06 -0700652 parsedResult = self.get_json(url)
653 if parsedResult == "":
654 retcode = 1
655 return (retcode, "Rest API has an issue")
656 url = "http://%s:%s/wm/onos/registry/switches/json" % (RestIP, RestPort)
657 registry = self.get_json(url)
658
659 if registry == "":
660 retcode = 1
661 return (retcode, "Rest API has an issue")
662
663 cnt = 0
664 active = 0
adminbae64d82013-08-01 10:50:15 -0700665
Jon Hallf89c8552014-04-02 13:14:06 -0700666 for s in parsedResult:
667 cnt += 1
James Leec9cacaf2014-04-08 09:17:39 -0700668 if s['state'] == "ACTIVE":
Jon Hallf89c8552014-04-02 13:14:06 -0700669 active += 1
adminbae64d82013-08-01 10:50:15 -0700670
Jon Hallf89c8552014-04-02 13:14:06 -0700671 buf += "switch: network %d : %d switches %d active\n" % (0+1, cnt, active)
672 if correct_nr_switch != cnt:
673 buf += "switch fail: network %d should have %d switches but has %d\n" % (1, correct_nr_switch, cnt)
674 retcode = 1
adminbae64d82013-08-01 10:50:15 -0700675
Jon Hallf89c8552014-04-02 13:14:06 -0700676 if correct_nr_switch != active:
677 buf += "switch fail: network %d should have %d active switches but has %d\n" % (1, correct_nr_switch, active)
678 retcode = 1
679
680 return (retcode, buf)
Jon Hallae05dc22014-04-16 10:56:28 -0700681 except pexpect.EOF:
682 main.log.error(self.name + ": EOF exception found")
683 main.log.error(self.name + ": " + self.handle.before)
684 main.cleanup()
685 main.exit()
Jon Hallf89c8552014-04-02 13:14:06 -0700686 except:
687 main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
688 main.log.error( traceback.print_exc() )
689 main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
690 main.cleanup()
691 main.exit()
adminbae64d82013-08-01 10:50:15 -0700692
Jon Hallf89c8552014-04-02 13:14:06 -0700693 def check_link(self,RestIP, nr_links, RestPort = "8080"):
Jon Halld8dc5772014-04-08 16:26:29 -0700694 '''
695 Used by check_status
696 '''
Jon Hallf89c8552014-04-02 13:14:06 -0700697 try:
698 buf = ""
699 retcode = 0
700
SeanCorcoran83a653a2014-04-22 15:03:18 -0700701 url = "http://%s:%s/wm/onos/topology/links/json" % (RestIP, RestPort)
Jon Hallf89c8552014-04-02 13:14:06 -0700702 parsedResult = self.get_json(url)
703
704 if parsedResult == "":
705 retcode = 1
706 return (retcode, "Rest API has an issue")
707
708 buf += "link: total %d links (correct : %d)\n" % (len(parsedResult), nr_links)
709 intra = 0
710 interlink=0
711
712 for s in parsedResult:
James Leec9cacaf2014-04-08 09:17:39 -0700713 intra = intra + 1
Jon Hallf89c8552014-04-02 13:14:06 -0700714
715 if intra != nr_links:
716 buf += "link fail\n"
717 retcode = 1
718
719 return (retcode, buf)
Jon Hallae05dc22014-04-16 10:56:28 -0700720 except pexpect.EOF:
721 main.log.error(self.name + ": EOF exception found")
722 main.log.error(self.name + ": " + self.handle.before)
723 main.cleanup()
724 main.exit()
Jon Hallf89c8552014-04-02 13:14:06 -0700725 except:
726 main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
727 main.log.error( traceback.print_exc() )
728 main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
729 main.cleanup()
730 main.exit()
adminbae64d82013-08-01 10:50:15 -0700731
Jon Hallf89c8552014-04-02 13:14:06 -0700732 def check_status_report(self, ip, numoswitch, numolink, port="8080"):
Jon Halld8dc5772014-04-08 16:26:29 -0700733 '''
734 Checks the number of swithes & links that ONOS sees against the supplied values.
735 Writes to the report log.
736 '''
Jon Hallf89c8552014-04-02 13:14:06 -0700737 try:
James Leec9cacaf2014-04-08 09:17:39 -0700738 main.log.info(self.name + ": Making some rest calls...")
Jon Hallf89c8552014-04-02 13:14:06 -0700739 switch = self.check_switch(ip, int(numoswitch), port)
740 link = self.check_link(ip, int(numolink), port)
741 value = switch[0]
742 value += link[0]
743 main.log.report( self.name + ": \n-----\n%s%s-----\n" % ( switch[1], link[1]) )
744 if value != 0:
745 return main.FALSE
James Leec9cacaf2014-04-08 09:17:39 -0700746 else:
Jon Hallf89c8552014-04-02 13:14:06 -0700747 # "PASS"
748 return main.TRUE
Jon Hallae05dc22014-04-16 10:56:28 -0700749 except pexpect.EOF:
750 main.log.error(self.name + ": EOF exception found")
751 main.log.error(self.name + ": " + self.handle.before)
752 main.cleanup()
753 main.exit()
Jon Hallf89c8552014-04-02 13:14:06 -0700754 except:
755 main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
756 main.log.error( traceback.print_exc() )
757 main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
758 main.cleanup()
759 main.exit()
adminbae64d82013-08-01 10:50:15 -0700760
Jon Hallf89c8552014-04-02 13:14:06 -0700761 def check_status(self, ip, numoswitch, numolink, port = "8080"):
Jon Halld8dc5772014-04-08 16:26:29 -0700762 '''
763 Checks the number of swithes & links that ONOS sees against the supplied values.
764 Writes to the main log.
765 '''
Jon Hallf89c8552014-04-02 13:14:06 -0700766 try:
James Leec9cacaf2014-04-08 09:17:39 -0700767 main.log.info(self.name + ": Making some rest calls...")
Jon Hallf89c8552014-04-02 13:14:06 -0700768 switch = self.check_switch(ip, int(numoswitch), port)
769 link = self.check_link(ip, int(numolink), port)
770 value = switch[0]
771 value += link[0]
772 main.log.info(self.name + ": \n-----\n%s%s-----\n" % ( switch[1], link[1]) )
773 if value != 0:
774 return main.FALSE
James Leec9cacaf2014-04-08 09:17:39 -0700775 else:
Jon Hallf89c8552014-04-02 13:14:06 -0700776 # "PASS"
777 return main.TRUE
Jon Hallae05dc22014-04-16 10:56:28 -0700778 except pexpect.EOF:
779 main.log.error(self.name + ": EOF exception found")
780 main.log.error(self.name + ": " + self.handle.before)
781 main.cleanup()
782 main.exit()
Jon Hallf89c8552014-04-02 13:14:06 -0700783 except:
784 main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
785 main.log.error( traceback.print_exc() )
786 main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
787 main.cleanup()
788 main.exit()
adminbae64d82013-08-01 10:50:15 -0700789
adminbae64d82013-08-01 10:50:15 -0700790 def check_for_no_exceptions(self):
Jon Halld8dc5772014-04-08 16:26:29 -0700791 '''
792 TODO: Rewrite
793 Used by CassndraCheck.py to scan ONOS logs for Exceptions
794 '''
Jon Hallf89c8552014-04-02 13:14:06 -0700795 try:
796 self.handle.sendline("dsh 'grep Exception ~/ONOS/onos-logs/onos.*.log'")
James Leec9cacaf2014-04-08 09:17:39 -0700797 self.handle.expect("\$ dsh")
Jon Hallf89c8552014-04-02 13:14:06 -0700798 self.handle.expect("\$")
799 output = self.handle.before
James Leec9cacaf2014-04-08 09:17:39 -0700800 main.log.info(self.name + ": " + output )
Jon Hallf89c8552014-04-02 13:14:06 -0700801 if re.search("Exception",output):
802 return main.FALSE
803 else :
804 return main.TRUE
Jon Hallae05dc22014-04-16 10:56:28 -0700805 except pexpect.EOF:
806 main.log.error(self.name + ": EOF exception found")
807 main.log.error(self.name + ": " + self.handle.before)
808 main.cleanup()
809 main.exit()
Jon Hallf89c8552014-04-02 13:14:06 -0700810 except:
811 main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
812 main.log.error( traceback.print_exc() )
813 main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
814 main.cleanup()
815 main.exit()
816
817
admine0eeea22014-04-14 10:22:46 -0700818 def git_pull(self, comp1=""):
Jon Halld8dc5772014-04-08 16:26:29 -0700819 '''
Jon Halld8dc5772014-04-08 16:26:29 -0700820 Assumes that "git pull" works without login
admine0eeea22014-04-14 10:22:46 -0700821
822 This function will perform a git pull on the ONOS instance.
823 If used as git_pull("NODE") it will do git pull + NODE. This is
824 for the purpose of pulling from other nodes if necessary.
825
826 Otherwise, this function will perform a git pull in the
827 ONOS repository. If it has any problems, it will return main.ERROR
828 If it successfully does a git_pull, it will return a 1.
829 If it has no updates, it will return a 0.
830
Jon Halld8dc5772014-04-08 16:26:29 -0700831 '''
Jon Hallae05dc22014-04-16 10:56:28 -0700832 try:
Jon Halle80ef8c2014-04-29 15:29:13 -0700833 # main.log.info(self.name + ": Stopping ONOS")
834 #self.stop()
Jon Hallae05dc22014-04-16 10:56:28 -0700835 self.handle.sendline("cd " + self.home)
836 self.handle.expect("ONOS\$")
837 if comp1=="":
838 self.handle.sendline("git pull")
839 else:
840 self.handle.sendline("git pull " + comp1)
841
842 uptodate = 0
SeanCorcoran20bd6fc2014-04-16 17:10:30 -0700843 i=self.handle.expect(['fatal','Username\sfor\s(.*):\s','Unpacking\sobjects',pexpect.TIMEOUT,'Already up-to-date','Aborting'],timeout=1800)
Jon Hallae05dc22014-04-16 10:56:28 -0700844 #debug
845 #main.log.report(self.name +": \n"+"git pull response: " + str(self.handle.before) + str(self.handle.after))
846 if i==0:
847 main.log.error(self.name + ": Git pull had some issue...")
848 return main.ERROR
849 elif i==1:
850 main.log.error(self.name + ": Git Pull Asking for username!!! BADD!")
851 return main.ERROR
852 elif i==2:
853 main.log.info(self.name + ": Git Pull - pulling repository now")
854 self.handle.expect("ONOS\$", 120)
855 return 0
856 elif i==3:
857 main.log.error(self.name + ": Git Pull - TIMEOUT")
858 return main.ERROR
859 elif i==4:
860 main.log.info(self.name + ": Git Pull - Already up to date")
861 return 1
862 elif i==5:
863 main.log.info(self.name + ": Git Pull - Aborting... Are there conflicting git files?")
864 return main.ERROR
865 else:
866 main.log.error(self.name + ": Git Pull - Unexpected response, check for pull errors")
867 return main.ERROR
868 except pexpect.EOF:
869 main.log.error(self.name + ": EOF exception found")
870 main.log.error(self.name + ": " + self.handle.before)
871 main.cleanup()
872 main.exit()
873 except:
874 main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
875 main.log.error( traceback.print_exc() )
876 main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
877 main.cleanup()
878 main.exit()
admine0eeea22014-04-14 10:22:46 -0700879#********************************************************
880
881
admin7373a812014-04-16 09:49:02 -0700882 def git_compile(self):
Jon Hallae05dc22014-04-16 10:56:28 -0700883 '''
884 Compiles ONOS
885 First runs mvn clean then mvn compile
886 '''
887 try:
888 main.log.info(self.name + ": mvn clean")
admin8fc02822014-04-16 13:31:23 -0700889 self.handle.sendline("cd " + self.home)
Jon Hallae05dc22014-04-16 10:56:28 -0700890 self.handle.sendline("mvn clean")
891 while 1:
Jon Hall1636f942014-04-17 10:07:23 -0700892 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 -0700893 if i == 0:
Jon Hall1636f942014-04-17 10:07:23 -0700894 main.log.error(self.name + ":There is insufficient memory for the Java Runtime Environment to continue.")
Jon Hallae05dc22014-04-16 10:56:28 -0700895 return main.FALSE
896 elif i == 1:
Jon Hall1636f942014-04-17 10:07:23 -0700897 main.log.error(self.name + ": Clean failure!")
898 return main.FALSE
Jon Hallae05dc22014-04-16 10:56:28 -0700899 elif i == 2:
Jon Hall1636f942014-04-17 10:07:23 -0700900 main.log.info(self.name + ": Clean success!")
901 elif i == 3:
admin8fc02822014-04-16 13:31:23 -0700902 main.log.info(self.name + ": Clean complete")
Jon Hallae05dc22014-04-16 10:56:28 -0700903 break;
Jon Hall1636f942014-04-17 10:07:23 -0700904 elif i == 4:
Jon Hallae05dc22014-04-16 10:56:28 -0700905 main.log.error(self.name + ": mvn clean TIMEOUT!")
906 return main.FALSE
Jon Hall1636f942014-04-17 10:07:23 -0700907 else:
908 main.log.error(self.name + ": unexpected response from mvn clean")
909 return main.FALSE
Jon Hallae05dc22014-04-16 10:56:28 -0700910
911 main.log.info(self.name + ": mvn compile")
912 self.handle.sendline("mvn compile")
913 while 1:
Jon Hall1636f942014-04-17 10:07:23 -0700914 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 -0700915 if i == 0:
Jon Hall1636f942014-04-17 10:07:23 -0700916 main.log.error(self.name + ":There is insufficient memory for the Java Runtime Environment to continue.")
917 return main.FALSE
918 if i == 1:
Jon Hallae05dc22014-04-16 10:56:28 -0700919 main.log.error(self.name + ": Build failure!")
920 return main.FALSE
Jon Hall1636f942014-04-17 10:07:23 -0700921 elif i == 2:
Jon Hallae05dc22014-04-16 10:56:28 -0700922 main.log.info(self.name + ": Build success!")
923 return main.TRUE
Jon Hall1636f942014-04-17 10:07:23 -0700924 elif i == 3:
Jon Hallae05dc22014-04-16 10:56:28 -0700925 main.log.info(self.name + ": Build complete")
926 return main.TRUE
Jon Hall1636f942014-04-17 10:07:23 -0700927 elif i == 4:
Jon Hallae05dc22014-04-16 10:56:28 -0700928 main.log.error(self.name + ": mvn compile TIMEOUT!")
929 return main.FALSE
930 else:
Jon Hall1636f942014-04-17 10:07:23 -0700931 main.log.error(self.name + ": unexpected response from mvn compile")
932 return main.FALSE
Jon Hallae05dc22014-04-16 10:56:28 -0700933 except pexpect.EOF:
934 main.log.error(self.name + ": EOF exception found")
935 main.log.error(self.name + ": " + self.handle.before)
936 main.cleanup()
937 main.exit()
938 except:
939 main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
940 main.log.error( traceback.print_exc() )
941 main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
942 main.cleanup()
943 main.exit()
admin4a58db92013-09-30 12:04:54 -0700944
Jon Hallf89c8552014-04-02 13:14:06 -0700945 def tcpdump(self, intf = "eth0"):
Jon Hallae05dc22014-04-16 10:56:28 -0700946 '''
947 Runs tpdump on an intferface and saves in onos-logs under the ONOS home directory
948 intf can be specified, or the default eth0 is used
949 '''
Jon Hallf89c8552014-04-02 13:14:06 -0700950 try:
951 self.handle.sendline("")
952 self.handle.expect("\$")
Jon Hall26f316b2014-04-11 11:21:25 -0700953 self.handle.sendline("sudo tcpdump -n -i "+ intf + " -s0 -w " + self.home +"/onos-logs/tcpdump &")
Jon Hallf89c8552014-04-02 13:14:06 -0700954 i=self.handle.expect(['No\ssuch\device','listening\son',pexpect.TIMEOUT],timeout=10)
955 if i == 0:
956 main.log.error(self.name + ": tcpdump - No such device exists. tcpdump attempted on: " + intf)
957 return main.FALSE
James Leec9cacaf2014-04-08 09:17:39 -0700958 elif i == 1:
Jon Hallf89c8552014-04-02 13:14:06 -0700959 main.log.info(self.name + ": tcpdump started on " + intf)
960 return main.TRUE
James Leec9cacaf2014-04-08 09:17:39 -0700961 elif i == 2:
Jon Hallf89c8552014-04-02 13:14:06 -0700962 main.log.error(self.name + ": tcpdump command timed out! Check interface name, given interface was: " + intf)
963 return main.FALSE
964 else:
965 main.log.error(self.name + ": tcpdump - unexpected response")
966 return main.FALSE
Jon Hallae05dc22014-04-16 10:56:28 -0700967 except pexpect.EOF:
968 main.log.error(self.name + ": EOF exception found")
969 main.log.error(self.name + ": " + self.handle.before)
970 main.cleanup()
971 main.exit()
Jon Hallf89c8552014-04-02 13:14:06 -0700972 except:
973 main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
974 main.log.error( traceback.print_exc() )
975 main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
976 main.cleanup()
977 main.exit()
978
admin4a58db92013-09-30 12:04:54 -0700979 def kill_tcpdump(self):
Jon Hallae05dc22014-04-16 10:56:28 -0700980 '''
981 Kills any tcpdump processes running
982 '''
Jon Hallf89c8552014-04-02 13:14:06 -0700983 try:
984 self.handle.sendline("")
985 self.handle.expect("\$")
986 self.handle.sendline("sudo kill -9 `ps -ef | grep \"tcpdump -n\" | grep -v grep | awk '{print $2}'`")
Jon Hallae05dc22014-04-16 10:56:28 -0700987 except pexpect.EOF:
988 main.log.error(self.name + ": EOF exception found")
989 main.log.error(self.name + ": " + self.handle.before)
990 main.cleanup()
991 main.exit()
Jon Hallf89c8552014-04-02 13:14:06 -0700992 except:
993 main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
994 main.log.error( traceback.print_exc() )
995 main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
996 main.cleanup()
997 main.exit()
998
999 def find_host(self,RestIP,RestPort,RestAPI,hostIP):
1000 retcode = 0
1001 retswitch = []
1002 retport = []
1003 retmac = []
1004 foundIP = []
1005 try:
SeanCorcoran83a653a2014-04-22 15:03:18 -07001006 ##### device rest API is: 'host:8080/wm/onos/topology/switches/json' ###
Jon Hallf89c8552014-04-02 13:14:06 -07001007 url ="http://%s:%s%s" %(RestIP,RestPort,RestAPI)
1008
1009 try:
1010 command = "curl -s %s" % (url)
1011 result = os.popen(command).read()
1012 parsedResult = json.loads(result)
1013 # print parsedResult
1014 except:
1015 print "REST IF %s has issue" % command
1016 parsedResult = ""
1017
1018 if parsedResult == "":
Jon Hallae05dc22014-04-16 10:56:28 -07001019 return (retcode, "Rest API has an error", retport, retmac)
Jon Hallf89c8552014-04-02 13:14:06 -07001020 else:
1021 for switch in enumerate(parsedResult):
1022 for port in enumerate(switch[1]['ports']):
1023 if ( port[1]['devices'] != [] ):
1024 try:
James Leec9cacaf2014-04-08 09:17:39 -07001025 foundIP = port[1]['devices'][0]['ipv4addresses'][0]['ipv4']
Jon Hallf89c8552014-04-02 13:14:06 -07001026 except:
1027 print "Error in detecting IP address."
1028 if foundIP == hostIP:
1029 retswitch.append(switch[1]['dpid'])
1030 retport.append(port[1]['desc'])
1031 retmac.append(port[1]['devices'][0]['mac'])
1032 retcode = retcode +1
1033 foundIP =''
1034 return(retcode, retswitch, retport, retmac)
Jon Hallae05dc22014-04-16 10:56:28 -07001035 except pexpect.EOF:
1036 main.log.error(self.name + ": EOF exception found")
1037 main.log.error(self.name + ": " + self.handle.before)
1038 main.cleanup()
1039 main.exit()
Jon Hallf89c8552014-04-02 13:14:06 -07001040 except:
1041 main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
1042 main.log.error( traceback.print_exc() )
1043 main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
1044 main.cleanup()
1045 main.exit()