add a new performance test case to sdnip

Change-Id: I0ecf986fb7ef9dff1bf04aa8642034836d1fbd3e
diff --git a/TestON/tests/SDNIPperf/SDNIPperf.py b/TestON/tests/SDNIPperf/SDNIPperf.py
new file mode 100644
index 0000000..238c8f9
--- /dev/null
+++ b/TestON/tests/SDNIPperf/SDNIPperf.py
@@ -0,0 +1,149 @@
+class SDNIPperf:
+
+    def __init__( self ):
+        self.default = ''
+        global branchName
+
+    # This case is to setup ONOS
+    def CASE100( self, main ):
+        """
+           CASE100 is to compile ONOS and push it to the test machines
+           Startup sequence:
+           cell <name>
+           onos-verify-cell
+           git pull
+           mvn clean install
+           onos-package
+           onos-install -f
+           onos-wait-for-start
+        """
+        main.case( "Setting up test environment" )
+
+        cellName = main.params[ 'ENV' ][ 'cellName' ]
+        ONOS1Ip = main.params[ 'CTRL' ][ 'ip1' ]
+
+        main.step( "Applying cell variable to environment" )
+        cellResult = main.ONOSbench.setCell( cellName )
+        verifyResult = main.ONOSbench.verifyCell()
+
+        branchName = main.ONOSbench.getBranchName()
+        main.log.info( "ONOS is on branch: " + branchName )
+
+        main.log.report( "Uninstalling ONOS" )
+        main.ONOSbench.onosUninstall( ONOS1Ip )
+
+        cleanInstallResult = main.TRUE
+        gitPullResult = main.TRUE
+
+        main.step( "Git pull" )
+        gitPullResult = main.FALSE
+        #Need to push some new code to ONOS before using the git pull
+        #gitPullResult = main.ONOSbench.gitPull()
+
+        main.step( "Using mvn clean & install" )
+        if gitPullResult == main.TRUE:
+            cleanInstallResult = main.ONOSbench.cleanInstall()
+        else:
+             main.log.warn( "Did not pull new code so skipping mvn " +
+                             "clean install" )
+        cleanInstallResult = main.ONOSbench.cleanInstall( mciTimeout= 300 )
+        main.ONOSbench.getVersion( report=True )
+
+        main.step( "Creating ONOS package" )
+        packageResult = main.ONOSbench.onosPackage( opTimeout=500 )
+
+        main.step( "Installing ONOS package" )
+        onos1InstallResult = main.ONOSbench.onosInstall( options="-f",
+                                                           node=ONOS1Ip )
+
+        main.step( "Checking if ONOS is up yet" )
+        for i in range( 2 ):
+            onos1Isup = main.ONOSbench.isup( ONOS1Ip, timeout=420 )
+            if onos1Isup:
+                break
+        if not onos1Isup:
+            main.log.report( "ONOS1 didn't start!" )
+
+        cliResult = main.ONOScli.startOnosCli( ONOS1Ip,
+                commandlineTimeout=100, onosStartTimeout=600)
+
+        case1Result = ( cleanInstallResult and packageResult and
+                        cellResult and verifyResult and
+                        onos1InstallResult and
+                        onos1Isup and cliResult )
+
+        utilities.assert_equals( expect=main.TRUE, actual=case1Result,
+                                 onpass="ONOS startup successful",
+                                 onfail="ONOS startup NOT successful" )
+
+        if case1Result == main.FALSE:
+            main.cleanup()
+            main.exit()
+
+    def CASE9( self, main ):
+        """
+        Test the SDN-IP Performance
+        Test whether SDN-IP can boot with 600,000 routes from an external peer.
+        Since our goal for SDN-IP is to handle 600,000 routes, in this test case
+        we statically configure an external peer Quagga with 655360 routes.
+        Thus, we pre-know the routes and intents it should be, and then boot the
+        whole system and check whether the numbers of routes and intents from
+        ONOS CLI are correct.
+        """
+        import time
+        import json
+        from operator import eq
+        from time import localtime, strftime
+
+        # We configured one external BGP peer with 655360 routes
+        routeNumberExpected = 655360
+        m2SIntentsNumberExpected = 655360
+
+        main.case("This case is to testing the performance of SDN-IP with \
+        single ONOS instance" )
+        time.sleep( 10 )
+
+        main.step( "Get devices in the network" )
+        listResult = main.ONOScli.devices( jsonFormat=False )
+        main.log.info( listResult )
+
+        main.step( "Get links in the network" )
+        listResult = main.ONOScli.links ( jsonFormat=False )
+        main.log.info( listResult )
+
+        main.log.info( "Activate sdn-ip application" )
+        main.ONOScli.activateApp( "org.onosproject.sdnip" )
+
+        main.step("Sleep 1200 seconds")
+        # wait until SDN-IP receives all routes and ONOS installs all intents
+        time.sleep( main.params[ 'timers' ][ 'SystemBoot' ] )
+
+        main.step( "Checking routes installed" )
+
+        main.log.info( "Total route number expected is:" )
+        main.log.info( routeNumberExpected )
+
+        routeNumberActual = main.ONOScli.ipv4RouteNumber()
+        main.log.info("Total route  number actual is: ")
+        main.log.info(routeNumberActual)
+
+        utilities.assertEquals(
+            expect=routeNumberExpected, actual=routeNumberActual,
+            onpass="***Routes in SDN-IP are correct!***",
+            onfail="***Routes in SDN-IP are wrong!***" )
+
+
+        main.step( "Checking MultiPointToSinglePointIntent intents installed" )
+
+        main.log.info( "MultiPointToSinglePoint intent number expected is:" )
+        main.log.info( m2SIntentsNumberExpected )
+
+        m2SIntentsNumberActual = main.ONOScli.m2SIntentInstalledNumber()
+        main.log.info( "MultiPointToSinglePoint intent number actual is:" )
+        main.log.info(m2SIntentsNumberActual)
+
+        utilities.assertEquals(
+            expect=True,
+            actual=eq( m2SIntentsNumberExpected, m2SIntentsNumberActual ),
+            onpass="***MultiPointToSinglePoint intent number is correct!***",
+            onfail="***MultiPointToSinglePoint intent number is wrong!***" )