blob: b4b73f453856c63069a7d0991afe8c481ee2f576 [file] [log] [blame]
admincb593912014-04-14 10:34:41 -07001
2class RCOnosPerf4nodes:
3
4 def __init__(self) :
5 self.default = ''
6
7 def CASE1(self,main) :
8 '''
9 First case is to simply check if ONOS, ZK, and RamCloud are all running properly.
10 If ONOS if not running properly, it will restart ONOS once before continuing.
11 It will then check if the ONOS has a view of all the switches and links as defined in the params file.
12 The test will only pass if ONOS is running properly, and has a full view of all topology elements.
13 '''
14 import time
admin1723f1c2014-05-19 16:08:39 -070015
16
17
18
admincb593912014-04-14 10:34:41 -070019 main.ONOS1.stop()
20 main.ONOS2.stop()
21 main.ONOS3.stop()
22 main.ONOS4.stop()
adminaef00552014-05-08 09:18:36 -070023 main.RamCloud1.stop_coor()
24 main.RamCloud1.stop_serv()
25 main.RamCloud2.stop_serv()
26 main.RamCloud3.stop_serv()
27 main.RamCloud4.stop_serv()
admin1723f1c2014-05-19 16:08:39 -070028 main.Zookeeper1.stop()
29 main.Zookeeper2.stop()
30 main.Zookeeper3.stop()
31 main.Zookeeper4.stop()
32
33 main.Zookeeper1.start()
34 main.Zookeeper2.start()
35 main.Zookeeper3.start()
36 main.Zookeeper4.start()
Jon Hall1c4d2742014-05-22 10:57:05 -070037 time.sleep(4)
admin1723f1c2014-05-19 16:08:39 -070038 main.RamCloud1.del_db()
39 main.RamCloud2.del_db()
40 main.RamCloud3.del_db()
41 main.RamCloud4.del_db()
42
43
adminaef00552014-05-08 09:18:36 -070044 time.sleep(10)
admincb593912014-04-14 10:34:41 -070045 main.RamCloud1.start_coor()
46 main.RamCloud1.start_serv()
47 main.RamCloud2.start_serv()
48 main.RamCloud3.start_serv()
49 main.RamCloud4.start_serv()
admincb593912014-04-14 10:34:41 -070050 main.ONOS1.start()
51 time.sleep(10)
52 main.ONOS2.start()
53 main.ONOS3.start()
54 main.ONOS4.start()
55 main.ONOS1.start_rest()
56 time.sleep(5)
57 test= main.ONOS1.rest_status()
58 if test == main.FALSE:
59 main.ONOS1.start_rest()
60 main.ONOS1.get_version()
61 main.log.report("Startup check Zookeeper1, RamCloud1, and ONOS1 connections")
62 main.case("Checking if the startup was clean...")
63 main.step("Testing startup Zookeeper")
64 data = main.Zookeeper1.isup()
65 utilities.assert_equals(expect=main.TRUE,actual=data,onpass="Zookeeper is up!",onfail="Zookeeper is down...")
66 main.step("Testing startup RamCloud")
Jon Halle80ef8c2014-04-29 15:29:13 -070067 data = main.RamCloud1.server_status()
admincb593912014-04-14 10:34:41 -070068 if data == main.FALSE:
69 main.RamCloud1.stop_coor()
70 main.RamCloud1.stop_serv()
71 main.RamCloud2.stop_serv()
72 main.RamCloud3.stop_serv()
73 main.RamCloud4.stop_serv()
74
75 time.sleep(5)
76 main.RamCloud1.start_coor()
77 main.RamCloud1.start_serv()
78 main.RamCloud2.start_serv()
79 main.RamCloud3.start_serv()
80 main.RamCloud4.start_serv()
81 utilities.assert_equals(expect=main.TRUE,actual=data,onpass="RamCloud is up!",onfail="RamCloud is down...")
82 main.step("Testing startup ONOS")
83 data = main.ONOS1.isup()
84 data = data and main.ONOS2.isup()
85 data = data and main.ONOS3.isup()
86 data = data and main.ONOS4.isup()
87 if data == main.FALSE:
88 main.log.report("Something is funny... restarting ONOS")
89 main.ONOS1.stop()
90 main.ONOS2.stop()
91 main.ONOS3.stop()
92 main.ONOS4.stop()
93 time.sleep(5)
94 main.ONOS1.start()
95 time.sleep(10)
96 main.ONOS2.start()
97 main.ONOS3.start()
98 main.ONOS4.start()
99 data = main.ONOS1.isup()
100 utilities.assert_equals(expect=main.TRUE,actual=data,onpass="ONOS is up and running!",onfail="ONOS didn't start...")
101
102 def CASE2(self,main) :
103 '''
104 Makes sure that the HW links are all up
105 Verifies that at least one mininet host exists.
106 Proves that there is actually a mininet that we are working with
107 '''
108 import time
109 main.step("Checking if MN switches exist")
110 main.log.report("Check if MN switches exist")
111 #result = main.ONOS1.check_status_report(main.params['RestIP'],main.params['NR_Switches'],main.params['NR_Links'])
112 #for i in range(2):
113 # if result == main.FALSE:
114 # time.sleep(5)
115 # result = main.ONOS1.check_status_report(main.params['RestIP'],main.params['NR_Switches'],main.params['NR_Links'])
116 # else:
117 # break
118 #main.step("Verifying the result")
119 #utilities.assert_equals(expect=main.TRUE,actual=result,onpass="MN switches exist",onfail="MN is missing switches and or links...")
120
121 main.step("assigning ONOS controllers to switches")
122 for i in range(25):
123 if i < 3:
124 j=i+1
125 main.Mininet1.assign_sw_controller(sw=str(j),ip1=main.params['CTRL']['ip1'],port1=main.params['CTRL']['port1'])
126 time.sleep(1)
127 main.Mininet1.assign_sw_controller(sw=str(j),ip1=main.params['CTRL']['ip1'],port1=main.params['CTRL']['port1'],ip2=main.params['CTRL']['ip2'],port2=main.params['CTRL']['port2'],ip3=main.params['CTRL']['ip3'],port3=main.params['CTRL']['port3'],ip4=main.params['CTRL']['ip4'],port4=main.params['CTRL']['port4'])
128 elif i >= 3 and i < 5:
129 j=i+1
130 main.Mininet1.assign_sw_controller(sw=str(j),ip1=main.params['CTRL']['ip2'],port1=main.params['CTRL']['port2'])
131 time.sleep(1)
132 main.Mininet1.assign_sw_controller(sw=str(j),ip1=main.params['CTRL']['ip1'],port1=main.params['CTRL']['port1'],ip2=main.params['CTRL']['ip2'],port2=main.params['CTRL']['port2'],ip3=main.params['CTRL']['ip3'],port3=main.params['CTRL']['port3'],ip4=main.params['CTRL']['ip4'],port4=main.params['CTRL']['port4'])
133 elif i >= 5 and i < 15:
134 j=i+1
135 main.Mininet1.assign_sw_controller(sw=str(j),ip1=main.params['CTRL']['ip3'],port1=main.params['CTRL']['port3'])
136 time.sleep(1)
137 main.Mininet1.assign_sw_controller(sw=str(j),ip1=main.params['CTRL']['ip1'],port1=main.params['CTRL']['port1'],ip2=main.params['CTRL']['ip2'],port2=main.params['CTRL']['port2'],ip3=main.params['CTRL']['ip3'],port3=main.params['CTRL']['port3'],ip4=main.params['CTRL']['ip4'],port4=main.params['CTRL']['port4'])
138 else:
139 j=i+16
140 main.Mininet1.assign_sw_controller(sw=str(j),ip1=main.params['CTRL']['ip4'],port1=main.params['CTRL']['port4'])
141 time.sleep(1)
142 main.Mininet1.assign_sw_controller(sw=str(j),ip1=main.params['CTRL']['ip1'],port1=main.params['CTRL']['port1'],ip2=main.params['CTRL']['ip2'],port2=main.params['CTRL']['port2'],ip3=main.params['CTRL']['ip3'],port3=main.params['CTRL']['port3'],ip4=main.params['CTRL']['ip4'],port4=main.params['CTRL']['port4'])
143 main.Mininet1.get_sw_controller("s1")
144 time.sleep(5)
145
146 def CASE3(self,main) :
147 '''
148 Verifies that ONOS sees the right topology...
149 '''
150 import time
151 main.log.report("checking if ONOS sees the right topo...")
152 main.case("TOPO check")
153 main.step("calling rest calls")
154 for i in range(4):
155 result = main.ONOS1.check_status(main.params['RestIP'],main.params['NR_Switches'],main.params['NR_Links'])
156 time.sleep(5)
157 if result == 1:
158 break
159 if result == 0:
160 main.ONOS1.start()
161 main.ONOS2.start()
162 main.ONOS3.start()
163 main.ONOS4.start()
164 time.sleep(45)
165 for i in range(4):
166 result = main.ONOS1.check_status(main.params['RestIP'],main.params['NR_Switches'],main.params['NR_Links'])
167 time.sleep(5)
168 if result == 1:
169 break
170 utilities.assert_equals(expect=1,actual=result)
171
172 def CASE4(self,main) :
173 '''
174 This Test case:
175 - Clears out any leftover flows
176 - Adds new flows into ONOS
177 - Checks flows up to 10 times waiting for each flow to be caluculated and no "NOT" statements inte get_flow
178 '''
179 import time
180 main.log.report("Deleting and adding flows")
181 main.case("Taking care of these flows!")
182 main.step("Cleaning out any leftover flows...")
183 main.log.info("deleting...")
Jon Halle80ef8c2014-04-29 15:29:13 -0700184 main.ONOS1.rm_flow()
185 # main.ONOS1.delete_flow("all")
admincb593912014-04-14 10:34:41 -0700186 main.log.info("adding...")
187 t1 = time.time()
Jon Halle80ef8c2014-04-29 15:29:13 -0700188 main.ONOS1.ad_flow()
189 # main.ONOS1.add_flow(main.params['FLOWDEF'])
admincb593912014-04-14 10:34:41 -0700190 main.log.info("Checking...")
191 for i in range(15):
192 result = main.ONOS1.check_flow()
193 if result == main.TRUE:
194 t2 = time.time()
195 main.log.info( 'Adding flows took %0.3f s' % (t2-t1))
196 break
197 time.sleep(5)
198 main.log.info("Checking Flows again...")
199
200 strtTime = time.time()
201 count = 1
202 i = 6
203 while i < 16 :
204 main.log.info("\n\t\t\t\th"+str(i)+" IS PINGING h"+str(i+25) )
205 ping = main.Mininet1.pingHost(src="h"+str(i),target="h"+str(i+25))
206 if ping == main.FALSE and count < 3:
207 count = count + 1
208 i = 6
209 main.log.info("Ping failed, making attempt number "+str(count)+" in 10 seconds")
210 time.sleep(10)
211 elif ping == main.FALSE and count ==3:
212 main.log.error("Ping test failed")
213 i = 17
214 result = main.FALSE
215 elif ping == main.TRUE:
216 i = i + 1
217 result = main.TRUE
218 endTime = time.time()
219 if result == main.TRUE:
220 main.log.info("\tTime to complete ping test: "+str(round(endTime-strtTime,2))+" seconds")
221 else:
222 main.log.info("\tPING TEST FAIL")
223
224 utilities.assert_equals(expect=main.TRUE,actual=result,onpass="flows are good",onfail="FLOWS not correct")
225
226 main.log.report("checking if ONOS sees the right topo...")
227 main.case("TOPO check")
228 main.step("calling rest calls")
229 for i in range(3):
230 result = main.ONOS1.check_status(main.params['RestIP'],main.params['NR_Switches'],main.params['NR_Links'])
231 time.sleep(5)
232 if result == 1:
233 break
234
235 def CASE5(self,main) :
236 '''
237 Tests a single ping
238 '''
239 main.log.report("Testing a single ping")
240 main.case("Testing ping...")
241 ping_result = main.Mininet4.pingHost(src=main.params['PING']['source1'],target=main.params['PING']['target1'])
242 utilities.assert_equals(expect=main.TRUE,actual=ping_result,onpass="NO PACKET LOSS, HOST IS REACHABLE",onfail="PACKET LOST, HOST IS NOT REACHABLE")
243
244
245 def CASE6(self,main) :
246 '''
247 Starts continuous pings on the Mininet nodes
248 '''
249 main.log.report("Starting continuous ping, then toggle a single link in the center triangle")
250 import time
251 import os
252 main.case("Starting long ping... ")
253 main.Mininet4.pingLong(src=main.params['PING']['source1'],target=main.params['PING']['target1'])
254 main.Mininet4.pingLong(src=main.params['PING']['source2'],target=main.params['PING']['target2'])
255 main.Mininet4.pingLong(src=main.params['PING']['source3'],target=main.params['PING']['target3'])
256 main.Mininet4.pingLong(src=main.params['PING']['source4'],target=main.params['PING']['target4'])
257 main.Mininet4.pingLong(src=main.params['PING']['source5'],target=main.params['PING']['target5'])
258 main.Mininet4.pingLong(src=main.params['PING']['source6'],target=main.params['PING']['target6'])
259 main.Mininet4.pingLong(src=main.params['PING']['source7'],target=main.params['PING']['target7'])
260 main.Mininet4.pingLong(src=main.params['PING']['source8'],target=main.params['PING']['target8'])
261 main.Mininet4.pingLong(src=main.params['PING']['source9'],target=main.params['PING']['target9'])
262 main.Mininet4.pingLong(src=main.params['PING']['source10'],target=main.params['PING']['target10'])
263 main.step("Check that the pings are going")
264 result = main.Mininet4.pingstatus(src=main.params['PING']['source1'])
265 result = result & main.Mininet4.pingstatus(src=main.params['PING']['source2'])
266 result = result & main.Mininet4.pingstatus(src=main.params['PING']['source3'])
267 result = result & main.Mininet4.pingstatus(src=main.params['PING']['source4'])
268 result = result & main.Mininet4.pingstatus(src=main.params['PING']['source5'])
269 result = result & main.Mininet4.pingstatus(src=main.params['PING']['source6'])
270 result = result & main.Mininet4.pingstatus(src=main.params['PING']['source7'])
271 result = result & main.Mininet4.pingstatus(src=main.params['PING']['source8'])
272 result = result & main.Mininet4.pingstatus(src=main.params['PING']['source9'])
273 result = result & main.Mininet4.pingstatus(src=main.params['PING']['source10'])
274 main.step( "Link down number of iterations: " + main.params['Iterations'] )
275 for i in range(int(main.params['Iterations'])):
276 main.log.info("Bringing Link down... ")
277 main.Mininet1.link(END1="s1",END2="s2",OPTION="down")
278 main.log.info( "Waiting " + main.params['WaitTime'] + " seconds.... " )
279 time.sleep( int(main.params['WaitTime']) )
280 main.log.info("Bringing Link up... ")
281 main.Mininet1.link(END1="s1",END2="s2",OPTION="up")
282 main.log.info( "Waiting " + main.params['WaitTime'] + " seconds.... " )
283 time.sleep( int(main.params['WaitTime']) )
284 main.case("Killing remote ping processes ")
285 result = result & main.Mininet4.pingKill()
286 utilities.assert_equals(expect=main.TRUE,actual=result)
287
288
289 def CASE7(self,main) :
290 '''
291 Processes all of the ping data and outputs raw data and an overall average
292 '''
293 import os
294 import time
295 main.log.report("Process ping data (Fail is time is >20 seconds)")
296 main.case("Processing Ping data")
297 time.sleep(3)
298 #result=os.popen("/home/admin/tools/shell.sh " + main.params['Iterations']).read()
299 try:
300 result=os.popen("/home/admin/ONLabTest/TestON/scripts/get_reroute_times.py").read()
301 average=result.split(":")[1]
302 main.log.info( "Reroute times are... " )
303 main.log.report( result + " seconds" )
304 try:
305 if float(average) < float(main.params['TargetTime']) :
306 test=main.TRUE
307 else:
308 test=main.FALSE
309 except ValueError:
310 main.log.error("Data is corrupted")
311 test=main.FALSE
312 except:
313 main.log.report("No data")
314 test=main.FALSE
315 utilities.assert_equals(expect=main.TRUE,actual=test,onpass="Average is less then the target time!",onfail="Average is worse then target time... ")
316
317 def CASE8(self,main) :
318 '''
319 Starts continuous pings on the Mininet nodes
320 '''
321 main.log.report("Start continuous pings, then toggle multiple links in center triangle")
322 import time
323 import os
324 time.sleep(20)
325 main.case("Starting long ping... ")
326 main.Mininet4.pingLong(src=main.params['PING']['source1'],target=main.params['PING']['target1'])
327 main.Mininet4.pingLong(src=main.params['PING']['source2'],target=main.params['PING']['target2'])
328 main.Mininet4.pingLong(src=main.params['PING']['source3'],target=main.params['PING']['target3'])
329 main.Mininet4.pingLong(src=main.params['PING']['source4'],target=main.params['PING']['target4'])
330 main.Mininet4.pingLong(src=main.params['PING']['source5'],target=main.params['PING']['target5'])
331 main.Mininet4.pingLong(src=main.params['PING']['source6'],target=main.params['PING']['target6'])
332 main.Mininet4.pingLong(src=main.params['PING']['source7'],target=main.params['PING']['target7'])
333 main.Mininet4.pingLong(src=main.params['PING']['source8'],target=main.params['PING']['target8'])
334 main.Mininet4.pingLong(src=main.params['PING']['source9'],target=main.params['PING']['target9'])
335 main.Mininet4.pingLong(src=main.params['PING']['source10'],target=main.params['PING']['target10'])
336 main.step("Check that the pings are going")
337 result = main.Mininet4.pingstatus(src=main.params['PING']['source1'])
338 result = result & main.Mininet4.pingstatus(src=main.params['PING']['source2'])
339 result = result & main.Mininet4.pingstatus(src=main.params['PING']['source3'])
340 result = result & main.Mininet4.pingstatus(src=main.params['PING']['source4'])
341 result = result & main.Mininet4.pingstatus(src=main.params['PING']['source5'])
342 result = result & main.Mininet4.pingstatus(src=main.params['PING']['source6'])
343 result = result & main.Mininet4.pingstatus(src=main.params['PING']['source7'])
344 result = result & main.Mininet4.pingstatus(src=main.params['PING']['source8'])
345 result = result & main.Mininet4.pingstatus(src=main.params['PING']['source9'])
346 result = result & main.Mininet4.pingstatus(src=main.params['PING']['source10'])
347 main.step( "Making topo change while flows are rerouting")
348 main.step( "Link down number of iterations: " + main.params['Iterations'] )
349 for i in range(int(main.params['Iterations'])):
350 main.log.info("s1-s2 link down")
351 main.Mininet1.link(END1="s1",END2="s2",OPTION="down")
352 main.Mininet1.link(END1="s1",END2="s3",OPTION="up")
353 main.Mininet1.link(END1="s2",END2="s3",OPTION="up")
354
355 time.sleep(5)
356
357 main.log.info("s1-s2 link up | s1-s3 link down | s2-s3 link down")
358 main.Mininet1.link(END1="s1",END2="s2",OPTION="up")
359 main.Mininet1.link(END1="s1",END2="s3",OPTION="down")
360 main.Mininet1.link(END1="s2",END2="s3",OPTION="down")
361
362 main.log.info( "Waiting " + main.params['WaitTime'] + " seconds.... " )
363 time.sleep( int(main.params['WaitTime']) + 60 )
364
365 main.case("Killing remote ping processes ")
366 result = result & main.Mininet4.pingKill()
367 utilities.assert_equals(expect=main.TRUE,actual=result)
368 main.log.info("Make sure all links in triangle are up")
369 main.Mininet1.link(END1="s1",END2="s2",OPTION="up")
370 main.Mininet1.link(END1="s1",END2="s3",OPTION="up")
371 main.Mininet1.link(END1="s2",END2="s3",OPTION="up")
372
373 def CASE9(self,main) :
374 '''
375 Starts continuous pings on the Mininet nodes
376 '''
377 main.log.report("Start continuous pings, then toggle one link in center triangle and start/stop 1 ONOS node")
378 import time
379 import os
380
381 time.sleep(20)
382 main.case("Starting long ping... ")
383 main.Mininet4.pingLong(src=main.params['PING']['source1'],target=main.params['PING']['target1'])
384 main.Mininet4.pingLong(src=main.params['PING']['source2'],target=main.params['PING']['target2'])
385 main.Mininet4.pingLong(src=main.params['PING']['source3'],target=main.params['PING']['target3'])
386 main.Mininet4.pingLong(src=main.params['PING']['source4'],target=main.params['PING']['target4'])
387 main.Mininet4.pingLong(src=main.params['PING']['source5'],target=main.params['PING']['target5'])
388 main.Mininet4.pingLong(src=main.params['PING']['source6'],target=main.params['PING']['target6'])
389 main.Mininet4.pingLong(src=main.params['PING']['source7'],target=main.params['PING']['target7'])
390 main.Mininet4.pingLong(src=main.params['PING']['source8'],target=main.params['PING']['target8'])
391 main.Mininet4.pingLong(src=main.params['PING']['source9'],target=main.params['PING']['target9'])
392 main.Mininet4.pingLong(src=main.params['PING']['source10'],target=main.params['PING']['target10'])
393 main.step("Check that the pings are going")
394 result = main.Mininet4.pingstatus(src=main.params['PING']['source1'])
395 result = result & main.Mininet4.pingstatus(src=main.params['PING']['source2'])
396 result = result & main.Mininet4.pingstatus(src=main.params['PING']['source3'])
397 result = result & main.Mininet4.pingstatus(src=main.params['PING']['source4'])
398 result = result & main.Mininet4.pingstatus(src=main.params['PING']['source5'])
399 result = result & main.Mininet4.pingstatus(src=main.params['PING']['source6'])
400 result = result & main.Mininet4.pingstatus(src=main.params['PING']['source7'])
401 result = result & main.Mininet4.pingstatus(src=main.params['PING']['source8'])
402 result = result & main.Mininet4.pingstatus(src=main.params['PING']['source9'])
403 result = result & main.Mininet4.pingstatus(src=main.params['PING']['source10'])
404 main.step( "Making topo change while flows are rerouting")
405 main.step( "Link down number of iterations: " + main.params['Iterations'] )
406 for i in range(int(main.params['Iterations'])):
407 main.log.info("s1-s2 link down | Onos 1 down")
408 main.Mininet1.link(END1="s1",END2="s2",OPTION="down")
409 if i % 4 == 0:
410 main.ONOS1.stop()
411 elif i % 4 == 1:
412 main.ONOS2.stop()
413 elif i % 4 == 2:
414 main.ONOS3.stop()
415 else:
416 main.ONOS4.stop()
417
418 time.sleep(5)
419
420 main.log.info("s1-s2 link up | Onos 1 back up")
421 main.Mininet1.link(END1="s1",END2="s2",OPTION="up")
422 if i % 4 == 0:
423 main.ONOS1.start()
424 main.ONOS1.isup()
425 elif i % 4 == 1:
426 main.ONOS2.start()
427 main.ONOS2.isup()
428 elif i % 4 == 2:
429 main.ONOS3.start()
430 main.ONOS3.isup()
431 else:
432 main.ONOS4.start()
433 main.ONOS4.isup()
434
435 main.log.info( "Waiting " + main.params['WaitTime'] + " seconds.... " )
436 time.sleep( int(main.params['WaitTime']) )
437
438 main.case("Killing remote ping processes ")
439 result = result & main.Mininet4.pingKill()
440 utilities.assert_equals(expect=main.TRUE,actual=result)
441
admin1723f1c2014-05-19 16:08:39 -0700442 def CASE66(self, main):
443 main.log.report("Checking ONOS logs for exceptions")
Jon Hall1c4d2742014-05-22 10:57:05 -0700444 count = 0
admin1723f1c2014-05-19 16:08:39 -0700445 check1 = main.ONOS1.check_exceptions()
446 main.log.report("Exceptions in ONOS1 logs: \n" + check1)
447 check2 = main.ONOS2.check_exceptions()
448 main.log.report("Exceptions in ONOS2 logs: \n" + check2)
449 check3 = main.ONOS3.check_exceptions()
450 main.log.report("Exceptions in ONOS3 logs: \n" + check3)
451 check4 = main.ONOS4.check_exceptions()
452 main.log.report("Exceptions in ONOS4 logs: \n" + check4)
Jon Hall1c4d2742014-05-22 10:57:05 -0700453 result = main.TRUE
admin1723f1c2014-05-19 16:08:39 -0700454 if (check1 or check2 or check3 or check4):
Jon Hall1c4d2742014-05-22 10:57:05 -0700455 result = main.FALSE
456 count = len(check1.splitlines()) + len(check2.splitlines()) + len(check3.splitlines()) + len(check4.splitlines())
457 utilities.assert_equals(expect=main.TRUE,actual=result,onpass="No Exceptions found in the logs",onfail=str(count) + " Exceptions were found in the logs")
admin1723f1c2014-05-19 16:08:39 -0700458
459