blob: fd73efcc68856bb8860e026b94fdf149d769f306 [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
adminbae64d82013-08-01 10:50:15 -070079 self.init_result = self.TRUE
80 self.testResult = "Summary"
kelvin-onlabf70fd542015-05-07 18:41:40 -070081 self.stepName = ""
82 self.stepCache = ""
Jon Halld61331b2015-02-17 16:35:47 -080083 self.EXPERIMENTAL_MODE = False
adminbae64d82013-08-01 10:50:15 -070084 self.test_target = None
85 self.lastcommand = None
Jon Halld61331b2015-02-17 16:35:47 -080086 self.testDir = tests_path
87 self.configFile = config_path + "teston.cfg"
adminbae64d82013-08-01 10:50:15 -070088 self.parsingClass = "xmlparser"
89 self.parserPath = core_path + "/xmlparser"
90 self.loggerPath = core_path + "/logger"
91 self.loggerClass = "Logger"
92 self.logs_path = logs_path
93 self.driver = ''
kelvin-onlabfb521662015-02-27 09:52:40 -080094 self.Thread = Thread
Jon Hall5b586732015-06-11 11:39:39 -070095 self.cleanupFlag = False
96 self.cleanupLock = threading.Lock()
Jon Hall0fc0d452015-07-14 09:49:58 -070097 self.initiated = False
Jon Hall65844a32015-03-09 19:09:37 -070098
adminbae64d82013-08-01 10:50:15 -070099 self.configparser()
100 verifyOptions(options)
101 load_logger()
102 self.componentDictionary = {}
103 self.componentDictionary = self.topology ['COMPONENT']
104 self.driversList=[]
105 if type(self.componentDictionary) == str :
106 self.componentDictionary = dict(self.componentDictionary)
Jon Hall65844a32015-03-09 19:09:37 -0700107
adminbae64d82013-08-01 10:50:15 -0700108 for component in self.componentDictionary :
109 self.driversList.append(self.componentDictionary[component]['type'])
Jon Hall65844a32015-03-09 19:09:37 -0700110
adminbae64d82013-08-01 10:50:15 -0700111 self.driversList = list(set(self.driversList)) # Removing duplicates.
112 # Checking the test_target option set for the component or not
113 if type(self.componentDictionary) == dict:
114 for component in self.componentDictionary.keys():
115 if 'test_target' in self.componentDictionary[component].keys():
116 self.test_target = component
Jon Hall65844a32015-03-09 19:09:37 -0700117
Jon Halld61331b2015-02-17 16:35:47 -0800118 # Checking for the openspeak file and test script
adminbae64d82013-08-01 10:50:15 -0700119 self.logger.initlog(self)
120
121 # Creating Drivers Handles
122 initString = "\n"+"*" * 30+"\n CASE INIT \n"+"*" * 30+"\n"
123 self.log.exact(initString)
124 self.driverObject = {}
125 self.random_order = 111 # Random order id to connect the components
126 components_connect_order = {}
127 #component_list.append()
128 if type(self.componentDictionary) == dict:
129 for component in self.componentDictionary.keys():
130 self.componentDictionary[component]['connect_order'] = self.componentDictionary[component]['connect_order'] if ('connect_order' in self.componentDictionary[component].keys()) else str(self.get_random())
131 components_connect_order[component] = eval(self.componentDictionary[component]['connect_order'])
132 #Ordering components based on the connect order.
133 ordered_component_list =sorted(components_connect_order, key=lambda key: components_connect_order[key])
134 print ordered_component_list
adminbae64d82013-08-01 10:50:15 -0700135 for component in ordered_component_list:
136 self.componentInit(component)
137
138 def configparser(self):
139 '''
140 It will parse the config file (teston.cfg) and return as dictionary
141 '''
142 matchFileName = re.match(r'(.*)\.cfg', self.configFile, re.M | re.I)
143 if matchFileName:
144 xml = open(self.configFile).read()
145 try :
146 self.configDict = xmldict.xml_to_dict(xml)
147 return self.configDict
Jon Hall1306a562015-09-04 11:21:24 -0700148 except IOError:
adminbae64d82013-08-01 10:50:15 -0700149 print "There is no such file to parse " + self.configFile
Jon Hall1306a562015-09-04 11:21:24 -0700150 else:
151 print "There is no such file to parse " + self.configFile
kelvin-onlabf70fd542015-05-07 18:41:40 -0700152
adminbae64d82013-08-01 10:50:15 -0700153 def componentInit(self,component):
154 '''
155 This method will initialize specified component
156 '''
157 global driver_options
Jon Hall0fc0d452015-07-14 09:49:58 -0700158 self.initiated = False
adminbae64d82013-08-01 10:50:15 -0700159 self.log.info("Creating component Handle: "+component)
Jon Halld61331b2015-02-17 16:35:47 -0800160 driver_options = {}
adminbae64d82013-08-01 10:50:15 -0700161 if 'COMPONENTS' in self.componentDictionary[component].keys():
162 driver_options =dict(self.componentDictionary[component]['COMPONENTS'])
163
164 driver_options['name']=component
165 driverName = self.componentDictionary[component]['type']
166 driver_options ['type'] = driverName
kelvin-onlabf70fd542015-05-07 18:41:40 -0700167
adminbae64d82013-08-01 10:50:15 -0700168 classPath = self.getDriverPath(driverName.lower())
Jon Hall30b82fa2015-03-04 17:15:43 -0800169 driverModule = importlib.import_module(classPath)
adminbae64d82013-08-01 10:50:15 -0700170 driverClass = getattr(driverModule, driverName)
171 driverObject = driverClass()
kelvin-onlabf70fd542015-05-07 18:41:40 -0700172
Hari Krishnabe4b97b2015-07-15 12:19:43 -0700173 if ( "OCN" in self.componentDictionary[component]['host'] and main.onoscell ):
174 self.componentDictionary[component]['host'] = main.mnIP
175
adminbae64d82013-08-01 10:50:15 -0700176 connect_result = driverObject.connect(user_name = self.componentDictionary[component]['user'] if ('user' in self.componentDictionary[component].keys()) else getpass.getuser(),
177 ip_address= self.componentDictionary[component]['host'] if ('host' in self.componentDictionary[component].keys()) else 'localhost',
178 pwd = self.componentDictionary[component]['password'] if ('password' in self.componentDictionary[component].keys()) else 'changeme',
179 port = self.componentDictionary[component]['port'] if ('port' in self.componentDictionary[component].keys()) else None,
180 options = driver_options)
cameron@onlab.us5cc6a372015-05-11 17:18:07 -0700181
adminbae64d82013-08-01 10:50:15 -0700182 if not connect_result:
Jon Hall166e4a42015-08-10 12:03:41 -0700183 self.log.error("Exiting from the test execution because the connecting to the "+component+" component failed.")
Jon Halld61331b2015-02-17 16:35:47 -0800184 self.exit()
kelvin-onlabf70fd542015-05-07 18:41:40 -0700185
adminbae64d82013-08-01 10:50:15 -0700186 vars(self)[component] = driverObject
Jon Hall0fc0d452015-07-14 09:49:58 -0700187 self.initiated = True
kelvin-onlabf70fd542015-05-07 18:41:40 -0700188
adminbae64d82013-08-01 10:50:15 -0700189 def run(self):
190 '''
kelvin-onlabf70fd542015-05-07 18:41:40 -0700191 The Execution of the test script's cases listed in the Test params file will be done here.
192 And Update each test case result.
193 This method will return TRUE if it executed all the test cases successfully,
adminbae64d82013-08-01 10:50:15 -0700194 else will retun FALSE
195 '''
adminbae64d82013-08-01 10:50:15 -0700196 self.testCaseResult = {}
Jon Halla1185982014-09-15 14:55:10 -0700197 self.TOTAL_TC = 0
adminbae64d82013-08-01 10:50:15 -0700198 self.TOTAL_TC_RUN = 0
Jon Halld61331b2015-02-17 16:35:47 -0800199 self.TOTAL_TC_PLANNED = 0
adminbae64d82013-08-01 10:50:15 -0700200 self.TOTAL_TC_NORESULT = 0
201 self.TOTAL_TC_FAIL = 0
202 self.TOTAL_TC_PASS = 0
Jon Halla1185982014-09-15 14:55:10 -0700203 self.TEST_ITERATION = 0
Jon Hall5a72b712015-09-28 12:20:59 -0700204 self.stepCount = 0 # NOTE: number of main.step statements in the
205 # outer most level of the test case. used to
206 # execute code in smaller steps
kelvin-onlabf70fd542015-05-07 18:41:40 -0700207 self.CASERESULT = self.NORESULT
208
Jon Halld61331b2015-02-17 16:35:47 -0800209 import testparser
adminbae64d82013-08-01 10:50:15 -0700210 testFile = self.tests_path + "/"+self.TEST + "/"+self.TEST + ".py"
211 test = testparser.TestParser(testFile)
212 self.testscript = test.testscript
213 self.code = test.getStepCode()
Jon Hallfebb1c72015-03-05 13:30:09 -0800214 repeat= int(self.params['repeat']) if ('repeat' in self.params) else 1
215 self.TOTAL_TC_PLANNED = len(self.testcases_list)*repeat
kelvin-onlabf70fd542015-05-07 18:41:40 -0700216
adminbae64d82013-08-01 10:50:15 -0700217 result = self.TRUE
Jon Hallfebb1c72015-03-05 13:30:09 -0800218 while(repeat):
Jon Halla1185982014-09-15 14:55:10 -0700219 for self.CurrentTestCaseNumber in self.testcases_list:
Jon Halld61331b2015-02-17 16:35:47 -0800220 result = self.runCase(self.CurrentTestCaseNumber)
Jon Hallfebb1c72015-03-05 13:30:09 -0800221 repeat-=1
adminbae64d82013-08-01 10:50:15 -0700222 return result
kelvin-onlabf70fd542015-05-07 18:41:40 -0700223
Jon Halle234cc42015-08-31 15:26:47 -0700224 def runCase( self, testCaseNumber ):
adminbae64d82013-08-01 10:50:15 -0700225 self.CurrentTestCaseNumber = testCaseNumber
kelvin-onlabf70fd542015-05-07 18:41:40 -0700226 self.CurrentTestCase = ""
Jon Hall5a72b712015-09-28 12:20:59 -0700227 self.stepResultsList = [] # List of step results in a case. ANDed together to get the result
kelvin-onlabf70fd542015-05-07 18:41:40 -0700228 self.stepName = ""
Jon Hall783bbf92015-07-23 14:33:19 -0700229 self.caseExplanation = ""
adminbae64d82013-08-01 10:50:15 -0700230 result = self.TRUE
Jon Hall5a72b712015-09-28 12:20:59 -0700231 self.stepCount = 0 # NOTE: number of main.step statements in the
232 # outer most level of the test case. used to
233 # execute code in smaller steps
234 self.stepNumber = 0 # NOTE: This is the current number of
235 # main.step()'s executed in a case. Used for logging.
adminbae64d82013-08-01 10:50:15 -0700236 self.EXPERIMENTAL_MODE = self.FALSE
237 self.addCaseHeader()
Jon Halle234cc42015-08-31 15:26:47 -0700238 self.testCaseNumber = str( testCaseNumber )
239 self.CASERESULT = self.NORESULT
adminbae64d82013-08-01 10:50:15 -0700240 stopped = False
Jon Hall5a72b712015-09-28 12:20:59 -0700241 try:
242 self.code[self.testCaseNumber]
Jon Halld61331b2015-02-17 16:35:47 -0800243 except KeyError:
Jon Halle234cc42015-08-31 15:26:47 -0700244 self.log.error( "There is no Test-Case " + self.testCaseNumber )
Jon Hallfebb1c72015-03-05 13:30:09 -0800245 return self.FALSE
adminbae64d82013-08-01 10:50:15 -0700246 self.stepCount = 0
247 while self.stepCount < len(self.code[self.testCaseNumber].keys()):
Jon Hall5a72b712015-09-28 12:20:59 -0700248 result = self.runStep(self.code,self.testCaseNumber)
Jon Hallfebb1c72015-03-05 13:30:09 -0800249 if result == self.FALSE:
adminbae64d82013-08-01 10:50:15 -0700250 break
Jon Hallfebb1c72015-03-05 13:30:09 -0800251 elif result == self.TRUE:
adminbae64d82013-08-01 10:50:15 -0700252 continue
Jon Hall5a72b712015-09-28 12:20:59 -0700253 # stepResults format: ( stepNo[], stepName[], stepResult[], onFail[] )
254 stepResults = self.stepResultsList
Jon Halle234cc42015-08-31 15:26:47 -0700255 if not stopped:
256 if self.CASERESULT == self.TRUE or self.CASERESULT == self.FALSE:
257 # Result was already explitily set somewhere else like skipCase()
258 pass
Jon Hall5a72b712015-09-28 12:20:59 -0700259 elif all( self.TRUE == i for i in stepResults ):
kelvin-onlabf70fd542015-05-07 18:41:40 -0700260 # ALL PASSED
261 self.CASERESULT = self.TRUE
Jon Hall5a72b712015-09-28 12:20:59 -0700262 elif self.FALSE in stepResults:
kelvin-onlabf70fd542015-05-07 18:41:40 -0700263 # AT LEAST ONE FAILED
264 self.CASERESULT = self.FALSE
Jon Hall5a72b712015-09-28 12:20:59 -0700265 elif self.TRUE in stepResults:
kelvin-onlabf70fd542015-05-07 18:41:40 -0700266 # AT LEAST ONE PASSED
267 self.CASERESULT = self.TRUE
268 else:
269 self.CASERESULT = self.NORESULT
adminbae64d82013-08-01 10:50:15 -0700270 self.testCaseResult[str(self.CurrentTestCaseNumber)] = self.CASERESULT
271 self.logger.updateCaseResults(self)
Jon Hall783bbf92015-07-23 14:33:19 -0700272 self.log.wiki( "<p>" + self.caseExplanation + "</p>" )
273 self.log.summary( self.caseExplanation )
kelvin-onlabf70fd542015-05-07 18:41:40 -0700274 self.log.wiki( "<ul>" )
275 for line in self.stepCache.splitlines():
276 if re.search( " - PASS$", line ):
277 self.log.wiki( "<li>" + line + " <ac:emoticon ac:name=\"tick\" /></li>\n" )
278 elif re.search( " - FAIL$", line ):
279 self.log.wiki( "<li>" + line + " <ac:emoticon ac:name=\"cross\" /></li>\n" )
280 elif re.search( " - No Result$", line ):
281 self.log.wiki( "<li>" + line + " <ac:emoticon ac:name=\"warning\" /></li>\n" )
Jon Hall90627612015-06-09 14:57:02 -0700282 else: # Should only be on fail message
283 self.log.wiki( "<ul><li>" + line + "</li></ul>\n" )
kelvin-onlabf70fd542015-05-07 18:41:40 -0700284 self.log.wiki( "</ul>" )
285 self.log.summary( self.stepCache )
286 self.stepCache = ""
adminbae64d82013-08-01 10:50:15 -0700287 return result
kelvin-onlabf70fd542015-05-07 18:41:40 -0700288
Jon Hall5a72b712015-09-28 12:20:59 -0700289 def runStep(self,code,testCaseNumber):
adminbae64d82013-08-01 10:50:15 -0700290 if not cli.pause:
Jon Hall5a72b712015-09-28 12:20:59 -0700291 try:
292 step = self.stepCount
293 # stepResults format: ( stepNo, stepName, stepResult, onFail )
294 # NOTE: This is needed to catch results of main.step()'s
295 # called inside functions or loops
296 self.stepResults = ( [], [], [], [] )
adminbae64d82013-08-01 10:50:15 -0700297 exec code[testCaseNumber][step] in module.__dict__
298 self.stepCount = self.stepCount + 1
Jon Hall5a72b712015-09-28 12:20:59 -0700299
300 # Iterate through each of the steps and print them
301 for index in range( len( self.stepResults[0] ) ):
302 # stepResults needs ( stepNo, stepName, stepResult, onFail )
303 stepNo = self.stepResults[0][ index ]
304 stepName = self.stepResults[1][ index ]
305 stepResult = self.stepResults[2][ index ]
306 onFail = self.stepResults[3][ index ]
307 self.stepCache += "\t" + str( testCaseNumber ) + "."
308 self.stepCache += str( stepNo ) + " "
309 self.stepCache += stepName + " - "
310 if stepResult == self.TRUE:
kelvin-onlabf70fd542015-05-07 18:41:40 -0700311 self.stepCache += "PASS\n"
Jon Hall5a72b712015-09-28 12:20:59 -0700312 elif stepResult == self.FALSE:
kelvin-onlabf70fd542015-05-07 18:41:40 -0700313 self.stepCache += "FAIL\n"
Jon Hall5a72b712015-09-28 12:20:59 -0700314 self.stepCache += "\t\t" + onFail + "\n"
kelvin-onlabf70fd542015-05-07 18:41:40 -0700315 else:
316 self.stepCache += "No Result\n"
Jon Hall5a72b712015-09-28 12:20:59 -0700317 self.stepResultsList.append(stepResult)
Jon Halle234cc42015-08-31 15:26:47 -0700318 except StopIteration: # Raised in self.skipCase()
319 self.log.warn( "Skipping the rest of CASE" +
320 str( testCaseNumber ) )
Jon Hall5a72b712015-09-28 12:20:59 -0700321 self.stepResultsList.append(self.STEPRESULT)
Jon Halle234cc42015-08-31 15:26:47 -0700322 self.stepCache += "\t\t" + self.onFailMsg + "\n"
323 self.stepCount = self.stepCount + 1
324 return self.FALSE
Jon Hall5b586732015-06-11 11:39:39 -0700325 except StandardError:
Jon Hall5a72b712015-09-28 12:20:59 -0700326 stepNo = self.stepResults[0][ self.stepNumber - 1]
327 stepName = self.stepResults[1][ self.stepNumber - 1 ]
Jon Hall40d2cbd2015-06-03 16:24:29 -0700328 self.log.exception( "\nException in the following section of" +
Jon Halle234cc42015-08-31 15:26:47 -0700329 " code: " + str( testCaseNumber ) + "." +
Jon Hall5a72b712015-09-28 12:20:59 -0700330 str( stepNo ) + ": " + stepName )
adminbae64d82013-08-01 10:50:15 -0700331 self.stepCount = self.stepCount + 1
kelvin-onlabf70fd542015-05-07 18:41:40 -0700332 self.logger.updateCaseResults(self)
333 #WIKI results
334 self.log.wiki( "<ul>" )
335 for line in self.stepCache.splitlines():
336 if re.search( " - PASS$", line ):
337 self.log.wiki( "<li>" + line + " <ac:emoticon ac:name=\"tick\" /></li>\n" )
338 elif re.search( " - FAIL$", line ):
339 self.log.wiki( "<li>" + line + " <ac:emoticon ac:name=\"cross\" /></li>\n" )
340 elif re.search( " - No Result$", line ):
341 self.log.wiki( "<li>" + line + " <ac:emoticon ac:name=\"warning\" /></li>\n" )
Jon Hall90627612015-06-09 14:57:02 -0700342 else: # Should only be on fail message
343 self.log.wiki( "<ul><li>" + line + "</li></ul>\n" )
kelvin-onlabf70fd542015-05-07 18:41:40 -0700344 self.log.wiki( "</ul>" )
345 #summary results
346 self.log.summary( self.stepCache )
347 self.stepCache = ""
shahshreya957feaa2015-03-23 16:08:29 -0700348 self.cleanup()
Jon Hall00539b12015-04-03 13:55:46 -0700349 self.exit()
Jon Halle234cc42015-08-31 15:26:47 -0700350 return self.TRUE
adminbae64d82013-08-01 10:50:15 -0700351 if cli.stop:
352 cli.stop = False
353 stopped = True
354 self.TOTAL_TC_NORESULT = self.TOTAL_TC_NORESULT + 1
355 self.testCaseResult[str(self.CurrentTestCaseNumber)] = "Stopped"
356 self.logger.updateCaseResults(self)
357 result = self.cleanup()
Jon Halle234cc42015-08-31 15:26:47 -0700358 return self.FALSE
359
360 def skipCase( self, result="DEFAULT", msg=None ):
361 """
362 Will skip the rest of the code in a test case. The case results will be
363 determined as normal based on completed assertions unless the result
364 argument is given.
365
366 Optional Arguments:
367 result: Case insensite string. Can be 'PASS' or 'FAIL' and will set
368 the case result accordingly.
369 msg: Message to be printed when the case is skipped in the reports.
370 """
371 result = result.upper().strip()
372 if result == "PASS":
373 self.CASERESULT = self.TRUE
374 elif result == "FAIL":
375 self.CASERESULT = self.FALSE
376 self.onFailMsg = "Skipping the rest of this case. "
377 if msg:
378 self.onFailMsg += str( msg )
379 raise StopIteration
kelvin-onlabf70fd542015-05-07 18:41:40 -0700380
adminbae64d82013-08-01 10:50:15 -0700381 def addCaseHeader(self):
382 caseHeader = "\n"+"*" * 30+"\n Result summary for Testcase"+str(self.CurrentTestCaseNumber)+"\n"+"*" * 30+"\n"
Jon Halld61331b2015-02-17 16:35:47 -0800383 self.log.exact(caseHeader)
384 caseHeader = "\n"+"*" * 40 +"\nStart of Test Case"+str(self.CurrentTestCaseNumber)+" : "
adminbae64d82013-08-01 10:50:15 -0700385 for driver in self.componentDictionary.keys():
386 vars(self)[driver+'log'].info(caseHeader)
kelvin-onlabf70fd542015-05-07 18:41:40 -0700387
adminbae64d82013-08-01 10:50:15 -0700388 def addCaseFooter(self):
Jon Hall5a72b712015-09-28 12:20:59 -0700389 stepNo = self.stepResults[0][-2]
390 if stepNo > 0 :
391 previousStep = " "+str(self.CurrentTestCaseNumber)+"."+str(stepNo)+": "+ str(self.stepName) + ""
adminbae64d82013-08-01 10:50:15 -0700392 stepHeader = "\n"+"*" * 40+"\nEnd of Step "+previousStep+"\n"+"*" * 40+"\n"
kelvin-onlabf70fd542015-05-07 18:41:40 -0700393
adminbae64d82013-08-01 10:50:15 -0700394 caseFooter = "\n"+"*" * 40+"\nEnd of Test case "+str(self.CurrentTestCaseNumber)+"\n"+"*" * 40+"\n"
kelvin-onlabf70fd542015-05-07 18:41:40 -0700395
adminbae64d82013-08-01 10:50:15 -0700396 for driver in self.driversList:
397 vars(self)[driver].write(stepHeader+"\n"+caseFooter)
398
399 def cleanup(self):
400 '''
Jon Hall5b586732015-06-11 11:39:39 -0700401 Print a summary of the current test's results then attempt to release
402 all the component handles and the close opened file handles.
adminbae64d82013-08-01 10:50:15 -0700403
Jon Hall5b586732015-06-11 11:39:39 -0700404 This function shouldbe threadsafe such that cleanup will only be
405 executed once per test.
406
407 This will return TRUE if all the component handles and log handles
408 closed properly, else return FALSE.
adminbae64d82013-08-01 10:50:15 -0700409 '''
410 result = self.TRUE
Jon Hall5b586732015-06-11 11:39:39 -0700411 lock = self.cleanupLock
412 if lock.acquire( False ):
413 try:
414 if self.cleanupFlag is False: # First thread to run this
415 self.cleanupFlag = True
Jon Hall0fc0d452015-07-14 09:49:58 -0700416 if self.initiated:
417 self.logger.testSummary(self)
Jon Hall5b586732015-06-11 11:39:39 -0700418 for component in self.componentDictionary.keys():
419 try :
420 tempObject = vars(self)[component]
421 print "Disconnecting from " + str(tempObject.name) + ": " + \
422 str(tempObject)
423 tempObject.disconnect()
Jon Hall1306a562015-09-04 11:21:24 -0700424 except KeyboardInterrupt:
425 pass
426 except KeyError:
427 # Component not created yet
428 self.log.warn( "Could not find the component " +
429 str( component ) )
430 except StandardError:
Jon Hall5b586732015-06-11 11:39:39 -0700431 self.log.exception( "Exception while disconnecting from " +
432 str( component ) )
433 result = self.FALSE
434 # Closing all the driver's session files
435 for driver in self.componentDictionary.keys():
436 try:
437 vars(self)[driver].close_log_handles()
Jon Hall1306a562015-09-04 11:21:24 -0700438 except KeyboardInterrupt:
439 pass
440 except KeyError:
441 # Component not created yet
442 self.log.warn( "Could not find the component " +
443 str( driver ) + " while trying to" +
444 " close log file" )
445 except StandardError:
Jon Hall5b586732015-06-11 11:39:39 -0700446 self.log.exception( "Exception while closing log files for " +
447 str( driver ) )
448 result = self.FALSE
449 else:
450 pass # Someone else already ran through this function
451 finally:
452 lock.release()
453 else: # Someone already has a lock
454 # NOTE: This could cause problems if we don't release the lock
455 # correctly
456 lock.acquire() # Wait for the other thread to finish
457 # NOTE: If we don't wait, exit could be called while the thread
458 # with the lock is still cleaning up
459 lock.release()
adminbae64d82013-08-01 10:50:15 -0700460 return result
Jon Halld61331b2015-02-17 16:35:47 -0800461
adminbae64d82013-08-01 10:50:15 -0700462 def pause(self):
463 '''
464 This function will pause the test's execution, and will continue after user provide 'resume' command.
465 '''
466 __builtin__.testthread.pause()
kelvin-onlabf70fd542015-05-07 18:41:40 -0700467
adminbae64d82013-08-01 10:50:15 -0700468 def onfail(self,*components):
469 '''
kelvin-onlabf70fd542015-05-07 18:41:40 -0700470 When test step failed, calling all the components onfail.
adminbae64d82013-08-01 10:50:15 -0700471 '''
adminbae64d82013-08-01 10:50:15 -0700472 if not components:
473 try :
474 for component in self.componentDictionary.keys():
475 tempObject = vars(self)[component]
476 result = tempObject.onfail()
Jon Hall1306a562015-09-04 11:21:24 -0700477 except StandardError as e:
adminbae64d82013-08-01 10:50:15 -0700478 print str(e)
479 result = self.FALSE
adminbae64d82013-08-01 10:50:15 -0700480 else:
481 try :
482 for component in components:
483 tempObject = vars(self)[component]
484 result = tempObject.onfail()
Jon Hall1306a562015-09-04 11:21:24 -0700485 except StandardError as e:
adminbae64d82013-08-01 10:50:15 -0700486 print str(e)
487 result = self.FALSE
kelvin-onlabf70fd542015-05-07 18:41:40 -0700488
adminbae64d82013-08-01 10:50:15 -0700489 def getDriverPath(self,driverName):
490 '''
491 Based on the component 'type' specified in the params , this method will find the absolute path ,
492 by recursively searching the name of the component.
493 '''
494 import commands
495
496 cmd = "find "+drivers_path+" -name "+driverName+".py"
497 result = commands.getoutput(cmd)
kelvin-onlabf70fd542015-05-07 18:41:40 -0700498
adminbae64d82013-08-01 10:50:15 -0700499 result_array = str(result).split('\n')
500 result_count = 0
kelvin-onlabf70fd542015-05-07 18:41:40 -0700501
adminbae64d82013-08-01 10:50:15 -0700502 for drivers_list in result_array:
503 result_count = result_count+1
504 if result_count > 1 :
505 print "found "+driverName+" "+ str(result_count) + " times"+str(result_array)
506 self.exit()
kelvin-onlabf70fd542015-05-07 18:41:40 -0700507
adminbae64d82013-08-01 10:50:15 -0700508 result = re.sub("(.*)drivers","",result)
Jon Hall166e4a42015-08-10 12:03:41 -0700509 result = re.sub("\/\/","/",result)
adminbae64d82013-08-01 10:50:15 -0700510 result = re.sub("\.py","",result)
511 result = re.sub("\.pyc","",result)
512 result = re.sub("\/",".",result)
513 result = "drivers"+result
514 return result
adminbae64d82013-08-01 10:50:15 -0700515
516 def step(self,stepDesc):
517 '''
518 The step information of the test-case will append to the logs.
519 '''
Jon Hall5a72b712015-09-28 12:20:59 -0700520 previousStep = " "+str(self.CurrentTestCaseNumber)+"."+str(self.stepNumber)+": "+ str(self.stepName) + ""
adminbae64d82013-08-01 10:50:15 -0700521 self.stepName = stepDesc
Jon Hall5a72b712015-09-28 12:20:59 -0700522 self.stepNumber += 1
523 self.stepResults[0].append( self.stepNumber )
524 self.stepResults[1].append( stepDesc )
525 self.stepResults[2].append( self.NORESULT )
526 self.stepResults[3].append( "No on fail message given" )
adminbae64d82013-08-01 10:50:15 -0700527
Jon Hall5a72b712015-09-28 12:20:59 -0700528 stepName = " "+str(self.CurrentTestCaseNumber)+"."+str(self.stepNumber)+": "+ str(stepDesc) + ""
adminbae64d82013-08-01 10:50:15 -0700529 self.log.step(stepName)
530 stepHeader = ""
Jon Hall5a72b712015-09-28 12:20:59 -0700531 if self.stepNumber > 1 :
adminbae64d82013-08-01 10:50:15 -0700532 stepHeader = "\n"+"-"*45+"\nEnd of Step "+previousStep+"\n"+"-"*45+"\n"
Jon Halld61331b2015-02-17 16:35:47 -0800533 stepHeader += "\n"+"-"*45+"\nStart of Step"+stepName+"\n"+"-"*45+"\n"
adminbae64d82013-08-01 10:50:15 -0700534 for driver in self.componentDictionary.keys():
535 vars(self)[driver+'log'].info(stepHeader)
kelvin-onlabf70fd542015-05-07 18:41:40 -0700536
adminbae64d82013-08-01 10:50:15 -0700537 def case(self,testCaseName):
538 '''
539 Test's each test-case information will append to the logs.
540 '''
Jon Halld61331b2015-02-17 16:35:47 -0800541 self.CurrentTestCase = testCaseName
Jon Hall5a72b712015-09-28 12:20:59 -0700542 testCaseName = " " + str(testCaseName)
adminbae64d82013-08-01 10:50:15 -0700543 self.log.case(testCaseName)
Jon Halld61331b2015-02-17 16:35:47 -0800544 caseHeader = testCaseName+"\n"+"*" * 40+"\n"
adminbae64d82013-08-01 10:50:15 -0700545 for driver in self.componentDictionary.keys():
546 vars(self)[driver+'log'].info(caseHeader)
kelvin-onlabf70fd542015-05-07 18:41:40 -0700547
adminbae64d82013-08-01 10:50:15 -0700548 def testDesc(self,description):
549 '''
550 Test description will append to the logs.
551 '''
552 description = "Test Description : " + str (description) + ""
553 self.log.info(description)
kelvin-onlabf70fd542015-05-07 18:41:40 -0700554
adminbae64d82013-08-01 10:50:15 -0700555 def _getTest(self):
556 '''
557 This method will parse the test script to find required test information.
558 '''
559 testFile = self.tests_path + "/"+self.TEST + "/"+self.TEST + ".py"
560 testFileHandler = open(testFile, 'r')
561 testFileList = testFileHandler.readlines()
562 testFileHandler.close()
563 #self.TOTAL_TC_PLANNED = 0
564 counter = 0
565 for index in range(len(testFileList)):
566 lineMatch = re.match('\s+def CASE(\d+)(.*):',testFileList[index],0)
567 if lineMatch:
568 counter = counter + 1
Jon Halla1185982014-09-15 14:55:10 -0700569 self.TC_PLANNED = len(self.testcases_list)
kelvin-onlabf70fd542015-05-07 18:41:40 -0700570
adminbae64d82013-08-01 10:50:15 -0700571 def response_parser(self,response, return_format):
572 ''' It will load the default response parser '''
573 response_dict = {}
574 response_dict = self.response_to_dict(response, return_format)
Jon Halld61331b2015-02-17 16:35:47 -0800575 return_format_string = self.dict_to_return_format(response,return_format,response_dict)
adminbae64d82013-08-01 10:50:15 -0700576 return return_format_string
kelvin-onlabf70fd542015-05-07 18:41:40 -0700577
adminbae64d82013-08-01 10:50:15 -0700578 def response_to_dict(self,response,return_format):
adminbae64d82013-08-01 10:50:15 -0700579 response_dict = {}
580 json_match = re.search('^\s*{', response)
581 xml_match = re.search('^\s*\<', response)
582 ini_match = re.search('^\s*\[', response)
583 if json_match :
Jon Hallfebb1c72015-03-05 13:30:09 -0800584 self.log.info(" Response is in 'JSON' format and Converting to '"+return_format+"' format")
Jon Halld61331b2015-02-17 16:35:47 -0800585 # Formatting the json string
adminbae64d82013-08-01 10:50:15 -0700586 response = re.sub(r"{\s*'?(\w)", r'{"\1', response)
587 response = re.sub(r",\s*'?(\w)", r',"\1', response)
588 response = re.sub(r"(\w)'?\s*:", r'\1":', response)
589 response = re.sub(r":\s*'(\w)'\s*([,}])", r':"\1"\2', response)
adminbae64d82013-08-01 10:50:15 -0700590 try :
591 import json
592 response_dict = json.loads(response)
Jon Hall1306a562015-09-04 11:21:24 -0700593 except StandardError:
Jon Hall2a5002c2015-08-21 16:49:11 -0700594 self.log.exception( "Json Parser is unable to parse the string" )
adminbae64d82013-08-01 10:50:15 -0700595 return response_dict
adminbae64d82013-08-01 10:50:15 -0700596 elif ini_match :
Jon Hallfebb1c72015-03-05 13:30:09 -0800597 self.log.info(" Response is in 'INI' format and Converting to '"+return_format+"' format")
adminbae64d82013-08-01 10:50:15 -0700598 from configobj import ConfigObj
599 response_file = open("respnse_file.temp",'w')
600 response_file.write(response)
Jon Halld61331b2015-02-17 16:35:47 -0800601 response_file.close()
adminbae64d82013-08-01 10:50:15 -0700602 response_dict = ConfigObj("respnse_file.temp")
603 return response_dict
adminbae64d82013-08-01 10:50:15 -0700604 elif xml_match :
Jon Hallfebb1c72015-03-05 13:30:09 -0800605 self.log.info(" Response is in 'XML' format and Converting to '"+return_format+"' format")
adminbae64d82013-08-01 10:50:15 -0700606 try :
adminbae64d82013-08-01 10:50:15 -0700607 response_dict = xmldict.xml_to_dict("<response> "+str(response)+" </response>")
Jon Hall1306a562015-09-04 11:21:24 -0700608 except StandardError:
609 self.log.exception()
adminbae64d82013-08-01 10:50:15 -0700610 return response_dict
kelvin-onlabf70fd542015-05-07 18:41:40 -0700611
adminbae64d82013-08-01 10:50:15 -0700612 def dict_to_return_format(self,response,return_format,response_dict):
adminbae64d82013-08-01 10:50:15 -0700613 if return_format =='table' :
614 ''' Will return in table format'''
615 to_do = "Call the table output formatter"
616 global response_table
617 response_table = '\n'
618 response_table = response_table +'\t'.join(response_dict)+"\n"
kelvin-onlabf70fd542015-05-07 18:41:40 -0700619
adminbae64d82013-08-01 10:50:15 -0700620 def get_table(value_to_convert):
621 ''' This will parse the dictionary recusrsively and print as table format'''
622 table_data = ""
623 if type(value_to_convert) == dict :
624 table_data = table_data +'\t'.join(value_to_convert)+"\n"
625 for temp_val in value_to_convert.values() :
626 table_data = table_data + get_table(temp_val)
627 else :
628 table_data = table_data + str(value_to_convert) +"\t"
Jon Halld61331b2015-02-17 16:35:47 -0800629 return table_data
kelvin-onlabf70fd542015-05-07 18:41:40 -0700630
adminbae64d82013-08-01 10:50:15 -0700631 for value in response_dict.values() :
632 response_table = response_table + get_table(value)
Jon Hall88e498c2015-03-06 09:54:35 -0800633 # response_table = response_table + '\t'.join(response_dict.values())
adminbae64d82013-08-01 10:50:15 -0700634 return response_table
kelvin-onlabf70fd542015-05-07 18:41:40 -0700635
adminbae64d82013-08-01 10:50:15 -0700636 elif return_format =='config':
637 ''' Will return in config format'''
638 to_do = 'Call dict to config coverter'
639 response_string = str(response_dict)
640 print response_string
641 response_config = re.sub(",", "\n\t", response_string)
642 response_config = re.sub("u\'", "\'", response_config)
643 response_config = re.sub("{", "", response_config)
644 response_config = re.sub("}", "\n", response_config)
645 response_config = re.sub(":", " =", response_config)
646 return "[response]\n\t "+response_config
adminbae64d82013-08-01 10:50:15 -0700647 elif return_format == 'xml':
648 ''' Will return in xml format'''
adminbae64d82013-08-01 10:50:15 -0700649 response_xml = xmldict.dict_to_xml(response_dict)
650 response_xml = re.sub(">\s*<", ">\n<", response_xml)
651 return "\n"+response_xml
adminbae64d82013-08-01 10:50:15 -0700652 elif return_format == 'json':
653 ''' Will return in json format'''
654 to_do = 'Call dict to xml coverter'
655 import json
656 response_json = json.dumps(response_dict)
657 return response_json
kelvin-onlabf70fd542015-05-07 18:41:40 -0700658
adminbae64d82013-08-01 10:50:15 -0700659 def get_random(self):
660 self.random_order = self.random_order + 1
661 return self.random_order
kelvin-onlabf70fd542015-05-07 18:41:40 -0700662
adminbae64d82013-08-01 10:50:15 -0700663 def exit(self):
664 __builtin__.testthread = None
Jon Hall5b586732015-06-11 11:39:39 -0700665 for thread in threading.enumerate():
666 if thread.isAlive():
667 try:
668 thread._Thread__stop()
669 except:
Jon Hall1306a562015-09-04 11:21:24 -0700670 # NOTE: We should catch any exceptions while trying to
671 # close the thread so that we can try to close the other
672 # threads as well
673 print( str( thread.getName() ) + ' could not be terminated' )
adminbae64d82013-08-01 10:50:15 -0700674 sys.exit()
675
676def verifyOptions(options):
677 '''
678 This will verify the command line options and set to default values, if any option not given in command line.
679 '''
680 import pprint
681 pp = pprint.PrettyPrinter(indent=4)
682
Jon Hall88e498c2015-03-06 09:54:35 -0800683 # pp.pprint(options)
adminbae64d82013-08-01 10:50:15 -0700684 verifyTest(options)
685 verifyExample(options)
686 verifyTestScript(options)
687 verifyParams()
688 verifyLogdir(options)
689 verifyMail(options)
690 verifyTestCases(options)
Hari Krishna03f530e2015-07-10 17:28:27 -0700691 verifyOnosCell(options)
adminbae64d82013-08-01 10:50:15 -0700692
693def verifyTest(options):
Jon Hall44506242015-07-29 17:40:26 -0700694 try:
695 if options.testname:
696 main.TEST = options.testname
697 main.classPath = "tests."+main.TEST+"."+main.TEST
698 main.tests_path = tests_path
699 elif options.example:
700 main.TEST = options.example
701 main.tests_path = path+"/examples/"
702 main.classPath = "examples."+main.TEST+"."+main.TEST
703 except AttributeError:
adminbae64d82013-08-01 10:50:15 -0700704 print "Test or Example not specified please specify the --test <test name > or --example <example name>"
Jon Hall5b586732015-06-11 11:39:39 -0700705 main.exit()
adminbae64d82013-08-01 10:50:15 -0700706
707def verifyExample(options):
708 if options.example:
709 main.testDir = path+'/examples/'
710 main.tests_path = path+"/examples/"
711 main.classPath = "examples."+main.TEST+"."+main.TEST
kelvin-onlabf70fd542015-05-07 18:41:40 -0700712
adminbae64d82013-08-01 10:50:15 -0700713def verifyLogdir(options):
Jon Hall88e498c2015-03-06 09:54:35 -0800714 # Verifying Log directory option
adminbae64d82013-08-01 10:50:15 -0700715 if options.logdir:
716 main.logdir = options.logdir
717 else :
Jon Halld61331b2015-02-17 16:35:47 -0800718 main.logdir = main.FALSE
kelvin-onlabf70fd542015-05-07 18:41:40 -0700719
adminbae64d82013-08-01 10:50:15 -0700720def verifyMail(options):
Jon Halld61331b2015-02-17 16:35:47 -0800721 # Checking the mailing list
adminbae64d82013-08-01 10:50:15 -0700722 if options.mail:
723 main.mail = options.mail
724 elif main.params.has_key('mail'):
725 main.mail = main.params['mail']
726 else :
727 main.mail = 'paxweb@paxterrasolutions.com'
728
729def verifyTestCases(options):
Jon Hall88e498c2015-03-06 09:54:35 -0800730 # Getting Test cases list
adminbae64d82013-08-01 10:50:15 -0700731 if options.testcases:
Jon Hallfebb1c72015-03-05 13:30:09 -0800732 testcases_list = options.testcases
Jon Hall88e498c2015-03-06 09:54:35 -0800733 # sys.exit()
adminbae64d82013-08-01 10:50:15 -0700734 testcases_list = re.sub("(\[|\])", "", options.testcases)
735 main.testcases_list = eval(testcases_list+",")
736 else :
737 if 'testcases' in main.params.keys():
Jon Halla1185982014-09-15 14:55:10 -0700738 temp = eval(main.params['testcases']+",")
739 list1=[]
740 if type(temp[0])==list:
Jon Hallfebb1c72015-03-05 13:30:09 -0800741 for test in temp:
742 for testcase in test:
743 if type(testcase)==int:
744 testcase=[testcase]
745 list1.extend(testcase)
746 else :
747 temp=list(temp)
748 for testcase in temp:
749 if type(testcase)==int:
750 testcase=[testcase]
751 list1.extend(testcase)
752 main.testcases_list=list1
adminbae64d82013-08-01 10:50:15 -0700753 else :
754 print "testcases not specifed in params, please provide in params file or 'testcases' commandline argument"
Jon Halld61331b2015-02-17 16:35:47 -0800755 sys.exit()
kelvin-onlabf70fd542015-05-07 18:41:40 -0700756
Hari Krishna03f530e2015-07-10 17:28:27 -0700757def verifyOnosCell(options):
Hari Krishnabe4b97b2015-07-15 12:19:43 -0700758 # Verifying onoscell option
Hari Krishna03f530e2015-07-10 17:28:27 -0700759 if options.onoscell:
760 main.onoscell = options.onoscell
Hari Krishnabe4b97b2015-07-15 12:19:43 -0700761 main.onosIPs = []
762 main.mnIP = ""
763 cellCMD = ". ~/.profile; cell "+main.onoscell
764 output=subprocess.check_output( ["bash", '-c', cellCMD] )
765 splitOutput = output.splitlines()
766 for i in range( len(splitOutput) ):
767 if( re.match( "OCN", splitOutput[i] ) ):
768 mnNode=splitOutput[i].split("=")
769 main.mnIP = mnNode[1]
770 # cell already sorts OC variables in bash, so no need to sort in TestON
771 if( re.match( "OC[1-9]", splitOutput[i] ) ):
772 onosNodes = splitOutput[i].split("=")
773 main.onosIPs.append( onosNodes[1] )
Hari Krishna03f530e2015-07-10 17:28:27 -0700774 else :
775 main.onoscell = main.FALSE
776
adminbae64d82013-08-01 10:50:15 -0700777def verifyTestScript(options):
778 '''
779 Verifyies test script.
780 '''
Jon Halld61331b2015-02-17 16:35:47 -0800781 main.openspeak = openspeak.OpenSpeak()
adminbae64d82013-08-01 10:50:15 -0700782 openspeakfile = main.testDir+"/" + main.TEST + "/" + main.TEST + ".ospk"
783 testfile = main.testDir+"/" + main.TEST + "/" + main.TEST + ".py"
Jon Hall44506242015-07-29 17:40:26 -0700784 if os.path.exists(openspeakfile):
785 # Openspeak file found, compiling to python
adminbae64d82013-08-01 10:50:15 -0700786 main.openspeak.compiler(openspeakfile=openspeakfile,writetofile=1)
787 elif os.path.exists(testfile):
Jon Hall44506242015-07-29 17:40:26 -0700788 # No openspeak found, using python file instead
789 pass
adminbae64d82013-08-01 10:50:15 -0700790 else:
Jon Hall44506242015-07-29 17:40:26 -0700791 print "\nThere is no \""+main.TEST+"\" test script.\nPlease provide a " +\
792 "Python or OpenSpeak test script in the tests folder: " +\
793 main.testDir+"/" + main.TEST + "/"
adminbae64d82013-08-01 10:50:15 -0700794 __builtin__.testthread = None
795 main.exit()
adminbae64d82013-08-01 10:50:15 -0700796 try :
adminbae64d82013-08-01 10:50:15 -0700797 testModule = __import__(main.classPath, globals(), locals(), [main.TEST], -1)
Jon Hall1306a562015-09-04 11:21:24 -0700798 except ImportError:
Jon Hall44506242015-07-29 17:40:26 -0700799 print "There was an import error, it might mean that there is no test named "+main.TEST
Jon Halld61331b2015-02-17 16:35:47 -0800800 main.exit()
adminbae64d82013-08-01 10:50:15 -0700801
802 testClass = getattr(testModule, main.TEST)
803 main.testObject = testClass()
804 load_parser()
Jon Halld61331b2015-02-17 16:35:47 -0800805 main.params = main.parser.parseParams(main.classPath)
806 main.topology = main.parser.parseTopology(main.classPath)
kelvin-onlabf70fd542015-05-07 18:41:40 -0700807
adminbae64d82013-08-01 10:50:15 -0700808def verifyParams():
809 try :
810 main.params = main.params['PARAMS']
Jon Hall1306a562015-09-04 11:21:24 -0700811 except KeyError:
adminbae64d82013-08-01 10:50:15 -0700812 print "Error with the params file: Either the file not specified or the format is not correct"
Jon Halld61331b2015-02-17 16:35:47 -0800813 main.exit()
adminbae64d82013-08-01 10:50:15 -0700814 try :
815 main.topology = main.topology['TOPOLOGY']
Jon Hall1306a562015-09-04 11:21:24 -0700816 except KeyError:
adminbae64d82013-08-01 10:50:15 -0700817 print "Error with the Topology file: Either the file not specified or the format is not correct"
818 main.exit()
kelvin-onlabf70fd542015-05-07 18:41:40 -0700819
adminbae64d82013-08-01 10:50:15 -0700820def load_parser() :
821 '''
822 It facilitates the loading customised parser for topology and params file.
823 It loads parser mentioned in tab named parser of teston.cfg file.
824 It also loads default xmlparser if no parser have specified in teston.cfg file.
825
826 '''
827 confighash = main.configDict
828 if 'file' in confighash['config']['parser'] and 'class' in confighash['config']['parser']:
Jon Hall44506242015-07-29 17:40:26 -0700829 path = confighash['config']['parser']['file']
830 if path != None or confighash['config']['parser']['class']!= None:
831 try:
832 module = re.sub( r".py\s*$", "", path )
adminbae64d82013-08-01 10:50:15 -0700833 moduleList = module.split("/")
834 newModule = ".".join([moduleList[len(moduleList) - 2],moduleList[len(moduleList) - 1]])
Jon Hall44506242015-07-29 17:40:26 -0700835 parsingClass = confighash['config']['parser']['class']
836 parsingModule = __import__(newModule, globals(), locals(), [parsingClass], -1)
837 parsingClass = getattr(parsingModule, parsingClass)
838 main.parser = parsingClass()
839 #hashobj = main.parser.parseParams(main.classPath)
840 if hasattr(main.parser,"parseParams") and hasattr(main.parser,"parseTopology") and hasattr(main.parser,"parse"):
841 pass
842 else:
843 print "Invalid parser format"
adminbae64d82013-08-01 10:50:15 -0700844 main.exit()
Jon Hall44506242015-07-29 17:40:26 -0700845 except ImportError:
846 print "Could not find the file " + path + " using default parser."
Jon Halld61331b2015-02-17 16:35:47 -0800847 load_defaultParser()
Jon Hall44506242015-07-29 17:40:26 -0700848 elif confighash['config']['parser']['file'] == None or confighash['config']['parser']['class'] == None:
Jon Halld61331b2015-02-17 16:35:47 -0800849 load_defaultParser()
adminbae64d82013-08-01 10:50:15 -0700850 else:
851 load_defaultParser()
852
853def load_defaultParser():
854 '''
855 It will load the default parser which is xml parser to parse the params and topology file.
856 '''
857 moduleList = main.parserPath.split("/")
858 newModule = ".".join([moduleList[len(moduleList) - 2],moduleList[len(moduleList) - 1]])
859 try :
Jon Halld61331b2015-02-17 16:35:47 -0800860 parsingClass = main.parsingClass
adminbae64d82013-08-01 10:50:15 -0700861 parsingModule = __import__(newModule, globals(), locals(), [parsingClass], -1)
862 parsingClass = getattr(parsingModule, parsingClass)
863 main.parser = parsingClass()
864 if hasattr(main.parser,"parseParams") and hasattr(main.parser,"parseTopology") and hasattr(main.parser,"parse") :
865 pass
866 else:
867 main.exit()
868
869 except ImportError:
870 print sys.exc_info()[1]
871
adminbae64d82013-08-01 10:50:15 -0700872def load_logger() :
873 '''
874 It facilitates the loading customised parser for topology and params file.
875 It loads parser mentioned in tab named parser of teston.cfg file.
876 It also loads default xmlparser if no parser have specified in teston.cfg file.
877
878 '''
879 confighash = main.configDict
880 if 'file' in confighash['config']['logger'] and 'class' in confighash['config']['logger']:
Jon Hall44506242015-07-29 17:40:26 -0700881 path = confighash['config']['logger']['file']
882 if path != None or confighash['config']['logger']['class']!= None :
883 try:
884 module = re.sub( r".py\s*$", "", path )
adminbae64d82013-08-01 10:50:15 -0700885 moduleList = module.split("/")
886 newModule = ".".join([moduleList[len(moduleList) - 2],moduleList[len(moduleList) - 1]])
Jon Hall44506242015-07-29 17:40:26 -0700887 loggerClass = confighash['config']['logger']['class']
888 loggerModule = __import__(newModule, globals(), locals(), [loggerClass], -1)
889 loggerClass = getattr(loggerModule, loggerClass)
890 main.logger = loggerClass()
891 #hashobj = main.parser.parseParams(main.classPath)
892 except ImportError:
893 print "Could not find the file " + path + " using default logger."
adminbae64d82013-08-01 10:50:15 -0700894 load_defaultlogger()
Jon Halld61331b2015-02-17 16:35:47 -0800895 elif confighash['config']['parser']['file'] == None or confighash['config']['parser']['class'] == None :
896 load_defaultlogger()
adminbae64d82013-08-01 10:50:15 -0700897 else:
898 load_defaultlogger()
899
900def load_defaultlogger():
901 '''
902 It will load the default parser which is xml parser to parse the params and topology file.
903 '''
904 moduleList = main.loggerPath.split("/")
905 newModule = ".".join([moduleList[len(moduleList) - 2],moduleList[len(moduleList) - 1]])
906 try :
Jon Halld61331b2015-02-17 16:35:47 -0800907 loggerClass = main.loggerClass
adminbae64d82013-08-01 10:50:15 -0700908 loggerModule = __import__(newModule, globals(), locals(), [loggerClass], -1)
909 loggerClass = getattr(loggerModule, loggerClass)
910 main.logger = loggerClass()
911
912 except ImportError:
913 print sys.exc_info()[1]
Jon Halld61331b2015-02-17 16:35:47 -0800914 main.exit()
adminbae64d82013-08-01 10:50:15 -0700915
adminbae64d82013-08-01 10:50:15 -0700916def _echo(self):
917 print "THIS IS ECHO"