blob: 17893a14c8ba2a71ed16ad34569e192003883f54 [file] [log] [blame]
adminbae64d82013-08-01 10:50:15 -07001#!/usr/bin/env python
2'''
3Created on 22-Oct-2012
Jon Hall65844a32015-03-09 19:09:37 -07004
adminbae64d82013-08-01 10:50:15 -07005@author: Anil Kumar (anilkumar.s@paxterrasolutions.com)
6
7
8 TestON is free software: you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation, either version 2 of the License, or
11 (at your option) any later version.
12
13 TestON is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
Jon Hall65844a32015-03-09 19:09:37 -070019 along with TestON. If not, see <http://www.gnu.org/licenses/>.
adminbae64d82013-08-01 10:50:15 -070020
21
22
23teston is the main module.
24
25'''
26
27import sys
28import getpass
29import os
30import re
31import __builtin__
32import new
33import xmldict
Jon Hall30b82fa2015-03-04 17:15:43 -080034import importlib
Jon Hall5b586732015-06-11 11:39:39 -070035import threading
adminbae64d82013-08-01 10:50:15 -070036module = new.module("test")
37import openspeak
Hari Krishnabe4b97b2015-07-15 12:19:43 -070038import subprocess
adminbae64d82013-08-01 10:50:15 -070039global path, drivers_path, core_path, tests_path,logs_path
Jon Hall44506242015-07-29 17:40:26 -070040location = os.path.abspath( os.path.dirname( __file__ ) )
41path = re.sub( "(core|bin)$", "", location )
Jon Hall2a5002c2015-08-21 16:49:11 -070042drivers_path = path+"drivers"
adminbae64d82013-08-01 10:50:15 -070043core_path = path+"core"
44tests_path = path+"tests"
45logs_path = path+"logs/"
46config_path = path + "config/"
Jon Hall44506242015-07-29 17:40:26 -070047sys.path.append( path )
48sys.path.append( drivers_path )
49sys.path.append( core_path )
50sys.path.append( tests_path )
adminbae64d82013-08-01 10:50:15 -070051
52from core.utilities import Utilities
kelvin-onlabfb521662015-02-27 09:52:40 -080053from core.Thread import Thread
adminbae64d82013-08-01 10:50:15 -070054
adminbae64d82013-08-01 10:50:15 -070055
56class TestON:
57 '''
kelvin-onlabf70fd542015-05-07 18:41:40 -070058 TestON will initiate the specified test.
59 The main tasks are :
60 * Initiate the required Component handles for the test.
adminbae64d82013-08-01 10:50:15 -070061 * Create Log file Handles.
adminbae64d82013-08-01 10:50:15 -070062 '''
63 def __init__(self,options):
64 '''
65 Initialise the component handles specified in the topology file of the specified test.
adminbae64d82013-08-01 10:50:15 -070066 '''
67 # Initialization of the variables.
68 __builtin__.main = self
adminbae64d82013-08-01 10:50:15 -070069 __builtin__.path = path
70 __builtin__.utilities = Utilities()
71 self.TRUE = 1
72 self.FALSE = 0
73 self.ERROR = -1
kelvin-onlabf70fd542015-05-07 18:41:40 -070074 self.NORESULT = 2
adminbae64d82013-08-01 10:50:15 -070075 self.FAIL = False
76 self.PASS = True
kelvin-onlabf70fd542015-05-07 18:41:40 -070077 self.CASERESULT = self.ERROR
78 self.STEPRESULT = self.NORESULT
79 self.stepResults = []
adminbae64d82013-08-01 10:50:15 -070080 self.init_result = self.TRUE
81 self.testResult = "Summary"
kelvin-onlabf70fd542015-05-07 18:41:40 -070082 self.stepName = ""
83 self.stepCache = ""
Jon Halld61331b2015-02-17 16:35:47 -080084 self.EXPERIMENTAL_MODE = False
adminbae64d82013-08-01 10:50:15 -070085 self.test_target = None
86 self.lastcommand = None
Jon Halld61331b2015-02-17 16:35:47 -080087 self.testDir = tests_path
88 self.configFile = config_path + "teston.cfg"
adminbae64d82013-08-01 10:50:15 -070089 self.parsingClass = "xmlparser"
90 self.parserPath = core_path + "/xmlparser"
91 self.loggerPath = core_path + "/logger"
92 self.loggerClass = "Logger"
93 self.logs_path = logs_path
94 self.driver = ''
kelvin-onlabfb521662015-02-27 09:52:40 -080095 self.Thread = Thread
Jon Hall5b586732015-06-11 11:39:39 -070096 self.cleanupFlag = False
97 self.cleanupLock = threading.Lock()
Jon Hall0fc0d452015-07-14 09:49:58 -070098 self.initiated = False
Jon Hall65844a32015-03-09 19:09:37 -070099
adminbae64d82013-08-01 10:50:15 -0700100 self.configparser()
101 verifyOptions(options)
102 load_logger()
103 self.componentDictionary = {}
104 self.componentDictionary = self.topology ['COMPONENT']
105 self.driversList=[]
106 if type(self.componentDictionary) == str :
107 self.componentDictionary = dict(self.componentDictionary)
Jon Hall65844a32015-03-09 19:09:37 -0700108
adminbae64d82013-08-01 10:50:15 -0700109 for component in self.componentDictionary :
110 self.driversList.append(self.componentDictionary[component]['type'])
Jon Hall65844a32015-03-09 19:09:37 -0700111
adminbae64d82013-08-01 10:50:15 -0700112 self.driversList = list(set(self.driversList)) # Removing duplicates.
113 # Checking the test_target option set for the component or not
114 if type(self.componentDictionary) == dict:
115 for component in self.componentDictionary.keys():
116 if 'test_target' in self.componentDictionary[component].keys():
117 self.test_target = component
Jon Hall65844a32015-03-09 19:09:37 -0700118
Jon Halld61331b2015-02-17 16:35:47 -0800119 # Checking for the openspeak file and test script
adminbae64d82013-08-01 10:50:15 -0700120 self.logger.initlog(self)
121
122 # Creating Drivers Handles
123 initString = "\n"+"*" * 30+"\n CASE INIT \n"+"*" * 30+"\n"
124 self.log.exact(initString)
125 self.driverObject = {}
126 self.random_order = 111 # Random order id to connect the components
127 components_connect_order = {}
128 #component_list.append()
129 if type(self.componentDictionary) == dict:
130 for component in self.componentDictionary.keys():
131 self.componentDictionary[component]['connect_order'] = self.componentDictionary[component]['connect_order'] if ('connect_order' in self.componentDictionary[component].keys()) else str(self.get_random())
132 components_connect_order[component] = eval(self.componentDictionary[component]['connect_order'])
133 #Ordering components based on the connect order.
134 ordered_component_list =sorted(components_connect_order, key=lambda key: components_connect_order[key])
135 print ordered_component_list
adminbae64d82013-08-01 10:50:15 -0700136 for component in ordered_component_list:
137 self.componentInit(component)
138
139 def configparser(self):
140 '''
141 It will parse the config file (teston.cfg) and return as dictionary
142 '''
143 matchFileName = re.match(r'(.*)\.cfg', self.configFile, re.M | re.I)
144 if matchFileName:
145 xml = open(self.configFile).read()
146 try :
147 self.configDict = xmldict.xml_to_dict(xml)
148 return self.configDict
Jon Hall1306a562015-09-04 11:21:24 -0700149 except IOError:
adminbae64d82013-08-01 10:50:15 -0700150 print "There is no such file to parse " + self.configFile
Jon Hall1306a562015-09-04 11:21:24 -0700151 else:
152 print "There is no such file to parse " + self.configFile
kelvin-onlabf70fd542015-05-07 18:41:40 -0700153
adminbae64d82013-08-01 10:50:15 -0700154 def componentInit(self,component):
155 '''
156 This method will initialize specified component
157 '''
158 global driver_options
Jon Hall0fc0d452015-07-14 09:49:58 -0700159 self.initiated = False
adminbae64d82013-08-01 10:50:15 -0700160 self.log.info("Creating component Handle: "+component)
Jon Halld61331b2015-02-17 16:35:47 -0800161 driver_options = {}
adminbae64d82013-08-01 10:50:15 -0700162 if 'COMPONENTS' in self.componentDictionary[component].keys():
163 driver_options =dict(self.componentDictionary[component]['COMPONENTS'])
164
165 driver_options['name']=component
166 driverName = self.componentDictionary[component]['type']
167 driver_options ['type'] = driverName
kelvin-onlabf70fd542015-05-07 18:41:40 -0700168
adminbae64d82013-08-01 10:50:15 -0700169 classPath = self.getDriverPath(driverName.lower())
Jon Hall30b82fa2015-03-04 17:15:43 -0800170 driverModule = importlib.import_module(classPath)
adminbae64d82013-08-01 10:50:15 -0700171 driverClass = getattr(driverModule, driverName)
172 driverObject = driverClass()
kelvin-onlabf70fd542015-05-07 18:41:40 -0700173
Hari Krishnabe4b97b2015-07-15 12:19:43 -0700174 if ( "OCN" in self.componentDictionary[component]['host'] and main.onoscell ):
175 self.componentDictionary[component]['host'] = main.mnIP
176
adminbae64d82013-08-01 10:50:15 -0700177 connect_result = driverObject.connect(user_name = self.componentDictionary[component]['user'] if ('user' in self.componentDictionary[component].keys()) else getpass.getuser(),
178 ip_address= self.componentDictionary[component]['host'] if ('host' in self.componentDictionary[component].keys()) else 'localhost',
179 pwd = self.componentDictionary[component]['password'] if ('password' in self.componentDictionary[component].keys()) else 'changeme',
180 port = self.componentDictionary[component]['port'] if ('port' in self.componentDictionary[component].keys()) else None,
181 options = driver_options)
cameron@onlab.us5cc6a372015-05-11 17:18:07 -0700182
adminbae64d82013-08-01 10:50:15 -0700183 if not connect_result:
Jon Hall166e4a42015-08-10 12:03:41 -0700184 self.log.error("Exiting from the test execution because the connecting to the "+component+" component failed.")
Jon Halld61331b2015-02-17 16:35:47 -0800185 self.exit()
kelvin-onlabf70fd542015-05-07 18:41:40 -0700186
adminbae64d82013-08-01 10:50:15 -0700187 vars(self)[component] = driverObject
Jon Hall0fc0d452015-07-14 09:49:58 -0700188 self.initiated = True
kelvin-onlabf70fd542015-05-07 18:41:40 -0700189
adminbae64d82013-08-01 10:50:15 -0700190 def run(self):
191 '''
kelvin-onlabf70fd542015-05-07 18:41:40 -0700192 The Execution of the test script's cases listed in the Test params file will be done here.
193 And Update each test case result.
194 This method will return TRUE if it executed all the test cases successfully,
adminbae64d82013-08-01 10:50:15 -0700195 else will retun FALSE
196 '''
adminbae64d82013-08-01 10:50:15 -0700197 self.testCaseResult = {}
Jon Halla1185982014-09-15 14:55:10 -0700198 self.TOTAL_TC = 0
adminbae64d82013-08-01 10:50:15 -0700199 self.TOTAL_TC_RUN = 0
Jon Halld61331b2015-02-17 16:35:47 -0800200 self.TOTAL_TC_PLANNED = 0
adminbae64d82013-08-01 10:50:15 -0700201 self.TOTAL_TC_NORESULT = 0
202 self.TOTAL_TC_FAIL = 0
203 self.TOTAL_TC_PASS = 0
Jon Halla1185982014-09-15 14:55:10 -0700204 self.TEST_ITERATION = 0
adminbae64d82013-08-01 10:50:15 -0700205 self.stepCount = 0
kelvin-onlabf70fd542015-05-07 18:41:40 -0700206 self.CASERESULT = self.NORESULT
207
Jon Halld61331b2015-02-17 16:35:47 -0800208 import testparser
adminbae64d82013-08-01 10:50:15 -0700209 testFile = self.tests_path + "/"+self.TEST + "/"+self.TEST + ".py"
210 test = testparser.TestParser(testFile)
211 self.testscript = test.testscript
212 self.code = test.getStepCode()
Jon Hallfebb1c72015-03-05 13:30:09 -0800213 repeat= int(self.params['repeat']) if ('repeat' in self.params) else 1
214 self.TOTAL_TC_PLANNED = len(self.testcases_list)*repeat
kelvin-onlabf70fd542015-05-07 18:41:40 -0700215
adminbae64d82013-08-01 10:50:15 -0700216 result = self.TRUE
Jon Hallfebb1c72015-03-05 13:30:09 -0800217 while(repeat):
Jon Halla1185982014-09-15 14:55:10 -0700218 for self.CurrentTestCaseNumber in self.testcases_list:
Jon Halld61331b2015-02-17 16:35:47 -0800219 result = self.runCase(self.CurrentTestCaseNumber)
Jon Hallfebb1c72015-03-05 13:30:09 -0800220 repeat-=1
adminbae64d82013-08-01 10:50:15 -0700221 return result
kelvin-onlabf70fd542015-05-07 18:41:40 -0700222
Jon Halle234cc42015-08-31 15:26:47 -0700223 def runCase( self, testCaseNumber ):
adminbae64d82013-08-01 10:50:15 -0700224 self.CurrentTestCaseNumber = testCaseNumber
kelvin-onlabf70fd542015-05-07 18:41:40 -0700225 self.CurrentTestCase = ""
226 self.stepResults = []
227 self.stepName = ""
Jon Hall783bbf92015-07-23 14:33:19 -0700228 self.caseExplanation = ""
adminbae64d82013-08-01 10:50:15 -0700229 result = self.TRUE
230 self.stepCount = 0
231 self.EXPERIMENTAL_MODE = self.FALSE
232 self.addCaseHeader()
Jon Halle234cc42015-08-31 15:26:47 -0700233 self.testCaseNumber = str( testCaseNumber )
234 self.CASERESULT = self.NORESULT
adminbae64d82013-08-01 10:50:15 -0700235 stopped = False
236 try :
237 self.stepList = self.code[self.testCaseNumber].keys()
Jon Halld61331b2015-02-17 16:35:47 -0800238 except KeyError:
Jon Halle234cc42015-08-31 15:26:47 -0700239 self.log.error( "There is no Test-Case " + self.testCaseNumber )
Jon Hallfebb1c72015-03-05 13:30:09 -0800240 return self.FALSE
adminbae64d82013-08-01 10:50:15 -0700241 self.stepCount = 0
242 while self.stepCount < len(self.code[self.testCaseNumber].keys()):
243 result = self.runStep(self.stepList,self.code,self.testCaseNumber)
Jon Hallfebb1c72015-03-05 13:30:09 -0800244 if result == self.FALSE:
adminbae64d82013-08-01 10:50:15 -0700245 break
Jon Hallfebb1c72015-03-05 13:30:09 -0800246 elif result == self.TRUE:
adminbae64d82013-08-01 10:50:15 -0700247 continue
Jon Halle234cc42015-08-31 15:26:47 -0700248 if not stopped:
249 if self.CASERESULT == self.TRUE or self.CASERESULT == self.FALSE:
250 # Result was already explitily set somewhere else like skipCase()
251 pass
252 elif all( self.TRUE == i for i in self.stepResults ):
kelvin-onlabf70fd542015-05-07 18:41:40 -0700253 # ALL PASSED
254 self.CASERESULT = self.TRUE
255 elif self.FALSE in self.stepResults:
256 # AT LEAST ONE FAILED
257 self.CASERESULT = self.FALSE
258 elif self.TRUE in self.stepResults:
259 # AT LEAST ONE PASSED
260 self.CASERESULT = self.TRUE
261 else:
262 self.CASERESULT = self.NORESULT
adminbae64d82013-08-01 10:50:15 -0700263 self.testCaseResult[str(self.CurrentTestCaseNumber)] = self.CASERESULT
264 self.logger.updateCaseResults(self)
Jon Hall783bbf92015-07-23 14:33:19 -0700265 self.log.wiki( "<p>" + self.caseExplanation + "</p>" )
266 self.log.summary( self.caseExplanation )
kelvin-onlabf70fd542015-05-07 18:41:40 -0700267 self.log.wiki( "<ul>" )
268 for line in self.stepCache.splitlines():
269 if re.search( " - PASS$", line ):
270 self.log.wiki( "<li>" + line + " <ac:emoticon ac:name=\"tick\" /></li>\n" )
271 elif re.search( " - FAIL$", line ):
272 self.log.wiki( "<li>" + line + " <ac:emoticon ac:name=\"cross\" /></li>\n" )
273 elif re.search( " - No Result$", line ):
274 self.log.wiki( "<li>" + line + " <ac:emoticon ac:name=\"warning\" /></li>\n" )
Jon Hall90627612015-06-09 14:57:02 -0700275 else: # Should only be on fail message
276 self.log.wiki( "<ul><li>" + line + "</li></ul>\n" )
kelvin-onlabf70fd542015-05-07 18:41:40 -0700277 self.log.wiki( "</ul>" )
278 self.log.summary( self.stepCache )
279 self.stepCache = ""
adminbae64d82013-08-01 10:50:15 -0700280 return result
kelvin-onlabf70fd542015-05-07 18:41:40 -0700281
adminbae64d82013-08-01 10:50:15 -0700282 def runStep(self,stepList,code,testCaseNumber):
283 if not cli.pause:
284 try :
285 step = stepList[self.stepCount]
kelvin-onlabf70fd542015-05-07 18:41:40 -0700286 self.STEPRESULT = self.NORESULT
Jon Halle234cc42015-08-31 15:26:47 -0700287 self.onFailMsg = "No on fail message given"
adminbae64d82013-08-01 10:50:15 -0700288 exec code[testCaseNumber][step] in module.__dict__
289 self.stepCount = self.stepCount + 1
kelvin-onlabf70fd542015-05-07 18:41:40 -0700290 if step > 0:
291 self.stepCache += "\t"+str(testCaseNumber)+"."+str(step)+" "+self.stepName+" - "
292 if self.STEPRESULT == self.TRUE:
293 self.stepCache += "PASS\n"
kelvin-onlabf70fd542015-05-07 18:41:40 -0700294 elif self.STEPRESULT == self.FALSE:
295 self.stepCache += "FAIL\n"
Jon Hall8ce34e82015-06-05 10:41:45 -0700296 # TODO: Print the on-fail statement here
Jon Hall90627612015-06-09 14:57:02 -0700297 self.stepCache += "\t\t" + self.onFailMsg + "\n"
kelvin-onlabf70fd542015-05-07 18:41:40 -0700298 else:
299 self.stepCache += "No Result\n"
kelvin-onlabf70fd542015-05-07 18:41:40 -0700300 self.stepResults.append(self.STEPRESULT)
Jon Halle234cc42015-08-31 15:26:47 -0700301 except StopIteration: # Raised in self.skipCase()
302 self.log.warn( "Skipping the rest of CASE" +
303 str( testCaseNumber ) )
304 self.stepResults.append(self.STEPRESULT)
305 self.stepCache += "\t\t" + self.onFailMsg + "\n"
306 self.stepCount = self.stepCount + 1
307 return self.FALSE
Jon Hall5b586732015-06-11 11:39:39 -0700308 except StandardError:
Jon Hall40d2cbd2015-06-03 16:24:29 -0700309 self.log.exception( "\nException in the following section of" +
Jon Halle234cc42015-08-31 15:26:47 -0700310 " code: " + str( testCaseNumber ) + "." +
311 str( step ) + ": " + self.stepName )
Jon Hall63604932015-02-26 17:09:50 -0800312 #print code[testCaseNumber][step]
adminbae64d82013-08-01 10:50:15 -0700313 self.stepCount = self.stepCount + 1
kelvin-onlabf70fd542015-05-07 18:41:40 -0700314 self.logger.updateCaseResults(self)
315 #WIKI results
316 self.log.wiki( "<ul>" )
317 for line in self.stepCache.splitlines():
318 if re.search( " - PASS$", line ):
319 self.log.wiki( "<li>" + line + " <ac:emoticon ac:name=\"tick\" /></li>\n" )
320 elif re.search( " - FAIL$", line ):
321 self.log.wiki( "<li>" + line + " <ac:emoticon ac:name=\"cross\" /></li>\n" )
322 elif re.search( " - No Result$", line ):
323 self.log.wiki( "<li>" + line + " <ac:emoticon ac:name=\"warning\" /></li>\n" )
Jon Hall90627612015-06-09 14:57:02 -0700324 else: # Should only be on fail message
325 self.log.wiki( "<ul><li>" + line + "</li></ul>\n" )
kelvin-onlabf70fd542015-05-07 18:41:40 -0700326 self.log.wiki( "</ul>" )
327 #summary results
328 self.log.summary( self.stepCache )
329 self.stepCache = ""
shahshreya957feaa2015-03-23 16:08:29 -0700330 self.cleanup()
Jon Hall00539b12015-04-03 13:55:46 -0700331 self.exit()
Jon Halle234cc42015-08-31 15:26:47 -0700332 return self.TRUE
adminbae64d82013-08-01 10:50:15 -0700333 if cli.stop:
334 cli.stop = False
335 stopped = True
336 self.TOTAL_TC_NORESULT = self.TOTAL_TC_NORESULT + 1
337 self.testCaseResult[str(self.CurrentTestCaseNumber)] = "Stopped"
338 self.logger.updateCaseResults(self)
339 result = self.cleanup()
Jon Halle234cc42015-08-31 15:26:47 -0700340 return self.FALSE
341
342 def skipCase( self, result="DEFAULT", msg=None ):
343 """
344 Will skip the rest of the code in a test case. The case results will be
345 determined as normal based on completed assertions unless the result
346 argument is given.
347
348 Optional Arguments:
349 result: Case insensite string. Can be 'PASS' or 'FAIL' and will set
350 the case result accordingly.
351 msg: Message to be printed when the case is skipped in the reports.
352 """
353 result = result.upper().strip()
354 if result == "PASS":
355 self.CASERESULT = self.TRUE
356 elif result == "FAIL":
357 self.CASERESULT = self.FALSE
358 self.onFailMsg = "Skipping the rest of this case. "
359 if msg:
360 self.onFailMsg += str( msg )
361 raise StopIteration
kelvin-onlabf70fd542015-05-07 18:41:40 -0700362
adminbae64d82013-08-01 10:50:15 -0700363 def addCaseHeader(self):
364 caseHeader = "\n"+"*" * 30+"\n Result summary for Testcase"+str(self.CurrentTestCaseNumber)+"\n"+"*" * 30+"\n"
Jon Halld61331b2015-02-17 16:35:47 -0800365 self.log.exact(caseHeader)
366 caseHeader = "\n"+"*" * 40 +"\nStart of Test Case"+str(self.CurrentTestCaseNumber)+" : "
adminbae64d82013-08-01 10:50:15 -0700367 for driver in self.componentDictionary.keys():
368 vars(self)[driver+'log'].info(caseHeader)
kelvin-onlabf70fd542015-05-07 18:41:40 -0700369
adminbae64d82013-08-01 10:50:15 -0700370 def addCaseFooter(self):
371 if self.stepCount-1 > 0 :
372 previousStep = " "+str(self.CurrentTestCaseNumber)+"."+str(self.stepCount-1)+": "+ str(self.stepName) + ""
373 stepHeader = "\n"+"*" * 40+"\nEnd of Step "+previousStep+"\n"+"*" * 40+"\n"
kelvin-onlabf70fd542015-05-07 18:41:40 -0700374
adminbae64d82013-08-01 10:50:15 -0700375 caseFooter = "\n"+"*" * 40+"\nEnd of Test case "+str(self.CurrentTestCaseNumber)+"\n"+"*" * 40+"\n"
kelvin-onlabf70fd542015-05-07 18:41:40 -0700376
adminbae64d82013-08-01 10:50:15 -0700377 for driver in self.driversList:
378 vars(self)[driver].write(stepHeader+"\n"+caseFooter)
379
380 def cleanup(self):
381 '''
Jon Hall5b586732015-06-11 11:39:39 -0700382 Print a summary of the current test's results then attempt to release
383 all the component handles and the close opened file handles.
adminbae64d82013-08-01 10:50:15 -0700384
Jon Hall5b586732015-06-11 11:39:39 -0700385 This function shouldbe threadsafe such that cleanup will only be
386 executed once per test.
387
388 This will return TRUE if all the component handles and log handles
389 closed properly, else return FALSE.
adminbae64d82013-08-01 10:50:15 -0700390 '''
391 result = self.TRUE
Jon Hall5b586732015-06-11 11:39:39 -0700392 lock = self.cleanupLock
393 if lock.acquire( False ):
394 try:
395 if self.cleanupFlag is False: # First thread to run this
396 self.cleanupFlag = True
Jon Hall0fc0d452015-07-14 09:49:58 -0700397 if self.initiated:
398 self.logger.testSummary(self)
Jon Hall5b586732015-06-11 11:39:39 -0700399 for component in self.componentDictionary.keys():
400 try :
401 tempObject = vars(self)[component]
402 print "Disconnecting from " + str(tempObject.name) + ": " + \
403 str(tempObject)
404 tempObject.disconnect()
Jon Hall1306a562015-09-04 11:21:24 -0700405 except KeyboardInterrupt:
406 pass
407 except KeyError:
408 # Component not created yet
409 self.log.warn( "Could not find the component " +
410 str( component ) )
411 except StandardError:
Jon Hall5b586732015-06-11 11:39:39 -0700412 self.log.exception( "Exception while disconnecting from " +
413 str( component ) )
414 result = self.FALSE
415 # Closing all the driver's session files
416 for driver in self.componentDictionary.keys():
417 try:
418 vars(self)[driver].close_log_handles()
Jon Hall1306a562015-09-04 11:21:24 -0700419 except KeyboardInterrupt:
420 pass
421 except KeyError:
422 # Component not created yet
423 self.log.warn( "Could not find the component " +
424 str( driver ) + " while trying to" +
425 " close log file" )
426 except StandardError:
Jon Hall5b586732015-06-11 11:39:39 -0700427 self.log.exception( "Exception while closing log files for " +
428 str( driver ) )
429 result = self.FALSE
430 else:
431 pass # Someone else already ran through this function
432 finally:
433 lock.release()
434 else: # Someone already has a lock
435 # NOTE: This could cause problems if we don't release the lock
436 # correctly
437 lock.acquire() # Wait for the other thread to finish
438 # NOTE: If we don't wait, exit could be called while the thread
439 # with the lock is still cleaning up
440 lock.release()
adminbae64d82013-08-01 10:50:15 -0700441 return result
Jon Halld61331b2015-02-17 16:35:47 -0800442
adminbae64d82013-08-01 10:50:15 -0700443 def pause(self):
444 '''
445 This function will pause the test's execution, and will continue after user provide 'resume' command.
446 '''
447 __builtin__.testthread.pause()
kelvin-onlabf70fd542015-05-07 18:41:40 -0700448
adminbae64d82013-08-01 10:50:15 -0700449 def onfail(self,*components):
450 '''
kelvin-onlabf70fd542015-05-07 18:41:40 -0700451 When test step failed, calling all the components onfail.
adminbae64d82013-08-01 10:50:15 -0700452 '''
adminbae64d82013-08-01 10:50:15 -0700453 if not components:
454 try :
455 for component in self.componentDictionary.keys():
456 tempObject = vars(self)[component]
457 result = tempObject.onfail()
Jon Hall1306a562015-09-04 11:21:24 -0700458 except StandardError as e:
adminbae64d82013-08-01 10:50:15 -0700459 print str(e)
460 result = self.FALSE
adminbae64d82013-08-01 10:50:15 -0700461 else:
462 try :
463 for component in components:
464 tempObject = vars(self)[component]
465 result = tempObject.onfail()
Jon Hall1306a562015-09-04 11:21:24 -0700466 except StandardError as e:
adminbae64d82013-08-01 10:50:15 -0700467 print str(e)
468 result = self.FALSE
kelvin-onlabf70fd542015-05-07 18:41:40 -0700469
adminbae64d82013-08-01 10:50:15 -0700470 def getDriverPath(self,driverName):
471 '''
472 Based on the component 'type' specified in the params , this method will find the absolute path ,
473 by recursively searching the name of the component.
474 '''
475 import commands
476
477 cmd = "find "+drivers_path+" -name "+driverName+".py"
478 result = commands.getoutput(cmd)
kelvin-onlabf70fd542015-05-07 18:41:40 -0700479
adminbae64d82013-08-01 10:50:15 -0700480 result_array = str(result).split('\n')
481 result_count = 0
kelvin-onlabf70fd542015-05-07 18:41:40 -0700482
adminbae64d82013-08-01 10:50:15 -0700483 for drivers_list in result_array:
484 result_count = result_count+1
485 if result_count > 1 :
486 print "found "+driverName+" "+ str(result_count) + " times"+str(result_array)
487 self.exit()
kelvin-onlabf70fd542015-05-07 18:41:40 -0700488
adminbae64d82013-08-01 10:50:15 -0700489 result = re.sub("(.*)drivers","",result)
Jon Hall166e4a42015-08-10 12:03:41 -0700490 result = re.sub("\/\/","/",result)
adminbae64d82013-08-01 10:50:15 -0700491 result = re.sub("\.py","",result)
492 result = re.sub("\.pyc","",result)
493 result = re.sub("\/",".",result)
494 result = "drivers"+result
495 return result
adminbae64d82013-08-01 10:50:15 -0700496
497 def step(self,stepDesc):
498 '''
499 The step information of the test-case will append to the logs.
500 '''
501 previousStep = " "+str(self.CurrentTestCaseNumber)+"."+str(self.stepCount-1)+": "+ str(self.stepName) + ""
502 self.stepName = stepDesc
503
504 stepName = " "+str(self.CurrentTestCaseNumber)+"."+str(self.stepCount)+": "+ str(stepDesc) + ""
505 try :
506 if self.stepCount == 0:
507 stepName = " INIT : Initializing the test case :"+self.CurrentTestCase
508 except AttributeError:
509 stepName = " INIT : Initializing the test case :"+str(self.CurrentTestCaseNumber)
kelvin-onlabf70fd542015-05-07 18:41:40 -0700510
adminbae64d82013-08-01 10:50:15 -0700511 self.log.step(stepName)
512 stepHeader = ""
513 if self.stepCount > 1 :
514 stepHeader = "\n"+"-"*45+"\nEnd of Step "+previousStep+"\n"+"-"*45+"\n"
kelvin-onlabf70fd542015-05-07 18:41:40 -0700515
Jon Halld61331b2015-02-17 16:35:47 -0800516 stepHeader += "\n"+"-"*45+"\nStart of Step"+stepName+"\n"+"-"*45+"\n"
adminbae64d82013-08-01 10:50:15 -0700517 for driver in self.componentDictionary.keys():
518 vars(self)[driver+'log'].info(stepHeader)
kelvin-onlabf70fd542015-05-07 18:41:40 -0700519
adminbae64d82013-08-01 10:50:15 -0700520 def case(self,testCaseName):
521 '''
522 Test's each test-case information will append to the logs.
523 '''
Jon Halld61331b2015-02-17 16:35:47 -0800524 self.CurrentTestCase = testCaseName
adminbae64d82013-08-01 10:50:15 -0700525 testCaseName = " " + str(testCaseName) + ""
526 self.log.case(testCaseName)
Jon Halld61331b2015-02-17 16:35:47 -0800527 caseHeader = testCaseName+"\n"+"*" * 40+"\n"
adminbae64d82013-08-01 10:50:15 -0700528 for driver in self.componentDictionary.keys():
529 vars(self)[driver+'log'].info(caseHeader)
kelvin-onlabf70fd542015-05-07 18:41:40 -0700530
adminbae64d82013-08-01 10:50:15 -0700531 def testDesc(self,description):
532 '''
533 Test description will append to the logs.
534 '''
535 description = "Test Description : " + str (description) + ""
536 self.log.info(description)
kelvin-onlabf70fd542015-05-07 18:41:40 -0700537
adminbae64d82013-08-01 10:50:15 -0700538 def _getTest(self):
539 '''
540 This method will parse the test script to find required test information.
541 '''
542 testFile = self.tests_path + "/"+self.TEST + "/"+self.TEST + ".py"
543 testFileHandler = open(testFile, 'r')
544 testFileList = testFileHandler.readlines()
545 testFileHandler.close()
546 #self.TOTAL_TC_PLANNED = 0
547 counter = 0
548 for index in range(len(testFileList)):
549 lineMatch = re.match('\s+def CASE(\d+)(.*):',testFileList[index],0)
550 if lineMatch:
551 counter = counter + 1
Jon Halla1185982014-09-15 14:55:10 -0700552 self.TC_PLANNED = len(self.testcases_list)
kelvin-onlabf70fd542015-05-07 18:41:40 -0700553
adminbae64d82013-08-01 10:50:15 -0700554 def response_parser(self,response, return_format):
555 ''' It will load the default response parser '''
556 response_dict = {}
557 response_dict = self.response_to_dict(response, return_format)
Jon Halld61331b2015-02-17 16:35:47 -0800558 return_format_string = self.dict_to_return_format(response,return_format,response_dict)
adminbae64d82013-08-01 10:50:15 -0700559 return return_format_string
kelvin-onlabf70fd542015-05-07 18:41:40 -0700560
adminbae64d82013-08-01 10:50:15 -0700561 def response_to_dict(self,response,return_format):
adminbae64d82013-08-01 10:50:15 -0700562 response_dict = {}
563 json_match = re.search('^\s*{', response)
564 xml_match = re.search('^\s*\<', response)
565 ini_match = re.search('^\s*\[', response)
566 if json_match :
Jon Hallfebb1c72015-03-05 13:30:09 -0800567 self.log.info(" Response is in 'JSON' format and Converting to '"+return_format+"' format")
Jon Halld61331b2015-02-17 16:35:47 -0800568 # Formatting the json string
adminbae64d82013-08-01 10:50:15 -0700569 response = re.sub(r"{\s*'?(\w)", r'{"\1', response)
570 response = re.sub(r",\s*'?(\w)", r',"\1', response)
571 response = re.sub(r"(\w)'?\s*:", r'\1":', response)
572 response = re.sub(r":\s*'(\w)'\s*([,}])", r':"\1"\2', response)
adminbae64d82013-08-01 10:50:15 -0700573 try :
574 import json
575 response_dict = json.loads(response)
Jon Hall1306a562015-09-04 11:21:24 -0700576 except StandardError:
Jon Hall2a5002c2015-08-21 16:49:11 -0700577 self.log.exception( "Json Parser is unable to parse the string" )
adminbae64d82013-08-01 10:50:15 -0700578 return response_dict
adminbae64d82013-08-01 10:50:15 -0700579 elif ini_match :
Jon Hallfebb1c72015-03-05 13:30:09 -0800580 self.log.info(" Response is in 'INI' format and Converting to '"+return_format+"' format")
adminbae64d82013-08-01 10:50:15 -0700581 from configobj import ConfigObj
582 response_file = open("respnse_file.temp",'w')
583 response_file.write(response)
Jon Halld61331b2015-02-17 16:35:47 -0800584 response_file.close()
adminbae64d82013-08-01 10:50:15 -0700585 response_dict = ConfigObj("respnse_file.temp")
586 return response_dict
adminbae64d82013-08-01 10:50:15 -0700587 elif xml_match :
Jon Hallfebb1c72015-03-05 13:30:09 -0800588 self.log.info(" Response is in 'XML' format and Converting to '"+return_format+"' format")
adminbae64d82013-08-01 10:50:15 -0700589 try :
adminbae64d82013-08-01 10:50:15 -0700590 response_dict = xmldict.xml_to_dict("<response> "+str(response)+" </response>")
Jon Hall1306a562015-09-04 11:21:24 -0700591 except StandardError:
592 self.log.exception()
adminbae64d82013-08-01 10:50:15 -0700593 return response_dict
kelvin-onlabf70fd542015-05-07 18:41:40 -0700594
adminbae64d82013-08-01 10:50:15 -0700595 def dict_to_return_format(self,response,return_format,response_dict):
adminbae64d82013-08-01 10:50:15 -0700596 if return_format =='table' :
597 ''' Will return in table format'''
598 to_do = "Call the table output formatter"
599 global response_table
600 response_table = '\n'
601 response_table = response_table +'\t'.join(response_dict)+"\n"
kelvin-onlabf70fd542015-05-07 18:41:40 -0700602
adminbae64d82013-08-01 10:50:15 -0700603 def get_table(value_to_convert):
604 ''' This will parse the dictionary recusrsively and print as table format'''
605 table_data = ""
606 if type(value_to_convert) == dict :
607 table_data = table_data +'\t'.join(value_to_convert)+"\n"
608 for temp_val in value_to_convert.values() :
609 table_data = table_data + get_table(temp_val)
610 else :
611 table_data = table_data + str(value_to_convert) +"\t"
Jon Halld61331b2015-02-17 16:35:47 -0800612 return table_data
kelvin-onlabf70fd542015-05-07 18:41:40 -0700613
adminbae64d82013-08-01 10:50:15 -0700614 for value in response_dict.values() :
615 response_table = response_table + get_table(value)
Jon Hall88e498c2015-03-06 09:54:35 -0800616 # response_table = response_table + '\t'.join(response_dict.values())
adminbae64d82013-08-01 10:50:15 -0700617 return response_table
kelvin-onlabf70fd542015-05-07 18:41:40 -0700618
adminbae64d82013-08-01 10:50:15 -0700619 elif return_format =='config':
620 ''' Will return in config format'''
621 to_do = 'Call dict to config coverter'
622 response_string = str(response_dict)
623 print response_string
624 response_config = re.sub(",", "\n\t", response_string)
625 response_config = re.sub("u\'", "\'", response_config)
626 response_config = re.sub("{", "", response_config)
627 response_config = re.sub("}", "\n", response_config)
628 response_config = re.sub(":", " =", response_config)
629 return "[response]\n\t "+response_config
adminbae64d82013-08-01 10:50:15 -0700630 elif return_format == 'xml':
631 ''' Will return in xml format'''
adminbae64d82013-08-01 10:50:15 -0700632 response_xml = xmldict.dict_to_xml(response_dict)
633 response_xml = re.sub(">\s*<", ">\n<", response_xml)
634 return "\n"+response_xml
adminbae64d82013-08-01 10:50:15 -0700635 elif return_format == 'json':
636 ''' Will return in json format'''
637 to_do = 'Call dict to xml coverter'
638 import json
639 response_json = json.dumps(response_dict)
640 return response_json
kelvin-onlabf70fd542015-05-07 18:41:40 -0700641
adminbae64d82013-08-01 10:50:15 -0700642 def get_random(self):
643 self.random_order = self.random_order + 1
644 return self.random_order
kelvin-onlabf70fd542015-05-07 18:41:40 -0700645
adminbae64d82013-08-01 10:50:15 -0700646 def exit(self):
647 __builtin__.testthread = None
Jon Hall5b586732015-06-11 11:39:39 -0700648 for thread in threading.enumerate():
649 if thread.isAlive():
650 try:
651 thread._Thread__stop()
652 except:
Jon Hall1306a562015-09-04 11:21:24 -0700653 # NOTE: We should catch any exceptions while trying to
654 # close the thread so that we can try to close the other
655 # threads as well
656 print( str( thread.getName() ) + ' could not be terminated' )
adminbae64d82013-08-01 10:50:15 -0700657 sys.exit()
658
659def verifyOptions(options):
660 '''
661 This will verify the command line options and set to default values, if any option not given in command line.
662 '''
663 import pprint
664 pp = pprint.PrettyPrinter(indent=4)
665
Jon Hall88e498c2015-03-06 09:54:35 -0800666 # pp.pprint(options)
adminbae64d82013-08-01 10:50:15 -0700667 verifyTest(options)
668 verifyExample(options)
669 verifyTestScript(options)
670 verifyParams()
671 verifyLogdir(options)
672 verifyMail(options)
673 verifyTestCases(options)
Hari Krishna03f530e2015-07-10 17:28:27 -0700674 verifyOnosCell(options)
adminbae64d82013-08-01 10:50:15 -0700675
676def verifyTest(options):
Jon Hall44506242015-07-29 17:40:26 -0700677 try:
678 if options.testname:
679 main.TEST = options.testname
680 main.classPath = "tests."+main.TEST+"."+main.TEST
681 main.tests_path = tests_path
682 elif options.example:
683 main.TEST = options.example
684 main.tests_path = path+"/examples/"
685 main.classPath = "examples."+main.TEST+"."+main.TEST
686 except AttributeError:
adminbae64d82013-08-01 10:50:15 -0700687 print "Test or Example not specified please specify the --test <test name > or --example <example name>"
Jon Hall5b586732015-06-11 11:39:39 -0700688 main.exit()
adminbae64d82013-08-01 10:50:15 -0700689
690def verifyExample(options):
691 if options.example:
692 main.testDir = path+'/examples/'
693 main.tests_path = path+"/examples/"
694 main.classPath = "examples."+main.TEST+"."+main.TEST
kelvin-onlabf70fd542015-05-07 18:41:40 -0700695
adminbae64d82013-08-01 10:50:15 -0700696def verifyLogdir(options):
Jon Hall88e498c2015-03-06 09:54:35 -0800697 # Verifying Log directory option
adminbae64d82013-08-01 10:50:15 -0700698 if options.logdir:
699 main.logdir = options.logdir
700 else :
Jon Halld61331b2015-02-17 16:35:47 -0800701 main.logdir = main.FALSE
kelvin-onlabf70fd542015-05-07 18:41:40 -0700702
adminbae64d82013-08-01 10:50:15 -0700703def verifyMail(options):
Jon Halld61331b2015-02-17 16:35:47 -0800704 # Checking the mailing list
adminbae64d82013-08-01 10:50:15 -0700705 if options.mail:
706 main.mail = options.mail
707 elif main.params.has_key('mail'):
708 main.mail = main.params['mail']
709 else :
710 main.mail = 'paxweb@paxterrasolutions.com'
711
712def verifyTestCases(options):
Jon Hall88e498c2015-03-06 09:54:35 -0800713 # Getting Test cases list
adminbae64d82013-08-01 10:50:15 -0700714 if options.testcases:
Jon Hallfebb1c72015-03-05 13:30:09 -0800715 testcases_list = options.testcases
Jon Hall88e498c2015-03-06 09:54:35 -0800716 # sys.exit()
adminbae64d82013-08-01 10:50:15 -0700717 testcases_list = re.sub("(\[|\])", "", options.testcases)
718 main.testcases_list = eval(testcases_list+",")
719 else :
720 if 'testcases' in main.params.keys():
Jon Halla1185982014-09-15 14:55:10 -0700721 temp = eval(main.params['testcases']+",")
722 list1=[]
723 if type(temp[0])==list:
Jon Hallfebb1c72015-03-05 13:30:09 -0800724 for test in temp:
725 for testcase in test:
726 if type(testcase)==int:
727 testcase=[testcase]
728 list1.extend(testcase)
729 else :
730 temp=list(temp)
731 for testcase in temp:
732 if type(testcase)==int:
733 testcase=[testcase]
734 list1.extend(testcase)
735 main.testcases_list=list1
adminbae64d82013-08-01 10:50:15 -0700736 else :
737 print "testcases not specifed in params, please provide in params file or 'testcases' commandline argument"
Jon Halld61331b2015-02-17 16:35:47 -0800738 sys.exit()
kelvin-onlabf70fd542015-05-07 18:41:40 -0700739
Hari Krishna03f530e2015-07-10 17:28:27 -0700740def verifyOnosCell(options):
Hari Krishnabe4b97b2015-07-15 12:19:43 -0700741 # Verifying onoscell option
Hari Krishna03f530e2015-07-10 17:28:27 -0700742 if options.onoscell:
743 main.onoscell = options.onoscell
Hari Krishnabe4b97b2015-07-15 12:19:43 -0700744 main.onosIPs = []
745 main.mnIP = ""
746 cellCMD = ". ~/.profile; cell "+main.onoscell
747 output=subprocess.check_output( ["bash", '-c', cellCMD] )
748 splitOutput = output.splitlines()
749 for i in range( len(splitOutput) ):
750 if( re.match( "OCN", splitOutput[i] ) ):
751 mnNode=splitOutput[i].split("=")
752 main.mnIP = mnNode[1]
753 # cell already sorts OC variables in bash, so no need to sort in TestON
754 if( re.match( "OC[1-9]", splitOutput[i] ) ):
755 onosNodes = splitOutput[i].split("=")
756 main.onosIPs.append( onosNodes[1] )
Hari Krishna03f530e2015-07-10 17:28:27 -0700757 else :
758 main.onoscell = main.FALSE
759
adminbae64d82013-08-01 10:50:15 -0700760def verifyTestScript(options):
761 '''
762 Verifyies test script.
763 '''
Jon Halld61331b2015-02-17 16:35:47 -0800764 main.openspeak = openspeak.OpenSpeak()
adminbae64d82013-08-01 10:50:15 -0700765 openspeakfile = main.testDir+"/" + main.TEST + "/" + main.TEST + ".ospk"
766 testfile = main.testDir+"/" + main.TEST + "/" + main.TEST + ".py"
Jon Hall44506242015-07-29 17:40:26 -0700767 if os.path.exists(openspeakfile):
768 # Openspeak file found, compiling to python
adminbae64d82013-08-01 10:50:15 -0700769 main.openspeak.compiler(openspeakfile=openspeakfile,writetofile=1)
770 elif os.path.exists(testfile):
Jon Hall44506242015-07-29 17:40:26 -0700771 # No openspeak found, using python file instead
772 pass
adminbae64d82013-08-01 10:50:15 -0700773 else:
Jon Hall44506242015-07-29 17:40:26 -0700774 print "\nThere is no \""+main.TEST+"\" test script.\nPlease provide a " +\
775 "Python or OpenSpeak test script in the tests folder: " +\
776 main.testDir+"/" + main.TEST + "/"
adminbae64d82013-08-01 10:50:15 -0700777 __builtin__.testthread = None
778 main.exit()
adminbae64d82013-08-01 10:50:15 -0700779 try :
adminbae64d82013-08-01 10:50:15 -0700780 testModule = __import__(main.classPath, globals(), locals(), [main.TEST], -1)
Jon Hall1306a562015-09-04 11:21:24 -0700781 except ImportError:
Jon Hall44506242015-07-29 17:40:26 -0700782 print "There was an import error, it might mean that there is no test named "+main.TEST
Jon Halld61331b2015-02-17 16:35:47 -0800783 main.exit()
adminbae64d82013-08-01 10:50:15 -0700784
785 testClass = getattr(testModule, main.TEST)
786 main.testObject = testClass()
787 load_parser()
Jon Halld61331b2015-02-17 16:35:47 -0800788 main.params = main.parser.parseParams(main.classPath)
789 main.topology = main.parser.parseTopology(main.classPath)
kelvin-onlabf70fd542015-05-07 18:41:40 -0700790
adminbae64d82013-08-01 10:50:15 -0700791def verifyParams():
792 try :
793 main.params = main.params['PARAMS']
Jon Hall1306a562015-09-04 11:21:24 -0700794 except KeyError:
adminbae64d82013-08-01 10:50:15 -0700795 print "Error with the params file: Either the file not specified or the format is not correct"
Jon Halld61331b2015-02-17 16:35:47 -0800796 main.exit()
adminbae64d82013-08-01 10:50:15 -0700797 try :
798 main.topology = main.topology['TOPOLOGY']
Jon Hall1306a562015-09-04 11:21:24 -0700799 except KeyError:
adminbae64d82013-08-01 10:50:15 -0700800 print "Error with the Topology file: Either the file not specified or the format is not correct"
801 main.exit()
kelvin-onlabf70fd542015-05-07 18:41:40 -0700802
adminbae64d82013-08-01 10:50:15 -0700803def load_parser() :
804 '''
805 It facilitates the loading customised parser for topology and params file.
806 It loads parser mentioned in tab named parser of teston.cfg file.
807 It also loads default xmlparser if no parser have specified in teston.cfg file.
808
809 '''
810 confighash = main.configDict
811 if 'file' in confighash['config']['parser'] and 'class' in confighash['config']['parser']:
Jon Hall44506242015-07-29 17:40:26 -0700812 path = confighash['config']['parser']['file']
813 if path != None or confighash['config']['parser']['class']!= None:
814 try:
815 module = re.sub( r".py\s*$", "", path )
adminbae64d82013-08-01 10:50:15 -0700816 moduleList = module.split("/")
817 newModule = ".".join([moduleList[len(moduleList) - 2],moduleList[len(moduleList) - 1]])
Jon Hall44506242015-07-29 17:40:26 -0700818 parsingClass = confighash['config']['parser']['class']
819 parsingModule = __import__(newModule, globals(), locals(), [parsingClass], -1)
820 parsingClass = getattr(parsingModule, parsingClass)
821 main.parser = parsingClass()
822 #hashobj = main.parser.parseParams(main.classPath)
823 if hasattr(main.parser,"parseParams") and hasattr(main.parser,"parseTopology") and hasattr(main.parser,"parse"):
824 pass
825 else:
826 print "Invalid parser format"
adminbae64d82013-08-01 10:50:15 -0700827 main.exit()
Jon Hall44506242015-07-29 17:40:26 -0700828 except ImportError:
829 print "Could not find the file " + path + " using default parser."
Jon Halld61331b2015-02-17 16:35:47 -0800830 load_defaultParser()
Jon Hall44506242015-07-29 17:40:26 -0700831 elif confighash['config']['parser']['file'] == None or confighash['config']['parser']['class'] == None:
Jon Halld61331b2015-02-17 16:35:47 -0800832 load_defaultParser()
adminbae64d82013-08-01 10:50:15 -0700833 else:
834 load_defaultParser()
835
836def load_defaultParser():
837 '''
838 It will load the default parser which is xml parser to parse the params and topology file.
839 '''
840 moduleList = main.parserPath.split("/")
841 newModule = ".".join([moduleList[len(moduleList) - 2],moduleList[len(moduleList) - 1]])
842 try :
Jon Halld61331b2015-02-17 16:35:47 -0800843 parsingClass = main.parsingClass
adminbae64d82013-08-01 10:50:15 -0700844 parsingModule = __import__(newModule, globals(), locals(), [parsingClass], -1)
845 parsingClass = getattr(parsingModule, parsingClass)
846 main.parser = parsingClass()
847 if hasattr(main.parser,"parseParams") and hasattr(main.parser,"parseTopology") and hasattr(main.parser,"parse") :
848 pass
849 else:
850 main.exit()
851
852 except ImportError:
853 print sys.exc_info()[1]
854
adminbae64d82013-08-01 10:50:15 -0700855def load_logger() :
856 '''
857 It facilitates the loading customised parser for topology and params file.
858 It loads parser mentioned in tab named parser of teston.cfg file.
859 It also loads default xmlparser if no parser have specified in teston.cfg file.
860
861 '''
862 confighash = main.configDict
863 if 'file' in confighash['config']['logger'] and 'class' in confighash['config']['logger']:
Jon Hall44506242015-07-29 17:40:26 -0700864 path = confighash['config']['logger']['file']
865 if path != None or confighash['config']['logger']['class']!= None :
866 try:
867 module = re.sub( r".py\s*$", "", path )
adminbae64d82013-08-01 10:50:15 -0700868 moduleList = module.split("/")
869 newModule = ".".join([moduleList[len(moduleList) - 2],moduleList[len(moduleList) - 1]])
Jon Hall44506242015-07-29 17:40:26 -0700870 loggerClass = confighash['config']['logger']['class']
871 loggerModule = __import__(newModule, globals(), locals(), [loggerClass], -1)
872 loggerClass = getattr(loggerModule, loggerClass)
873 main.logger = loggerClass()
874 #hashobj = main.parser.parseParams(main.classPath)
875 except ImportError:
876 print "Could not find the file " + path + " using default logger."
adminbae64d82013-08-01 10:50:15 -0700877 load_defaultlogger()
Jon Halld61331b2015-02-17 16:35:47 -0800878 elif confighash['config']['parser']['file'] == None or confighash['config']['parser']['class'] == None :
879 load_defaultlogger()
adminbae64d82013-08-01 10:50:15 -0700880 else:
881 load_defaultlogger()
882
883def load_defaultlogger():
884 '''
885 It will load the default parser which is xml parser to parse the params and topology file.
886 '''
887 moduleList = main.loggerPath.split("/")
888 newModule = ".".join([moduleList[len(moduleList) - 2],moduleList[len(moduleList) - 1]])
889 try :
Jon Halld61331b2015-02-17 16:35:47 -0800890 loggerClass = main.loggerClass
adminbae64d82013-08-01 10:50:15 -0700891 loggerModule = __import__(newModule, globals(), locals(), [loggerClass], -1)
892 loggerClass = getattr(loggerModule, loggerClass)
893 main.logger = loggerClass()
894
895 except ImportError:
896 print sys.exc_info()[1]
Jon Halld61331b2015-02-17 16:35:47 -0800897 main.exit()
adminbae64d82013-08-01 10:50:15 -0700898
adminbae64d82013-08-01 10:50:15 -0700899def _echo(self):
900 print "THIS IS ECHO"