blob: 00c58c5a4e3cfaa7d862d094114b4d497a87d16c [file] [log] [blame]
"""
Copyright 2016 Open Networking Foundation ( ONF )
Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
or the System Testing Guide page at <https://wiki.onosproject.org/x/WYQg>
TestON is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
( at your option ) any later version.
TestON is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with TestON. If not, see <http://www.gnu.org/licenses/>.
"""
"""
This file contains classes for CHOTestMonkey that are related to application event
Author: you@onlab.us
"""
from tests.CHOTestMonkey.dependencies.events.Event import EventType, EventStates, Event
class ONOSEvent( Event ):
def __init__( self ):
Event.__init__( self )
self.ONOSIndex = -1
def startEvent( self, args ):
with self.eventLock:
# main.log.info( "%s - starting event" % ( self.typeString ) )
result = EventStates().PASS
if self.typeIndex == EventType().ONOS_ONOS_DOWN or self.typeIndex == EventType().ONOS_ONOS_UP:
if len( args ) < 1:
main.log.warn( "%s - Not enough arguments: %s" % ( self.typeString, args ) )
result = EventStates().ABORT
elif len( args ) > 1:
main.log.warn( "%s - Too many arguments: %s" % ( self.typeString, args ) )
result = EventStates().ABORT
else:
index = int( args[ 0 ] )
if index < 1 or index > int( main.Cluster.numCtrls ):
main.log.warn( "%s - invalid argument: %s" % ( self.typeString, index ) )
result = EventStates().ABORT
else:
self.ONOSIndex = index
result = self.startONOSEvent()
return result
class ONOSDown( ONOSEvent ):
def __init__( self ):
ONOSEvent.__init__( self )
self.typeString = main.params[ 'EVENT' ][ self.__class__.__name__ ][ 'typeString' ]
self.typeIndex = int( main.params[ 'EVENT' ][ self.__class__.__name__ ][ 'typeIndex' ] )
def startONOSEvent( self ):
assert self.ONOSIndex != -1
with main.variableLock:
if not main.controllers[ self.ONOSIndex - 1 ].isUp():
main.log.warn( "ONOS Down - ONOS already down" )
return EventStates().ABORT
main.log.info( "Event recorded: {} {} {}".format( self.typeIndex, self.typeString, self.ONOSIndex ) )
with main.ONOSbenchLock:
result = main.ONOSbench.onosDie( main.controllers[ self.ONOSIndex - 1 ].ip )
if not result:
main.log.warn( "%s - failed to bring down ONOS" % ( self.typeString ) )
return EventStates().FAIL
with main.variableLock:
main.controllers[ self.ONOSIndex - 1 ].bringDown()
return EventStates().PASS
class ONOSUp( ONOSEvent ):
def __init__( self ):
ONOSEvent.__init__( self )
self.typeString = main.params[ 'EVENT' ][ self.__class__.__name__ ][ 'typeString' ]
self.typeIndex = int( main.params[ 'EVENT' ][ self.__class__.__name__ ][ 'typeIndex' ] )
def startONOSEvent( self ):
assert self.ONOSIndex != -1
with main.variableLock:
if main.controllers[ self.ONOSIndex - 1 ].isUp():
main.log.warn( "ONOS Up - ONOS already up" )
return EventStates().ABORT
main.log.info( "Event recorded: {} {} {}".format( self.typeIndex, self.typeString, self.ONOSIndex ) )
with main.ONOSbenchLock:
startResult = main.ONOSbench.onosStart( main.controllers[ self.ONOSIndex - 1 ].ip )
if not startResult:
main.log.warn( "%s - failed to bring up ONOS" % ( self.typeString ) )
return EventStates().FAIL
else:
ONOSState = main.ONOSbench.isup( main.controllers[ self.ONOSIndex - 1 ].ip )
if not ONOSState:
main.log.warn( "%s - ONOS is not up" % ( self.typeString ) )
return EventStates().FAIL
else:
cliResult = main.controllers[ self.ONOSIndex - 1 ].startCLI()
if not cliResult:
main.log.warn( "%s - failed to start ONOS cli" % ( self.typeString ) )
return EventStates().FAIL
else:
with main.variableLock:
main.controllers[ self.ONOSIndex - 1 ].bringUp()
return EventStates().PASS
class CfgEvent( Event ):
def __init__( self ):
Event.__init__( self )
self.component = ''
self.propName = ''
self.value = ''
def startEvent( self, args ):
with self.eventLock:
# main.log.info( "%s - starting event" % ( self.typeString ) )
result = self.startCfgEvent( args )
return result
class SetCfg( CfgEvent ):
def __init__( self ):
CfgEvent.__init__( self )
self.typeString = main.params[ 'EVENT' ][ self.__class__.__name__ ][ 'typeString' ]
self.typeIndex = int( main.params[ 'EVENT' ][ self.__class__.__name__ ][ 'typeIndex' ] )
def startCfgEvent( self, args ):
if len( args ) < 3:
main.log.warn( "%s - Not enough arguments: %s" % ( self.typeString, args ) )
return EventStates().ABORT
elif len( args ) > 3:
main.log.warn( "%s - Too many arguments: %s" % ( self.typeString, args ) )
return EventStates().ABORT
else:
self.component = str( args[ 0 ] )
self.propName = str( args[ 1 ] )
self.value = str( args[ 2 ] )
assert self.component != '' and self.propName != '' and self.value != ''
index = -1
for controller in main.controllers:
if controller.isUp():
index = controller.index
if index == -1:
main.log.warn( "%s - No available controllers" % s( self.typeString ) )
return EventStates().ABORT
main.log.info( "Event recorded: {} {} {} {} {}".format( self.typeIndex, self.typeString, self.component, self.propName, self.value ) )
controller = main.controllers[ index - 1 ]
with controller.CLILock:
result = controller.CLI.setCfg( component=self.component,
propName=self.propName,
value=self.value )
if not result:
main.log.warn( "%s - failed to set configuration" % ( self.typeString ) )
return EventStates().FAIL
return EventStates().PASS
class SetFlowObj( CfgEvent ):
def __init__( self ):
CfgEvent.__init__( self )
self.typeString = main.params[ 'EVENT' ][ self.__class__.__name__ ][ 'typeString' ]
self.typeIndex = int( main.params[ 'EVENT' ][ self.__class__.__name__ ][ 'typeIndex' ] )
def startCfgEvent( self, args ):
if len( args ) < 1:
main.log.warn( "%s - Not enough arguments: %s" % ( self.typeString, args ) )
return EventStates().ABORT
elif len( args ) > 1:
main.log.warn( "%s - Too many arguments: %s" % ( self.typeString, args ) )
return EventStates().ABORT
elif args[ 0 ] != 'true' and args[ 0 ] != 'false':
main.log.warn( "%s - Invalid arguments: %s" % ( self.typeString, args ) )
return EventStates().ABORT
else:
self.component = 'org.onosproject.net.intent.impl.compiler.IntentConfigurableRegistrator'
self.propName = 'useFlowObjectives'
self.value = str( args[ 0 ] )
index = -1
for controller in main.controllers:
if controller.isUp():
index = controller.index
if index == -1:
main.log.warn( "%s - No available controllers" % s( self.typeString ) )
return EventStates().ABORT
main.log.info( "Event recorded: {} {} {} {} {}".format( self.typeIndex, self.typeString, self.component, self.propName, self.value ) )
controller = main.controllers[ index - 1 ]
with controller.CLILock:
result = controller.CLI.setCfg( component=self.component,
propName=self.propName,
value=self.value )
if not result:
main.log.warn( "%s - failed to set configuration" % ( self.typeString ) )
return EventStates().FAIL
main.flowObj = True if self.value == 'true' else False
return EventStates().PASS
class BalanceMasters( Event ):
def __init__( self ):
Event.__init__( self )
self.typeString = main.params[ 'EVENT' ][ self.__class__.__name__ ][ 'typeString' ]
self.typeIndex = int( main.params[ 'EVENT' ][ self.__class__.__name__ ][ 'typeIndex' ] )
def startEvent( self, args=None ):
with self.eventLock:
main.log.info( "%s - starting event" % ( self.typeString ) )
index = -1
for controller in main.controllers:
if controller.isUp():
index = controller.index
if index == -1:
main.log.warn( "%s - No available controllers" % s( self.typeString ) )
return EventStates().ABORT
main.log.info( "Event recorded: {} {}".format( self.typeIndex, self.typeString ) )
controller = main.controllers[ index - 1 ]
with controller.CLILock:
result = controller.CLI.balanceMasters()
if not result:
main.log.warn( "%s - failed to balance masters" % ( self.typeString ) )
return EventStates().FAIL
return EventStates().PASS
class SetFlowObjCompiler( CfgEvent ):
def __init__( self ):
CfgEvent.__init__( self )
self.typeString = main.params[ 'EVENT' ][ self.__class__.__name__ ][ 'typeString' ]
self.typeIndex = int( main.params[ 'EVENT' ][ self.__class__.__name__ ][ 'typeIndex' ] )
def startCfgEvent( self, args ):
if len( args ) < 1:
main.log.warn( "%s - Not enough arguments: %s" % ( self.typeString, args ) )
return EventStates().ABORT
elif len( args ) > 1:
main.log.warn( "%s - Too many arguments: %s" % ( self.typeString, args ) )
return EventStates().ABORT
else:
self.component = 'org.onosproject.net.intent.impl.compiler.IntentConfigurableRegistrator'
self.propName = 'defaultFlowObjectiveCompiler'
self.value = str( args[ 0 ] )
index = -1
for controller in main.controllers:
if controller.isUp():
index = controller.index
if index == -1:
main.log.warn( "%s - No available controllers" % s( self.typeString ) )
return EventStates().ABORT
main.log.info( "Event recorded: {} {} {} {} {}".format( self.typeIndex, self.typeString, self.component, self.propName, self.value ) )
controller = main.controllers[ index - 1 ]
with controller.CLILock:
result = controller.CLI.setCfg( component=self.component,
propName=self.propName,
value=self.value )
if not result:
main.log.warn( "%s - failed to set configuration" % ( self.typeString ) )
return EventStates().FAIL
return EventStates().PASS