diff --git a/TestON/tests/SCPF/SCPFcbench/SCPFcbench.py b/TestON/tests/SCPF/SCPFcbench/SCPFcbench.py
index 0bafefb..c139d48 100644
--- a/TestON/tests/SCPF/SCPFcbench/SCPFcbench.py
+++ b/TestON/tests/SCPF/SCPFcbench/SCPFcbench.py
@@ -22,13 +22,13 @@
         main.case( "pre-condition for cbench test." )
 
         try:
-            if type( init ) is not bool:
+            if not isinstance( init, bool ):
                 init = False
         except NameError:
             init = False
 
         # -- INIT SECTION, ONLY RUNS ONCE -- #
-        if init == False:
+        if not init:
             init = True
             try:
                 from tests.dependencies.ONOSSetup import ONOSSetup
@@ -80,7 +80,6 @@
                                  onpass="Successfully configure onos for cbench test ",
                                  onfail="Failed to configure onos for cbench test" )
 
-
     def CASE2( self, main ):
         main.case( "Running Cbench" )
         main.step( "Issuing cbench commands and grab returned results" )
@@ -119,7 +118,7 @@
                 main.log.info( "Standard Deviation: \t" + stdev )
 
                 try:
-                    dbFileName="/tmp/CbenchDB"
+                    dbFileName = "/tmp/CbenchDB"
                     dbfile = open( dbFileName, "w+" )
                     temp = "'" + main.commit + "',"
                     temp += "'" + mode + "',"
@@ -133,7 +132,7 @@
 
                 stepResult = main.TRUE
                 break
-        if ( validFlag == False ):
+        if not validFlag:
             main.log.warn( "Cbench Test produced no valid results!!!!" )
             stepResult = main.FALSE
 
@@ -141,4 +140,3 @@
                                  actual=stepResult,
                                  onpass="Successfully tested onos for cbench. ",
                                  onfail="Failed to obtain valid onos cbench result!" )
-
diff --git a/TestON/tests/SCPF/SCPFflowTp1g/SCPFflowTp1g.py b/TestON/tests/SCPF/SCPFflowTp1g/SCPFflowTp1g.py
index 41b09aa..c86ecac 100644
--- a/TestON/tests/SCPF/SCPFflowTp1g/SCPFflowTp1g.py
+++ b/TestON/tests/SCPF/SCPFflowTp1g/SCPFflowTp1g.py
@@ -1,5 +1,5 @@
 """
-Copyright 2015 Open Networking Foundation (ONF)
+Copyright 2015 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>,
@@ -8,7 +8,7 @@
     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.
+    ( 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
@@ -18,7 +18,6 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
 # ScaleOutTemplate -> flowTP
 #
 # CASE1 starts number of nodes specified in param file
@@ -40,24 +39,24 @@
             from tests.dependencies.ONOSSetup import ONOSSetup
             main.testSetUp = ONOSSetup()
         except ImportError:
-            main.log.error("ONOSSetup not found. exiting the test")
+            main.log.error( "ONOSSetup not found. exiting the test" )
             main.cleanAndExit()
         main.testSetUp.envSetupDescription()
         try:
-            #Load values from params file
+            # Load values from params file
             cellName = main.params[ 'ENV' ][ 'cellName' ]
             main.apps = main.params[ 'ENV' ][ 'cellApps' ]
             BENCHUser = main.params[ 'BENCH' ][ 'user' ]
             BENCHIp = main.params[ 'BENCH' ][ 'ip1' ]
-            main.scale = ( main.params[ 'SCALE' ]  ).split( "," )
+            main.scale = ( main.params[ 'SCALE' ] ).split( "," )
             main.flowRuleCfg = main.params[ 'CFG' ][ 'flowRule' ]
             main.neighbor = ( main.params[ 'TEST' ][ 'neighbors' ] ).split( "," )
             main.nullProviderCfg = main.params[ 'CFG' ][ 'nullProvider' ]
             isFlowObj = main.params[ 'TEST' ][ 'flowObj' ] == "True"
             if isFlowObj:
-               resultFile = main.params[ 'TEST' ][ 'flowObjResultFile' ]
+                resultFile = main.params[ 'TEST' ][ 'flowObjResultFile' ]
             else:
-               resultFile = main.params[ 'TEST' ][ 'flowResultFile' ]
+                resultFile = main.params[ 'TEST' ][ 'flowResultFile' ]
             stepResult = main.testSetUp.envSetup()
             resultsDB = open( str( resultFile ), "w+" )
             resultsDB.close()
@@ -110,13 +109,13 @@
         main.step( "\tNEIGHBORS:\t" + neighbors )
         main.log.info( "=============================================================" )
         main.log.info( "=============================================================" )
-        #write file to configure nil link
+        # write file to configure nil link
         ipCSV = ""
-        for i in range ( main.Cluster.maxCtrls ):
+        for i in range( main.Cluster.maxCtrls ):
             tempstr = "ip" + str( i + 1 )
             ipCSV += main.params[ 'CTRL' ][ tempstr ]
             if i + 1 < main.Cluster.maxCtrls:
-                ipCSV +=","
+                ipCSV += ","
 
         main.ONOSbench.onosCfgSet( main.Cluster.active( 0 ).ipAddress,
                                    main.flowRuleCfg,
@@ -142,51 +141,51 @@
                 main.ONOSbench.handle.expect( ":~" )
                 time.sleep( 5 )
                 main.ONOSbench.handle.sendline( "onos $OC1 roles " )
-                main.ONOSbench.handle.expect ( ":~" )
+                main.ONOSbench.handle.expect( ":~" )
                 main.log.info( "switch masterships:" + str( main.ONOSbench.handle.before ) )
                 break
             time.sleep( 5 )
 
-        #divide flows/flowObjectives
+        # divide flows/flowObjectives
         if isFlowObj:
-           toInstall = "FlowObjectives"
-           installCount = int( main.params[ 'TEST' ][ 'flowObjectives' ] )
-           ifFailed = "FLOW_OBJ_TESTER.PY FAILURE"
-           resultFile = main.params[ 'TEST' ][ 'flowObjResultFile' ]
+            toInstall = "FlowObjectives"
+            installCount = int( main.params[ 'TEST' ][ 'flowObjectives' ] )
+            ifFailed = "FLOW_OBJ_TESTER.PY FAILURE"
+            resultFile = main.params[ 'TEST' ][ 'flowObjResultFile' ]
         else:
-           toInstall = "Flows"
-           installCount = int( main.params[ 'TEST' ][ 'flows' ] )
-           ifFailed = "FLOW_TESTER.PY FAILURE"
-           resultFile = main.params[ 'TEST' ][ 'flowResultFile' ]
+            toInstall = "Flows"
+            installCount = int( main.params[ 'TEST' ][ 'flows' ] )
+            ifFailed = "FLOW_TESTER.PY FAILURE"
+            resultFile = main.params[ 'TEST' ][ 'flowResultFile' ]
         main.log.info( toInstall + " Target  = " + str( installCount ) )
 
-        installCountPerSwitch = ( installCount *max( int ( neighbors ) + 1, int( servers ) ) )/( ( int( neighbors ) + 1 )*int( servers )*( switches ) )
+        installCountPerSwitch = ( installCount * max( int( neighbors ) + 1, int( servers ) ) ) / ( ( int( neighbors ) + 1 ) * int( servers ) * ( switches ) )
 
         main.log.info( toInstall + " per switch = " + str( installCountPerSwitch ) )
-        #build list of servers in "$OC1, $OC2...." format
+        # build list of servers in "$OC1, $OC2...." format
         serverEnvVars = ""
         for i in range( int( servers ) ):
             serverEnvVars += ( "-s " + main.Cluster.active( i ).ipAddress + " " )
 
-        data = [ [ "" ]*int( servers ) ]*int( sampleSize )
-        maxes = [ "" ]*int( sampleSize )
+        data = [ [ "" ] * int( servers ) ] * int( sampleSize )
+        maxes = [ "" ] * int( sampleSize )
 
         flowCMD = "python3 " + homeDir + "/onos/tools/test/bin/"
         if isFlowObj:
-           flowCMD += testCMD[ 2 ] + " " + str( installCountPerSwitch ) + " " + testCMD[ 1 ]
-           flowCMD += " " + neighbors + " " + testCMD[ 3 ] + " " + str( flowObjType ) + " " + str( serverEnvVars ) + "-j"
+            flowCMD += testCMD[ 2 ] + " " + str( installCountPerSwitch ) + " " + testCMD[ 1 ]
+            flowCMD += " " + neighbors + " " + testCMD[ 3 ] + " " + str( flowObjType ) + " " + str( serverEnvVars ) + "-j"
         else:
-           flowCMD += testCMD[ 0 ] + " " + str( installCountPerSwitch ) + " " + testCMD[ 1 ]
-           flowCMD += " " + neighbors + " " + str( serverEnvVars ) + "-j"
+            flowCMD += testCMD[ 0 ] + " " + str( installCountPerSwitch ) + " " + testCMD[ 1 ]
+            flowCMD += " " + neighbors + " " + str( serverEnvVars ) + "-j"
 
         main.log.info( flowCMD )
-        #time.sleep( 60 )
+        # time.sleep( 60 )
 
         for test in range( 0, warmUp + sampleSize ):
             if test < warmUp:
                 main.log.info( "Warm up " + str( test + 1 ) + " of " + str( warmUp ) )
             else:
-                 main.log.info( "====== Test run: " + str( test-warmUp+1 ) + " ======" )
+                main.log.info( "====== Test run: " + str( test - warmUp + 1 ) + " ======" )
 
             main.ONOSbench.handle.sendline( flowCMD )
             main.ONOSbench.handle.expect( ":~" )
@@ -205,17 +204,17 @@
                 main.log.info( main.ONOSbench.handle.before )
 
                 break
-            result = [ "" ]*( main.Cluster.numCtrls )
+            result = [ "" ] * ( main.Cluster.numCtrls )
 
             rawResult = rawResult.splitlines()
 
             for node in range( main.Cluster.numCtrls ):
                 for line in rawResult:
-                    #print( "line: " + line )
+                    # print( "line: " + line )
                     if main.Cluster.active( node ).ipAddress in line and "server" in line:
                         temp = line.split( " " )
                         for word in temp:
-                            #print ( "word: " + word )
+                            # print ( "word: " + word )
                             if "elapsed" in repr( word ):
                                 index = temp.index( word ) + 1
                                 myParsed = ( temp[ index ] ).replace( ",", "" )
@@ -231,11 +230,11 @@
                         main.log.error( "Missing data point, critical failure incoming" )
 
                 print result
-                maxes[ test-warmUp ] = max( result )
-                main.log.info( "Data collection iteration: " + str( test-warmUp ) + " of " + str( sampleSize ) )
-                main.log.info( "Throughput time: " + str( maxes[ test-warmUp ] ) + "(ms)" )
+                maxes[ test - warmUp ] = max( result )
+                main.log.info( "Data collection iteration: " + str( test - warmUp ) + " of " + str( sampleSize ) )
+                main.log.info( "Throughput time: " + str( maxes[ test - warmUp ] ) + "(ms)" )
 
-                data[ test-warmUp ] = result
+                data[ test - warmUp ] = result
 
             # wait for flows = 0
             for checkCount in range( 0, 5 ):
@@ -257,7 +256,6 @@
         main.log.info( "raw data: " + str( data ) )
         main.log.info( "maxes:" + str( maxes ) )
 
-
         # report data
         print( "" )
         main.log.info( "\t Results (measurments are in milliseconds)" )
@@ -285,7 +283,7 @@
         main.log.info( "Standard Deviation of max values: " + str( stdOfMaxes ) )
         print( "\n\n" )
 
-        avgTP = int( installCount )  / avgOfMaxes #result in kflows/second
+        avgTP = int( installCount ) / avgOfMaxes  # result in kflows/second
 
         tp = []
         for i in maxes:
@@ -308,4 +306,4 @@
 
         main.log.report( "Result line to file: " + resultString )
 
-        main.ONOSbench.logReport( main.Cluster.active( 0 ).ipAddress, [ "ERROR", "WARNING", "EXCEPT" ], outputMode="d" )
\ No newline at end of file
+        main.ONOSbench.logReport( main.Cluster.active( 0 ).ipAddress, [ "ERROR", "WARNING", "EXCEPT" ], outputMode="d" )
diff --git a/TestON/tests/SCPF/SCPFhostLat/SCPFhostLat.py b/TestON/tests/SCPF/SCPFhostLat/SCPFhostLat.py
index 4298c3d..b742960 100644
--- a/TestON/tests/SCPF/SCPFhostLat/SCPFhostLat.py
+++ b/TestON/tests/SCPF/SCPFhostLat/SCPFhostLat.py
@@ -1,5 +1,5 @@
 """
-Copyright 2016 Open Networking Foundation (ONF)
+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>,
@@ -8,7 +8,7 @@
     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.
+    ( 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
@@ -18,7 +18,6 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
 """
     SCPFhostLat
     This test will test the host found latency.
@@ -213,7 +212,7 @@
                     caseResult = main.FALSE
                 resultFile.close()
             # Compare the timestemps, and get the lowest one.
-            temp = 0;
+            temp = 0
             # Get host event timestamps from each nodes
             for ctrl in main.Cluster.active():
                 metricsResult = json.loads( ctrl.CLI.topologyEventsMetrics() )
@@ -229,7 +228,7 @@
             # gethost to remove
             gethost = main.Cluster.active( 0 ).REST.hosts()
             HosttoRemove = []
-            HosttoRemove.append( json.loads( gethost[ 1:len( gethost )-1 ] ).get( 'id' ) )
+            HosttoRemove.append( json.loads( gethost[ 1:len( gethost ) - 1 ] ).get( 'id' ) )
             main.Cluster.active( 0 ).CLI.removeHost( HosttoRemove )
 
         main.log.info( "Result List: {}".format( addingHostTime ) )
@@ -260,7 +259,7 @@
         assertion = main.TRUE
 
         utilities.assert_equals( expect=main.TRUE, actual=assertion,
-                onpass='Host latency test successful',
-                onfail='Host latency test failed' )
+                                 onpass='Host latency test successful',
+                                 onfail='Host latency test failed' )
 
         main.Utils.mininetCleanup( main.Mininet1 )
diff --git a/TestON/tests/SCPF/SCPFintentEventTp/SCPFintentEventTp.py b/TestON/tests/SCPF/SCPFintentEventTp/SCPFintentEventTp.py
index 97f6039..7be0cc3 100644
--- a/TestON/tests/SCPF/SCPFintentEventTp/SCPFintentEventTp.py
+++ b/TestON/tests/SCPF/SCPFintentEventTp/SCPFintentEventTp.py
@@ -1,5 +1,5 @@
 """
-Copyright 2015 Open Networking Foundation (ONF)
+Copyright 2015 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>,
@@ -8,7 +8,7 @@
     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.
+    ( 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
@@ -18,25 +18,24 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
-'''
+"""
 SCPFintentEventTp
     - Use intentperf app to generate a lot of intent install and withdraw events
     - Test will run with 1,3,5,7 nodes, and with all neighbors
     - Test will run 400 seconds and grep the overall rate from intent-perf summary
 
     yunpeng@onlab.us
-'''
-
+"""
 import time
 
 
 class SCPFintentEventTp:
+
     def __init__( self ):
         self.default = ''
 
     def CASE0( self, main ):
-        '''
+        """
         - GIT
         - BUILDING ONOS
             Pull specific ONOS branch, then Build ONOS ono ONOS Bench.
@@ -44,7 +43,7 @@
             test env. We want Jenkins jobs to pull&build for flexibility to handle
             different versions of ONOS.
         - Construct tests variables
-        '''
+        """
         try:
             from tests.dependencies.ONOSSetup import ONOSSetup
             main.testSetUp = ONOSSetup()
@@ -120,6 +119,7 @@
         # balanceMasters
         main.Cluster.active( 0 ).CLI.balanceMasters()
         time.sleep( main.startUpSleep )
+
     def CASE2( self, main ):
         import numpy
 
@@ -158,7 +158,7 @@
                 resultString = "'" + main.commit + "',"
                 resultString += "'1gig',"
                 resultString += str( main.Cluster.numCtrls ) + ","
-                resultString += "'baremetal" + str( nodes + 1 ) + "',"
+                resultString += "'baremetal" + str(nodes + 1) + "',"
                 resultString += neighbors + ","
                 resultString += result[ main.Cluster.active( nodes ).ipAddress ] + ","
                 resultString += str( 0 ) + "\n"  # no stddev
diff --git a/TestON/tests/SCPF/SCPFintentInstallWithdrawLat/SCPFintentInstallWithdrawLat.py b/TestON/tests/SCPF/SCPFintentInstallWithdrawLat/SCPFintentInstallWithdrawLat.py
index 78a2b34..44e0b6e 100644
--- a/TestON/tests/SCPF/SCPFintentInstallWithdrawLat/SCPFintentInstallWithdrawLat.py
+++ b/TestON/tests/SCPF/SCPFintentInstallWithdrawLat/SCPFintentInstallWithdrawLat.py
@@ -1,5 +1,5 @@
 """
-Copyright 2015 Open Networking Foundation (ONF)
+Copyright 2015 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>,
@@ -8,7 +8,7 @@
     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.
+    ( 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
@@ -18,23 +18,23 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
 """
 SCPFintentInstallWithdrawLat:
     - Test the latency of intent installed and withdrawn
     - Use Push-test-intents command to push intents
     - Use Null provider with 7 devices and linear topology
     - Always push intents between 1/6 and 7/5
-    - The batch size is defined in parm file. ( default 1,100,1000)
+    - The batch size is defined in parm file. ( default 1,100,1000 )
 
     yunpeng@onlab.us
 """
 class SCPFintentInstallWithdrawLat:
+
     def __init__( self ):
         self.default = ''
 
     def CASE0( self, main ):
-        '''
+        """
         - GIT
         - BUILDING ONOS
             Pull specific ONOS branch, then Build ONOS ono ONOS Bench.
@@ -42,8 +42,7 @@
             test env. We want Jenkins jobs to pull&build for flexibility to handle
             different versions of ONOS.
         - Construct tests variables
-        '''
-
+        """
         try:
             from tests.dependencies.ONOSSetup import ONOSSetup
             main.testSetUp = ONOSSetup()
@@ -97,6 +96,7 @@
             main.testSetUp.envSetupException( e )
         main.testSetUp.evnSetupConclusion( stepResult )
         main.commit = main.commit.split( " " )[ 1 ]
+
     def CASE1( self, main ):
         # Clean up test environment and set up
         import time
@@ -156,7 +156,7 @@
                                                                               options="-i",
                                                                               timeout=main.timeout,
                                                                               getResponse=True )
-                if type( installResult ) is str:
+                if isinstance( installResult, str ):
                     if "Failure" in installResult:
                         main.log.error( "Install Intents failure, ignore this iteration." )
                         if validrun < main.warmUp:
@@ -195,7 +195,7 @@
                                                                                timeout=main.timeout,
                                                                                getResponse=True )
 
-                if type( withdrawResult ) is str:
+                if isinstance( withdrawResult, str ):
                     if "Failure" in withdrawResult:
                         main.log.error( "withdraw Intents failure, ignore this iteration." )
                         if validrun < main.warmUp:
@@ -238,8 +238,8 @@
             main.log.report( "Install average: {}    std: {}".format( installave, installstd ) )
             main.log.report( "Withdraw average: {}   std: {}".format( withdrawave, withdrawstd ) )
             # write result to database file
-            if not ( numpy.isnan( installave ) or numpy.isnan( installstd ) or\
-                    numpy.isnan( withdrawstd ) or numpy.isnan( withdrawave ) ):
+            if not ( numpy.isnan( installave ) or numpy.isnan( installstd ) or
+                     numpy.isnan( withdrawstd ) or numpy.isnan( withdrawave ) ):
                 databaseString = "'" + main.commit + "',"
                 databaseString += str( main.Cluster.numCtrls ) + ","
                 databaseString += str( batchSize ) + ","
diff --git a/TestON/tests/SCPF/SCPFintentRerouteLat/SCPFintentRerouteLat.py b/TestON/tests/SCPF/SCPFintentRerouteLat/SCPFintentRerouteLat.py
index 285e12d..41a3408 100644
--- a/TestON/tests/SCPF/SCPFintentRerouteLat/SCPFintentRerouteLat.py
+++ b/TestON/tests/SCPF/SCPFintentRerouteLat/SCPFintentRerouteLat.py
@@ -1,5 +1,5 @@
 """
-Copyright 2015 Open Networking Foundation (ONF)
+Copyright 2015 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>,
@@ -8,7 +8,7 @@
     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.
+    ( 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
@@ -18,7 +18,6 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
 # SCPFintentRerouteLat
 """
 SCPFintentRerouteLat
@@ -26,24 +25,23 @@
     - Test Algorithm:
         1. Start Null Provider reroute Topology
         2. Using Push-test-intents to push batch size intents from switch 1 to switch 7
-        3. Cut the link between switch 3 and switch 4 (the path will reroute to switch 8)
+        3. Cut the link between switch 3 and switch 4 ( the path will reroute to switch 8 )
         4. Get the topology time stamp
-        5. Get Intent reroute(Installed) time stamp from each nodes
+        5. Get Intent reroute( Installed ) time stamp from each nodes
         6. Use the latest intent time stamp subtract topology time stamp
     - This test will run 5 warm up by default, warm up iteration can be setup in Param file
     - The intent batch size will default set to 1, 100, and 1000, also can be set in Param file
     - The unit of the latency result is milliseconds
 """
-
-
 class SCPFintentRerouteLat:
+
     def __init__( self ):
         self.default = ''
 
     def CASE0( self, main ):
         import imp
         import os
-        '''
+        """
         - GIT
         - BUILDING ONOS
             Pull specific ONOS branch, then Build ONOS ono ONOS Bench.
@@ -51,7 +49,7 @@
             test env. We want Jenkins jobs to pull&build for flexibility to handle
             different versions of ONOS.
         - Construct tests variables
-        '''
+        """
         try:
             from tests.dependencies.ONOSSetup import ONOSSetup
             main.testSetUp = ONOSSetup()
@@ -115,11 +113,10 @@
         main.testSetUp.evnSetupConclusion( stepResult )
         main.commit = main.commit.split( " " )[ 1 ]
 
-
     def CASE1( self, main ):
-        '''
+        """
             clean up test environment and set up
-        '''
+        """
         import time
 
         main.maxNumBatch = 0
@@ -239,7 +236,8 @@
                         main.startLine[ i ] = timestamp
                         main.log.info( "Timestamp of last LINK_REMOVED event on node {} is {}".format( i + 1,
                                                                                                        main.startLine[ i ] ) )
-                if skip: continue
+                if skip:
+                    continue
 
                 # calculate values
                 topologyTimestamps = main.intentRerouteLatFuncs.getTopologyTimestamps( main )
diff --git a/TestON/tests/SCPF/SCPFintentRerouteLat/dependencies/intentRerouteLatFuncs.py b/TestON/tests/SCPF/SCPFintentRerouteLat/dependencies/intentRerouteLatFuncs.py
index d9d0271..d91f09e 100644
--- a/TestON/tests/SCPF/SCPFintentRerouteLat/dependencies/intentRerouteLatFuncs.py
+++ b/TestON/tests/SCPF/SCPFintentRerouteLat/dependencies/intentRerouteLatFuncs.py
@@ -1,37 +1,39 @@
-'''
+"""
 The functions for intentRerouteLat
 
-'''
+"""
 import numpy
 import time
 import json
 
+
 def _init_( self ):
     self.default = ''
 
+
 def sanityCheck( main, linkNumExpected, flowNumExpected, intentNumExpected ):
-    '''
+    """
     Sanity check on numbers of links, flows and intents in ONOS
-    '''
+    """
     attemps = 0
     main.verify = main.FALSE
     linkNum = 0
     flowNum = 0
     intentNum = 0
     while attemps <= main.verifyAttempts:
-        time.sleep(main.verifySleep)
+        time.sleep( main.verifySleep )
         summary = json.loads( main.Cluster.active( 0 ).CLI.summary( timeout=main.timeout ) )
-        linkNum = summary.get("links")
-        flowNum = summary.get("flows")
-        intentNum = summary.get("intents")
+        linkNum = summary.get( "links" )
+        flowNum = summary.get( "flows" )
+        intentNum = summary.get( "intents" )
         if linkNum == linkNumExpected and flowNum == flowNumExpected and intentNum == intentNumExpected:
-            main.log.info("links: {}, flows: {}, intents: {}".format(linkNum, flowNum, intentNum))
+            main.log.info( "links: {}, flows: {}, intents: {}".format( linkNum, flowNum, intentNum ) )
             main.verify = main.TRUE
             break
         attemps += 1
     if not main.verify:
-        main.log.warn("Links or flows or intents number not as expected")
-        main.log.warn("links: {}, flows: {}, intents: {}".format(linkNum, flowNum, intentNum))
+        main.log.warn( "Links or flows or intents number not as expected" )
+        main.log.warn( "links: {}, flows: {}, intents: {}".format( linkNum, flowNum, intentNum ) )
         # bring back topology
         bringBackTopology( main )
         if main.validRun >= main.warmUp:
@@ -39,6 +41,7 @@
         else:
             main.validRun += 1
 
+
 def bringBackTopology( main ):
     main.log.info( "Bring back topology " )
     main.Cluster.active( 0 ).CLI.pushTestIntents( main.ingress,
@@ -46,20 +49,20 @@
                                                   main.batchSize,
                                                   offset=1,
                                                   options="-w",
-                                                  timeout=main.timeout)
+                                                  timeout=main.timeout )
     main.Cluster.active( 0 ).CLI.purgeWithdrawnIntents()
     main.Cluster.active( 0 ).CLI.setCfg( main.nullProviderCfg,
                                          "deviceCount",
-                                         value=0)
+                                         value=0 )
     main.Cluster.active( 0 ).CLI.setCfg( main.nullProviderCfg,
                                          "enabled",
-                                         value="false")
+                                         value="false" )
     main.Cluster.active( 0 ).CLI.setCfg( main.nullProviderCfg,
                                          "deviceCount",
-                                         value=main.deviceCount)
+                                         value=main.deviceCount )
     main.Cluster.active( 0 ).CLI.setCfg( main.nullProviderCfg,
                                          "enabled",
-                                         value="true")
+                                         value="true" )
     main.Cluster.active( 0 ).CLI.balanceMasters()
     time.sleep( main.setMasterSleep )
     if main.Cluster.numCtrls > 1:
@@ -69,10 +72,11 @@
                                                  main.Cluster.active( 0 ).ipAddress )
     time.sleep( main.setMasterSleep )
 
+
 def getLogNum( main, nodeId ):
-    '''
+    """
     Return the number of karaf log files
-    '''
+    """
     try:
         logNameList = main.ONOSbench.listLog( main.Cluster.active( nodeId ).ipAddress )
         assert logNameList is not None
@@ -81,13 +85,14 @@
             return 2
         return 1
     except AssertionError:
-        main.log.error("There is no karaf log")
+        main.log.error( "There is no karaf log" )
         return -1
 
+
 def getTopologyTimestamps( main ):
-    '''
+    """
     Get timestamps for the last topology events on all cluster nodes
-    '''
+    """
     timestamps = []
     for i in range( main.Cluster.numCtrls ):
         # Search for last topology event in karaf log
@@ -99,7 +104,7 @@
             main.log.error( "Error when trying to get topology event timestamp" )
             return main.ERROR
         try:
-            timestampField = lines[0].split( "creationTime=" )
+            timestampField = lines[ 0 ].split( "creationTime=" )
             timestamp = timestampField[ 1 ].split( "," )
             timestamp = int( timestamp[ 0 ] )
             timestamps.append( timestamp )
@@ -108,10 +113,11 @@
             return main.ERROR
     return timestamps
 
+
 def getIntentTimestamps( main ):
-    '''
+    """
     Get timestamps for all intent keys on all cluster nodes
-    '''
+    """
     timestamps = {}
     for i in range( main.Cluster.numCtrls ):
         # Search for intent INSTALLED event in karaf log
@@ -128,7 +134,7 @@
                 keyField = line.split( "key=" )
                 key = keyField[ 1 ].split( "," )
                 key = key[ 0 ]
-                if not key in timestamps.keys():
+                if key not in timestamps.keys():
                     timestamps[ key ] = []
                 # Get timestamp
                 timestampField = line.split( "time = " )
@@ -140,10 +146,11 @@
                 return main.ERROR
     return timestamps
 
+
 def calculateLatency( main, topologyTimestamps, intentTimestamps ):
-    '''
+    """
     Calculate reroute latency values using timestamps
-    '''
+    """
     topologyTimestamp = numpy.min( topologyTimestamps )
     firstInstalledLatency = {}
     lastInstalledLatency = {}
diff --git a/TestON/tests/SCPF/SCPFmastershipFailoverLat/SCPFmastershipFailoverLat.py b/TestON/tests/SCPF/SCPFmastershipFailoverLat/SCPFmastershipFailoverLat.py
index ecbf5cd..0a99c41 100644
--- a/TestON/tests/SCPF/SCPFmastershipFailoverLat/SCPFmastershipFailoverLat.py
+++ b/TestON/tests/SCPF/SCPFmastershipFailoverLat/SCPFmastershipFailoverLat.py
@@ -1,5 +1,5 @@
 """
-Copyright 2017 Open Networking Foundation (ONF)
+Copyright 2017 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>,
@@ -8,7 +8,7 @@
     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.
+    ( 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
@@ -18,15 +18,15 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
 class SCPFmastershipFailoverLat:
+
     def __init__( self ):
         self.default = ''
 
     def CASE0( self, main ):
         import os
         import imp
-        '''
+        """
         - GIT
         - BUILDING ONOS
             Pull specific ONOS branch, then Build ONOS ono ONOS Bench.
@@ -34,7 +34,7 @@
             test env. We want Jenkins jobs to pull&build for flexibility to handle
             different versions of ONOS.
         - Construct tests variables
-        '''
+        """
         try:
             from tests.dependencies.ONOSSetup import ONOSSetup
             main.testSetUp = ONOSSetup()
@@ -79,8 +79,6 @@
             main.testSetUp.envSetupException( e )
         main.testSetUp.evnSetupConclusion( stepResult )
 
-
-
     def CASE1( self, main ):
         # Clean up test environment and set up
         import time
@@ -110,11 +108,10 @@
                                  onpass="Mininet was set up correctly.",
                                  onfail="Mininet was NOT set up correctly." )
 
-
     def CASE2( self, main ):
         """
         Kill ONOS node, and measure the latency for INSTANCE_DEACTIVATED, MASTER_CHANGED, and role request
-        (tshark time), then bring the node back up.
+        ( tshark time ), then bring the node back up.
         """
         import time
         import datetime
@@ -123,14 +120,17 @@
 
         main.HA = HA()
 
-        main.latencyData = { 'kill_to_deactivation' : [],
-                             'deactivation_to_role_request' : [] }
+        main.latencyData = { 'kill_to_deactivation': [],
+                             'deactivation_to_role_request': [] }
 
         main.failCounter = 0
         passingResult = True
         criticalError = False
 
-        main.step( "Gathering data starting with " + str( main.warmUp ) + " warm ups and a sample size of " + str( main.sampleSize ) )
+        main.step( "Gathering data starting with "
+                   + str( main.warmUp )
+                   + " warm ups and a sample size of "
+                   + str( main.sampleSize ) )
 
         for iteration in range( 0, main.sampleSize + main.warmUp ):
 
@@ -185,10 +185,12 @@
                 eventOutput = main.Cluster.active( CLInum ).CLI.events( args='-a' ).split( "\r\n" )
                 for line in reversed( eventOutput ):
                     if "INSTANCE_DEACTIVATED" in line and len( instanceDeactivatedLats ) == CLInum:
-                        deactivateTime = float( datetime.datetime.strptime( line.split()[ 0 ], "%Y-%m-%dT%H:%M:%S.%f" ).strftime( '%s.%f' ) ) * 1000.0
+                        deactivateTime = float( datetime.datetime.strptime(
+                                            line.split()[ 0 ], "%Y-%m-%dT%H:%M:%S.%f" ).strftime( '%s.%f' ) ) * 1000.0
                         instanceDeactivatedLats.append( deactivateTime - time1 )
                     elif "MASTER_CHANGED" in line and len( masterChangedLats ) == CLInum:
-                        changedTime = float( datetime.datetime.strptime( line.split()[ 0 ], "%Y-%m-%dT%H:%M:%S.%f" ).strftime( '%s.%f' ) ) * 1000.0
+                        changedTime = float( datetime.datetime.strptime(
+                                            line.split()[ 0 ], "%Y-%m-%dT%H:%M:%S.%f" ).strftime( '%s.%f' ) ) * 1000.0
                         masterChangedLats.append( changedTime - time1 )
                     if len( instanceDeactivatedLats ) > CLInum and len( masterChangedLats ) > CLInum:
                         break
@@ -228,9 +230,10 @@
 
                     if eventLatCheck and tsharkLatCheck and validDataCheck:
                         main.log.info( "Saving data..." )
-                        main.latencyData[ 'kill_to_deactivation' ].append( instanceDeactivated )
-                        main.latencyData[ 'deactivation_to_role_request' ].append( roleRequestLat - instanceDeactivated )
-
+                        main.latencyData[ 'kill_to_deactivation' ]\
+                            .append( instanceDeactivated )
+                        main.latencyData[ 'deactivation_to_role_request' ]\
+                            .append( roleRequestLat - instanceDeactivated )
 
             # Restart ONOS node
             main.log.info( "Restart ONOS node " + strNodeNumToKill + " and checking status of restart." )
@@ -279,24 +282,28 @@
                 main.failCounter += 1
                 main.log.warn( "Iteration failed. Failure count: " + str( main.failCounter ) )
             if float( main.failCounter ) / float( main.sampleSize ) >= main.failPercent or criticalError:
-                main.log.error( str( main.failPercent * 100 ) + "% or more of data is invalid, or a critical error has occurred." )
+                main.log.error( str( main.failPercent * 100 )
+                                + "% or more of data is invalid, or a critical error has occurred." )
                 passingResult = False
                 break
 
         utilities.assert_equals( expect=True, actual=passingResult,
-                                 onpass="Node scaling " + str( main.Cluster.numCtrls ) + " data gathering was successful.",
-                                 onfail="Node scaling " + str( main.Cluster.numCtrls ) + " data gathering FAILED. Stopping test.")
+                                 onpass="Node scaling "
+                                        + str( main.Cluster.numCtrls )
+                                        + " data gathering was successful.",
+                                 onfail="Node scaling "
+                                        + str( main.Cluster.numCtrls )
+                                        + " data gathering FAILED. Stopping test." )
         if not passingResult:
             main.cleanAndExit()
 
-
     def CASE3( self, main ):
         """
         Write results to database file.
         Omit this case if you don't want to write to database.
         """
         import numpy
-        result = { 'avg' : {}, 'stddev' : {} }
+        result = { 'avg': {}, 'stddev': {} }
 
         for i in main.latencyData:
             result[ 'avg' ][ i ] = numpy.average( main.latencyData[ i ] )
@@ -305,7 +312,7 @@
         main.log.info( "result: " + str( result ) )
         with open( main.dbFileName, "a" ) as dbFile:
             strToWrite = str( main.Cluster.numCtrls ) + ",'baremetal1'"
-            strToWrite += ",'" + main.commit.split()[ 1 ] + "'"
+            strToWrite += ",'" + main.commit.split()[1] + "'"
             for i in result:
                 for j in result[ i ]:
                     strToWrite += "," + str( result[ i ][ j ] )
diff --git a/TestON/tests/SCPF/SCPFportLat/SCPFportLat.py b/TestON/tests/SCPF/SCPFportLat/SCPFportLat.py
index 0c18564..180d860 100644
--- a/TestON/tests/SCPF/SCPFportLat/SCPFportLat.py
+++ b/TestON/tests/SCPF/SCPFportLat/SCPFportLat.py
@@ -1,5 +1,5 @@
 """
-Copyright 2015 Open Networking Foundation (ONF)
+Copyright 2015 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>,
@@ -8,7 +8,7 @@
     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.
+    ( 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
@@ -18,23 +18,23 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
-'''
+"""
     SCPFportLat test
     Test latency for port status change
     Up & Down:
     PortStatus --- Device --- Link --- Graph
 
     yunpeng@onlab.us
-'''
+"""
 class SCPFportLat:
+
     def __init__( self ):
         self.default = ''
 
     def CASE0( self, main ):
         import os
         import imp
-        '''
+        """
         - GIT
         - BUILDING ONOS
             Pull specific ONOS branch, then Build ONOS ono ONOS Bench.
@@ -42,7 +42,7 @@
             test env. We want Jenkins jobs to pull&build for flexibility to handle
             different versions of ONOS.
         - Construct tests variables
-        '''
+        """
         try:
             from tests.dependencies.ONOSSetup import ONOSSetup
             main.testSetUp = ONOSSetup()
@@ -87,9 +87,9 @@
             resultsDB.close()
 
             main.portFunc = imp.load_source( main.dependencyFunc,
-                                           main.dependencyPath +
-                                           main.dependencyFunc +
-                                           ".py" )
+                                             main.dependencyPath +
+                                             main.dependencyFunc +
+                                             ".py" )
         except Exception as e:
             main.testSetUp.envSetupException( e )
         main.testSetUp.evnSetupConclusion( stepResult )
@@ -111,9 +111,9 @@
         time.sleep( 1 )
         main.log.info( "Copy topology file to Mininet" )
         main.ONOSbench.copyMininetFile( main.topoName,
-                                       main.dependencyPath,
-                                       main.Mininet1.user_name,
-                                       main.Mininet1.ip_address )
+                                        main.dependencyPath,
+                                        main.Mininet1.user_name,
+                                        main.Mininet1.ip_address )
         try:
             from tests.dependencies.utils import Utils
         except ImportError:
@@ -140,7 +140,7 @@
         import time
         import numpy
         # dictionary for each node and each timestamps
-        resultDict = { 'up' : {}, 'down' : {} }
+        resultDict = { 'up': {}, 'down': {} }
         for d in resultDict:
             for i in range( 1, main.Cluster.numCtrls + 1 ):
                 resultDict[ d ][ 'node' + str( i ) ] = {}
@@ -152,7 +152,7 @@
                 resultDict[ d ][ 'node' + str( i ) ][ 'LtoG' ] = []
         for i in range( 0, main.sampleSize + main.warmUp ):
             main.log.info( "==========================================" )
-            main.log.info( "================iteration:{}==============".format( str ( i + 1 ) ) )
+            main.log.info( "================iteration:{}==============".format( str( i + 1 ) ) )
             if i >= main.warmUp:
                 # Portdown iteration
                 main.portFunc.capturePortStatusPack( main,
@@ -185,7 +185,7 @@
                                                      True )
 
         # Dictionary for result
-        maxDict  = {}
+        maxDict = {}
         maxDict[ 'down' ] = {}
         maxDict[ 'up' ] = {}
         maxDict[ 'down' ][ 'max' ] = 0
diff --git a/TestON/tests/SCPF/SCPFportLat/dependencies/portFunc.py b/TestON/tests/SCPF/SCPFportLat/dependencies/portFunc.py
index f773da3..4c94193 100644
--- a/TestON/tests/SCPF/SCPFportLat/dependencies/portFunc.py
+++ b/TestON/tests/SCPF/SCPFportLat/dependencies/portFunc.py
@@ -1,5 +1,5 @@
 """
-Copyright 2016 Open Networking Foundation (ONF)
+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>,
@@ -8,7 +8,7 @@
     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.
+    ( 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
@@ -18,15 +18,13 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
 import time
 import json
-'''
+"""
     Warp function for SCPFportLat test
-'''
-
+"""
 def capturePortStatusPack( main, deviceName, interface, portStatus, resultDict, warmup ):
-    '''
+    """
     Change device port status and use tshark to capture openflow port package
     Args:
         main: TestON class
@@ -36,10 +34,10 @@
         resultDict: put result to dictionary
         warmup: if warmup, ignore results
 
-    '''
+    """
     main.log.info( "Clean up tshark" )
     with open( main.tsharkResultPath, "w" ) as tshark:
-        tshark.write("")
+        tshark.write( "" )
     main.log.info( "Starting tshark capture" )
     main.ONOSbench.tsharkGrep( main.ofportStatus, main.tsharkResultPath )
     time.sleep( main.measurementSleep )
@@ -55,7 +53,7 @@
         main.log.info( "Capture result:" + resultText )
         resultText = resultText.split( " " )
         if len( resultText ) > 1:
-            tsharkResultTime = int( float( resultText[1] ) * 1000.0 )
+            tsharkResultTime = int( float( resultText[ 1 ] ) * 1000.0 )
             resultFile.close()
             for i in range( 1, main.Cluster.numCtrls + 1 ):
                 main.log.info( "================================================" )
@@ -92,9 +90,9 @@
                 else:
                     # put result to dictionary
                     if not warmup:
-                        resultDict[ portStatus ][ 'node' + str(i) ]['EtoE'].append( EtoE )
-                        resultDict[ portStatus ][ 'node' + str(i) ]['PtoD'].append( PtoD )
-                        resultDict[ portStatus ][ 'node' + str(i) ]['DtoL'].append( DtoL )
-                        resultDict[ portStatus ][ 'node' + str(i) ]['LtoG'].append( LtoG )
+                        resultDict[ portStatus ][ 'node' + str( i ) ][ 'EtoE' ].append( EtoE )
+                        resultDict[ portStatus ][ 'node' + str( i ) ][ 'PtoD' ].append( PtoD )
+                        resultDict[ portStatus ][ 'node' + str( i ) ][ 'DtoL' ].append( DtoL )
+                        resultDict[ portStatus ][ 'node' + str( i ) ][ 'LtoG' ].append( LtoG )
         else:
             main.log.error( "Unexpected tshark output file" )
diff --git a/TestON/tests/SCPF/SCPFportLat/dependencies/topo-perf-2sw.py b/TestON/tests/SCPF/SCPFportLat/dependencies/topo-perf-2sw.py
index 828e44a..7efed0c 100644
--- a/TestON/tests/SCPF/SCPFportLat/dependencies/topo-perf-2sw.py
+++ b/TestON/tests/SCPF/SCPFportLat/dependencies/topo-perf-2sw.py
@@ -1,5 +1,5 @@
 """
-Copyright 2016 Open Networking Foundation (ONF)
+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>,
@@ -8,7 +8,7 @@
     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.
+    ( 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
@@ -18,18 +18,18 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
-'''
+"""
 Simple 2 switch topology for topologoy performance test
-'''
-
+"""
 from mininet.topo import Topo
 
+
 class MyTopo( Topo ):
-    def __init__(self):
-        Topo.__init__(self)
-        s1 = self.addSwitch( "s1", dpid="0000000000000001")
-        s2 = self.addSwitch( "s2", dpid="0000000000000002")
+
+    def __init__( self ):
+        Topo.__init__( self )
+        s1 = self.addSwitch( "s1", dpid="0000000000000001" )
+        s2 = self.addSwitch( "s2", dpid="0000000000000002" )
 
         h1 = self.addHost( "h1" )
         h2 = self.addHost( "h2" )
diff --git a/TestON/tests/SCPF/SCPFscaleTopo/SCPFscaleTopo.py b/TestON/tests/SCPF/SCPFscaleTopo/SCPFscaleTopo.py
index 0ecee0b..d4740f4 100644
--- a/TestON/tests/SCPF/SCPFscaleTopo/SCPFscaleTopo.py
+++ b/TestON/tests/SCPF/SCPFscaleTopo/SCPFscaleTopo.py
@@ -1,5 +1,5 @@
 """
-Copyright 2015 Open Networking Foundation (ONF)
+Copyright 2015 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>,
@@ -8,7 +8,7 @@
     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.
+    ( 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
@@ -18,10 +18,10 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
 # Testing network scalability, this test suite scales up a network topology
 # using mininet and verifies ONOS stability
 
+
 class SCPFscaleTopo:
 
     def __init__( self ):
@@ -81,19 +81,18 @@
             main.homeDir = os.path.expanduser( '~' )
             main.hostsData = {}
 
-
             stepResult = main.testSetUp.envSetup()
-            main.allinfo = {} # The dictionary to record all the data from karaf.log
+            main.allinfo = {}  # The dictionary to record all the data from karaf.log
 
             for i in range( 2 ):
-                main.allinfo[ i ]={}
-                for w in range ( 3 ):
+                main.allinfo[ i ] = {}
+                for w in range( 3 ):
                     # Totaltime: the time from the new switchConnection to its end
                     # swConnection: the time from the first new switchConnection to the last new switchConnection
                     # lastSwToLastRr: the time from the last new switchConnection to the last role request
                     # lastRrToLastTopology: the time form the last role request to the last topology
                     # disconnectRate: the rate that shows how many switch disconnect after connection
-                    main.allinfo[ i ][ 'info' + str( w ) ]= { 'totalTime': 0, 'swConnection': 0, 'lastSwToLastRr': 0, 'lastRrToLastTopology': 0, 'disconnectRate': 0 }
+                    main.allinfo[ i ][ 'info' + str( w ) ] = { 'totalTime': 0, 'swConnection': 0, 'lastSwToLastRr': 0, 'lastRrToLastTopology': 0, 'disconnectRate': 0 }
 
             main.dbFilePath = main.params[ 'DATABASE' ][ 'dbPath' ]
             main.log.info( "Create Database file " + main.dbFilePath )
@@ -149,20 +148,20 @@
         """
             Starting up torus topology
         """
-
         main.case( "Starting up Mininet and verifying topology" )
         main.caseExplanation = "Starting Mininet with a scalling topology and " +\
                 "comparing topology elements between Mininet and ONOS"
         if main.topoScale:
             main.currScale = main.topoScale.pop( 0 )
-        else: main.log.error( "topology scale is empty" )
+        else:
+            main.log.error( "topology scale is empty" )
         main.step( "Starting up TORUS %sx%s topology" % ( main.currScale, main.currScale ) )
 
         main.log.info( "Constructing Mininet command" )
         mnCmd = " mn --custom " + main.Mininet1.home + main.multiovs + \
                 " --switch ovsm --topo " + main.topoName + "," + main.currScale + "," + main.currScale
         for ctrl in main.Cluster.runningNodes:
-                mnCmd += " --controller remote,ip=" + ctrl.ipAddress
+            mnCmd += " --controller remote,ip=" + ctrl.ipAddress
         stepResult = main.Mininet1.startNet( mnCmd=mnCmd )
         utilities.assert_equals( expect=main.TRUE,
                                  actual=stepResult,
@@ -226,7 +225,7 @@
         main.step( "Comparing MN topology to ONOS topology" )
         compareRetry = 0
         while compareRetry < 3:
-            #While loop for retry
+            # While loop for retry
             devices = main.topoRelated.getAll( "devices" )
             ports = main.topoRelated.getAll( "ports" )
             links = main.topoRelated.getAll( "links" )
@@ -240,8 +239,8 @@
                                                             devices, ports )
 
                 currentLinksResult = main.topoRelated.compareBase( links, controller,
-                                                        main.Mininet1.compareLinks,
-                                                        [ mnSwitches, mnLinks ] )
+                                                                   main.Mininet1.compareLinks,
+                                                                   [ mnSwitches, mnLinks ] )
 
                 stepResult = stepResult and currentDevicesResult and currentLinksResult
             if stepResult:
@@ -250,24 +249,24 @@
         utilities.assert_equals( expect=main.TRUE,
                                  actual=stepResult,
                                  onpass=" Topology match Mininet",
-                                 onfail="ONOS Topology doesn't match Mininet")
+                                 onfail="ONOS Topology doesn't match Mininet" )
 
         if stepResult:
             if main.hostDiscover:
                 hostList = []
                 for i in range( 1, int( main.currScale ) + 1 ):
-                    for j in range( 1, int( main.currScale ) + 1) :
+                    for j in range( 1, int( main.currScale ) + 1 ):
                         # Generate host list
-                        hoststr = "h" + str(i) + "x" + str(j)
-                        hostList.append(hoststr)
-                for i in range( len(hostList) ):
-                    totalHost = main.topo.sendArpPackage( main, hostList[i] )
+                        hoststr = "h" + str( i ) + "x" + str( j )
+                        hostList.append( hoststr )
+                for i in range( len( hostList ) ):
+                    totalHost = main.topo.sendArpPackage( main, hostList[ i ] )
                     time.sleep( main.hostDiscoverSleep )
                     if totalHost < 0:
                         # if totalHost less than 0 which means dependence function has exception.
                         main.log.info( "Error when discover host!" )
                         break
-                if totalHost == int( main.currScale ) *  int( main.currScale ):
+                if totalHost == int( main.currScale ) * int( main.currScale ):
                     main.log.info( "Discovered all hosts" )
                     stepResult = stepResult and main.TRUE
                 else:
@@ -276,18 +275,17 @@
                 utilities.assert_equals( expect=main.TRUE,
                                          actual=stepResult,
                                          onpass=" Topology match Mininet",
-                                         onfail="ONOS Topology doesn't match Mininet")
+                                         onfail="ONOS Topology doesn't match Mininet" )
             main.log.info( "Finished this iteration, continue to scale next topology." )
         else:
             main.log.info( "Clean up and exit TestON. Finished this test." )
             main.cleanAndExit()
 
     def CASE100( self, main ):
-        '''
+        """
            Bring Down node 3
-        '''
-
-        main.case("Bring ONOS node 3 down: TORUS %sx%s" % (main.currScale, main.currScale))
+        """
+        main.case( "Bring ONOS node 3 down: TORUS %sx%s" % ( main.currScale, main.currScale ) )
         main.caseExplanation = "Balance masters to make sure " +\
                         "each controller has some devices and " +\
                         "stop ONOS node 3 service. "
@@ -309,11 +307,10 @@
                                  onfail="Failed to bring down node 3" )
 
     def CASE200( self, main ):
-        '''
+        """
             Bring up onos node
-        '''
-
-        main.case("Bring ONOS node 3 up: TORUS %sx%s" % (main.currScale, main.currScale))
+        """
+        main.case( "Bring ONOS node 3 up: TORUS %sx%s" % ( main.currScale, main.currScale ) )
         main.caseExplanation = "Bring node 3 back up and balance the masters"
         ctrl = main.Cluster.runningNodes[ main.deadNode ]
         node = main.deadNode + 1
@@ -330,15 +327,13 @@
                                  onpass="Successfully brought up onos node %s" % node,
                                  onfail="Failed to bring up onos node %s" % node )
 
-
-        time.sleep(main.nodeSleep)
+        time.sleep( main.nodeSleep )
 
     def CASE300( self, main ):
-        '''
-
+        """
             Balancing Masters
-        '''
-        time.sleep(main.balanceSleep)
+        """
+        time.sleep( main.balanceSleep )
         main.step( "Balancing Masters" )
 
         stepResult = main.FALSE
@@ -353,56 +348,56 @@
         utilities.assert_equals( expect=main.TRUE,
                                  actual=stepResult,
                                  onpass="Balance masters was successfull",
-                                 onfail="Failed to balance masters")
+                                 onfail="Failed to balance masters" )
         time.sleep( main.balanceSleep )
 
     def CASE1000( self, main ):
-        '''
+        """
             Report errors/warnings/exceptions
-        '''
+        """
         # Compare the slowest Node through total time of each node
         slowestNode = 0
         slowestTotalTime = 0
         # Second capture
         for i in range( 3 ):
             # Calculate total time
-            main.allinfo[ 1 ][ 'info' + str( i )][ 'totalTime' ] = main.scaleTopoFunction.getInfoFromLog( main,
-                                                                                                          main.searchTerm[ 'start' ],
-                                                                                                          'first',
-                                                                                                          main.searchTerm[ 'end' ],
-                                                                                                          'last',
-                                                                                                          index=i,
-                                                                                                          funcMode='TD' )
+            main.allinfo[ 1 ][ 'info' + str( i ) ][ 'totalTime' ] = main.scaleTopoFunction.getInfoFromLog( main,
+                                                                                                           main.searchTerm[ 'start' ],
+                                                                                                           'first',
+                                                                                                           main.searchTerm[ 'end' ],
+                                                                                                           'last',
+                                                                                                           index=i,
+                                                                                                           funcMode='TD' )
             # Compare the total time
             if main.allinfo[ 1 ][ 'info' + str( i ) ][ 'totalTime' ] > slowestTotalTime:
                 slowestTotalTime = main.allinfo[ 1 ][ 'info' + str( i ) ][ 'totalTime' ]
                 slowestNode = i
             # Calculate switch connection time
-            main.allinfo[ 1 ][ 'info' + str( i )][ 'swConnection' ] = main.scaleTopoFunction.getInfoFromLog( main,
-                                                                                                             main.searchTerm[ 'start' ],
-                                                                                                             'first',
-                                                                                                             main.searchTerm[ 'start' ],
-                                                                                                             'last',
-                                                                                                             index=i,
-                                                                                                             funcMode='TD' )
+            main.allinfo[ 1 ][ 'info' + str( i ) ][ 'swConnection' ] = main.scaleTopoFunction.getInfoFromLog( main,
+                                                                                                              main.searchTerm[ 'start' ],
+                                                                                                              'first',
+                                                                                                              main.searchTerm[ 'start' ],
+                                                                                                              'last',
+                                                                                                              index=i,
+                                                                                                              funcMode='TD' )
             # Calculate the time from last switch connection to the last role request
-            main.allinfo[ 1 ][ 'info' + str( i )][ 'lastSwToLastRr' ] = main.scaleTopoFunction.compareTimeDiffWithRoleRequest( main,
-                                                                                                                               main.searchTerm[ 'start' ],
-                                                                                                                               'last',
-                                                                                                                               index=i )
+            main.allinfo[ 1 ][ 'info' + str( i ) ][ 'lastSwToLastRr' ] = main.scaleTopoFunction.compareTimeDiffWithRoleRequest( main,
+                                                                                                                                main.searchTerm[ 'start' ],
+                                                                                                                                'last',
+                                                                                                                                index=i )
             # Calculate the time from the last role request to the last topology
-            main.allinfo[ 1 ][ 'info' + str( i )][ 'lastRrToLastTopology' ] = main.scaleTopoFunction.compareTimeDiffWithRoleRequest( main,
-                                                                                                                                     main.searchTerm[ 'end' ],
-                                                                                                                                     'last',
-                                                                                                                                     index=i )
+            main.allinfo[ 1 ][ 'info' + str( i ) ][ 'lastRrToLastTopology' ] = main.scaleTopoFunction.compareTimeDiffWithRoleRequest( main,
+                                                                                                                                      main.searchTerm[ 'end' ],
+                                                                                                                                      'last',
+                                                                                                                                      index=i )
             # Calculate the disconnecti rate
-            main.allinfo[ 1 ][ 'info' + str( i )][ 'disconnectRate' ] = main.scaleTopoFunction.getInfoFromLog( main,
-                                                                                                               main.searchTerm[ 'Disconnect' ],
-                                                                                                               'num',
-                                                                                                               main.searchTerm[ 'start' ],
-                                                                                                               'num',
-                                                                                                               index=i,
-                                                                                                               funcMode='DR' )
+            main.allinfo[ 1 ][ 'info' + str( i ) ][ 'disconnectRate' ] = main.scaleTopoFunction.getInfoFromLog( main,
+                                                                                                                main.searchTerm[ 'Disconnect' ],
+                                                                                                                'num',
+                                                                                                                main.searchTerm[ 'start' ],
+                                                                                                                'num',
+                                                                                                                index=i,
+                                                                                                                funcMode='DR' )
 
         if ( main.allinfo[ 0 ] != main.allinfo[ 1 ] ):
             main.log.error( "The results of two capture are different!" )
@@ -414,11 +409,11 @@
                 temp = str( main.currScale )
                 temp += ",'baremetal1'"
                 # put result from second capture into data base
-                temp += "," + str( "%.2f" % main.allinfo[ 1 ][ 'info' + str( slowestNode )][ 'totalTime' ] )
-                temp += "," + str( "%.2f" % main.allinfo[ 1 ][ 'info' + str( slowestNode )][ 'swConnection' ] )
-                temp += "," + str( "%.2f" % main.allinfo[ 1 ][ 'info' + str( slowestNode )][ 'lastSwToLastRr' ] )
-                temp += "," + str( "%.2f" % main.allinfo[ 1 ][ 'info' + str( slowestNode )][ 'lastRrToLastTopology' ] )
-                temp += "," + str( "%.2f" % main.allinfo[ 1 ][ 'info' + str( slowestNode )][ 'disconnectRate' ] )
+                temp += "," + str( "%.2f" % main.allinfo[ 1 ][ 'info' + str( slowestNode ) ][ 'totalTime' ] )
+                temp += "," + str( "%.2f" % main.allinfo[ 1 ][ 'info' + str( slowestNode ) ][ 'swConnection' ] )
+                temp += "," + str( "%.2f" % main.allinfo[ 1 ][ 'info' + str( slowestNode ) ][ 'lastSwToLastRr' ] )
+                temp += "," + str( "%.2f" % main.allinfo[ 1 ][ 'info' + str( slowestNode ) ][ 'lastRrToLastTopology' ] )
+                temp += "," + str( "%.2f" % main.allinfo[ 1 ][ 'info' + str( slowestNode ) ][ 'disconnectRate' ] )
                 temp += "\n"
                 dbFile.write( temp )
         else:
diff --git a/TestON/tests/SCPF/SCPFscaleTopo/dependencies/multiovs.py b/TestON/tests/SCPF/SCPFscaleTopo/dependencies/multiovs.py
old mode 100755
new mode 100644
index 9849069..e15fe72
--- a/TestON/tests/SCPF/SCPFscaleTopo/dependencies/multiovs.py
+++ b/TestON/tests/SCPF/SCPFscaleTopo/dependencies/multiovs.py
@@ -1,7 +1,7 @@
 #!/usr/bin/python
 
 """
-Copyright 2015 Open Networking Foundation (ONF)
+Copyright 2015 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>,
@@ -10,7 +10,7 @@
     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.
+    ( 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
@@ -20,7 +20,6 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
 """
 Multiple ovsdb OVS!!
 
@@ -32,7 +31,6 @@
 delegated to the ovsdb instance.
 
 """
-
 from mininet.net import Mininet
 from mininet.node import Node, OVSSwitch
 from mininet.node import OVSBridge
@@ -46,7 +44,9 @@
 from itertools import groupby
 from operator import attrgetter
 
+
 class OVSDB( Node ):
+
     "Namespace for an OVSDB instance"
 
     privateDirs = [ '/etc/openvswitch',
@@ -70,7 +70,7 @@
             info( '### Adding NAT for control and data networks'
                   ' (use --nat flush=0 for data network)\n' )
             cls.cnet = cnet
-            cls.nat = cnet.addNAT( 'ovsdbnat0')
+            cls.nat = cnet.addNAT( 'ovsdbnat0' )
             cnet.start()
             info( '### Control network started\n' )
         return cnet
@@ -155,6 +155,7 @@
 
 
 class OVSSwitchNS( OVSSwitch ):
+
     "OVS Switch in shared OVSNS namespace"
 
     isSetup = False
@@ -162,7 +163,7 @@
     @classmethod
     def batchStartup( cls, switches ):
         result = []
-        for ovsdb, switchGroup in groupby( switches, attrgetter( 'ovsdb') ):
+        for ovsdb, switchGroup in groupby( switches, attrgetter( 'ovsdb' ) ):
             switchGroup = list( switchGroup )
             info( '(%s)' % ovsdb )
             result += OVSSwitch.batchStartup( switchGroup, run=ovsdb.cmd )
@@ -171,7 +172,7 @@
     @classmethod
     def batchShutdown( cls, switches ):
         result = []
-        for ovsdb, switchGroup in groupby( switches, attrgetter( 'ovsdb') ):
+        for ovsdb, switchGroup in groupby( switches, attrgetter( 'ovsdb' ) ):
             switchGroup = list( switchGroup )
             info( '(%s)' % ovsdb )
             for switch in switches:
@@ -214,7 +215,7 @@
             # Delegate methods and initialize local vars
             attrs = ( 'cmd', 'cmdPrint', 'sendCmd', 'waitOutput',
                       'monitor', 'write', 'read',
-                      'pid', 'shell', 'stdout',)
+                      'pid', 'shell', 'stdout', )
             for attr in attrs:
                 setattr( self, attr, getattr( ovsdb, attr ) )
         self.defaultIntf().updateIP()
@@ -246,14 +247,14 @@
             super( OVSSwitchNS, self ).terminate( *args, **kwargs )
         else:
             self.pid = None
-            self.shell= None
+            self.shell = None
 
     def defaultIntf( self ):
         return self.ovsdb.defaultIntf()
 
     def __init__( self, *args, **kwargs ):
         """n: number of OVS instances per OVSDB
-           shell: run private shell/bash process? (False)
+           shell: run private shell/bash process? ( False )
            If shell is shared/not private, cmd() and popen() are
            delegated to the OVSDB instance, which is different than
            regular OVSSwitch semantics!!"""
@@ -261,7 +262,9 @@
         self.privateShell = kwargs.pop( 'shell', False )
         super( OVSSwitchNS, self ).__init__( *args, **kwargs )
 
+
 class OVSLinkNS( Link ):
+
     "OVSLink that supports OVSSwitchNS"
 
     def __init__( self, node1, node2, **kwargs ):
@@ -279,6 +282,7 @@
 
 links = { 'ovs': OVSLinkNS }
 
+
 def test():
     "Test OVSNS switch"
     setLogLevel( 'info' )
diff --git a/TestON/tests/SCPF/SCPFscaleTopo/dependencies/newFuncTopo.py b/TestON/tests/SCPF/SCPFscaleTopo/dependencies/newFuncTopo.py
old mode 100755
new mode 100644
index 1f1c487..596ff2c
--- a/TestON/tests/SCPF/SCPFscaleTopo/dependencies/newFuncTopo.py
+++ b/TestON/tests/SCPF/SCPFscaleTopo/dependencies/newFuncTopo.py
@@ -1,7 +1,7 @@
 #!/usr/bin/python
 
 """
-Copyright 2015 Open Networking Foundation (ONF)
+Copyright 2015 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>,
@@ -10,7 +10,7 @@
     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.
+    ( 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
@@ -20,7 +20,6 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
 """
 Custom topology for Mininet
 """
@@ -35,19 +34,23 @@
 from mininet.util import dumpNodeConnections
 from mininet.node import ( UserSwitch, OVSSwitch, IVSSwitch )
 
+
 class VLANHost( Host ):
+
     def config( self, vlan=100, **params ):
         r = super( Host, self ).config( **params )
         intf = self.defaultIntf()
         self.cmd( 'ifconfig %s inet 0' % intf )
         self.cmd( 'vconfig add %s %d' % ( intf, vlan ) )
-        self.cmd( 'ifconfig %s.%d inet %s' % ( intf, vlan, params['ip'] ) )
+        self.cmd( 'ifconfig %s.%d inet %s' % ( intf, vlan, params[ 'ip' ] ) )
         newName = '%s.%d' % ( intf, vlan )
         intf.name = newName
         self.nameToIntf[ newName ] = intf
         return r
 
+
 class IPv6Host( Host ):
+
     def config( self, v6Addr='1000:1/64', **params ):
         r = super( Host, self ).config( **params )
         intf = self.defaultIntf()
@@ -55,56 +58,59 @@
         self.cmd( 'ip -6 addr add %s dev %s' % ( v6Addr, intf ) )
         return r
 
+
 class dualStackHost( Host ):
+
     def config( self, v6Addr='2000:1/64', **params ):
         r = super( Host, self ).config( **params )
         intf = self.defaultIntf()
         self.cmd( 'ip -6 addr add %s dev %s' % ( v6Addr, intf ) )
         return r
 
+
 class MyTopo( Topo ):
 
     def __init__( self ):
         # Initialize topology
         Topo.__init__( self )
         # Switch S5 Hosts
-        host1=self.addHost( 'h1', ip='10.1.0.2/24' )
-        host2=self.addHost( 'h2', cls=IPv6Host, v6Addr='1000::2/64' )
-        host3=self.addHost( 'h3', ip='10.1.0.3/24', cls=dualStackHost, v6Addr='2000::2/64' )
-        #VLAN hosts
-        host4=self.addHost( 'h4', ip='100.1.0.2/24', cls=VLANHost, vlan=100 )
-        host5=self.addHost( 'h5', ip='200.1.0.2/24', cls=VLANHost, vlan=200 )
-        #VPN-1 and VPN-2 Hosts
-        host6=self.addHost( 'h6', ip='11.1.0.2/24' )
-        host7=self.addHost( 'h7', ip='12.1.0.2/24' )
-        #Multicast Sender
-        host8=self.addHost( 'h8', ip='10.1.0.4/24' )
+        host1 = self.addHost( 'h1', ip='10.1.0.2/24' )
+        host2 = self.addHost( 'h2', cls=IPv6Host, v6Addr='1000::2/64' )
+        host3 = self.addHost( 'h3', ip='10.1.0.3/24', cls=dualStackHost, v6Addr='2000::2/64' )
+        # VLAN hosts
+        host4 = self.addHost( 'h4', ip='100.1.0.2/24', cls=VLANHost, vlan=100 )
+        host5 = self.addHost( 'h5', ip='200.1.0.2/24', cls=VLANHost, vlan=200 )
+        # VPN-1 and VPN-2 Hosts
+        host6 = self.addHost( 'h6', ip='11.1.0.2/24' )
+        host7 = self.addHost( 'h7', ip='12.1.0.2/24' )
+        # Multicast Sender
+        host8 = self.addHost( 'h8', ip='10.1.0.4/24' )
 
         # Switch S6 Hosts
-        host9=self.addHost( 'h9', ip='10.1.0.5/24' )
-        host10=self.addHost( 'h10', cls=IPv6Host, v6Addr='1000::3/64' )
-        host11=self.addHost( 'h11', ip='10.1.0.6/24', cls=dualStackHost, v6Addr='2000::3/64' )
-        #VLAN hosts
-        host12=self.addHost( 'h12', ip='100.1.0.3/24', cls=VLANHost, vlan=100 )
-        host13=self.addHost( 'h13', ip='200.1.0.3/24', cls=VLANHost, vlan=200 )
-        #VPN-1 and VPN-2 Hosts
-        host14=self.addHost( 'h14', ip='11.1.0.3/24' )
-        host15=self.addHost( 'h15', ip='12.1.0.3/24' )
-        #Multicast Receiver
-        host16=self.addHost( 'h16', ip='10.1.0.7/24' )
+        host9 = self.addHost( 'h9', ip='10.1.0.5/24' )
+        host10 = self.addHost( 'h10', cls=IPv6Host, v6Addr='1000::3/64' )
+        host11 = self.addHost( 'h11', ip='10.1.0.6/24', cls=dualStackHost, v6Addr='2000::3/64' )
+        # VLAN hosts
+        host12 = self.addHost( 'h12', ip='100.1.0.3/24', cls=VLANHost, vlan=100 )
+        host13 = self.addHost( 'h13', ip='200.1.0.3/24', cls=VLANHost, vlan=200 )
+        # VPN-1 and VPN-2 Hosts
+        host14 = self.addHost( 'h14', ip='11.1.0.3/24' )
+        host15 = self.addHost( 'h15', ip='12.1.0.3/24' )
+        # Multicast Receiver
+        host16 = self.addHost( 'h16', ip='10.1.0.7/24' )
 
         # Switch S7 Hosts
-        host17=self.addHost( 'h17', ip='10.1.0.8/24' )
-        host18=self.addHost( 'h18', cls=IPv6Host, v6Addr='1000::4/64' )
-        host19=self.addHost( 'h19', ip='10.1.0.9/24', cls=dualStackHost, v6Addr='2000::4/64' )
-        #VLAN hosts
-        host20=self.addHost( 'h20', ip='100.1.0.4/24', cls=VLANHost, vlan=100 )
-        host21=self.addHost( 'h21', ip='200.1.0.4/24', cls=VLANHost, vlan=200 )
-        #VPN-1 and VPN-2 Hosts
-        host22=self.addHost( 'h22', ip='11.1.0.4/24' )
-        host23=self.addHost( 'h23', ip='12.1.0.4/24' )
-        #Multicast Receiver
-        host24=self.addHost( 'h24', ip='10.1.0.10/24' )
+        host17 = self.addHost( 'h17', ip='10.1.0.8/24' )
+        host18 = self.addHost( 'h18', cls=IPv6Host, v6Addr='1000::4/64' )
+        host19 = self.addHost( 'h19', ip='10.1.0.9/24', cls=dualStackHost, v6Addr='2000::4/64' )
+        # VLAN hosts
+        host20 = self.addHost( 'h20', ip='100.1.0.4/24', cls=VLANHost, vlan=100 )
+        host21 = self.addHost( 'h21', ip='200.1.0.4/24', cls=VLANHost, vlan=200 )
+        # VPN-1 and VPN-2 Hosts
+        host22 = self.addHost( 'h22', ip='11.1.0.4/24' )
+        host23 = self.addHost( 'h23', ip='12.1.0.4/24' )
+        # Multicast Receiver
+        host24 = self.addHost( 'h24', ip='10.1.0.10/24' )
 
         s1 = self.addSwitch( 's1' )
         s2 = self.addSwitch( 's2' )
@@ -114,56 +120,57 @@
         s6 = self.addSwitch( 's6' )
         s7 = self.addSwitch( 's7' )
 
-        self.addLink(s5,host1)
-        self.addLink(s5,host2)
-        self.addLink(s5,host3)
-        self.addLink(s5,host4)
-        self.addLink(s5,host5)
-        self.addLink(s5,host6)
-        self.addLink(s5,host7)
-        self.addLink(s5,host8)
+        self.addLink( s5, host1 )
+        self.addLink( s5, host2 )
+        self.addLink( s5, host3 )
+        self.addLink( s5, host4 )
+        self.addLink( s5, host5 )
+        self.addLink( s5, host6 )
+        self.addLink( s5, host7 )
+        self.addLink( s5, host8 )
 
-        self.addLink(s6,host9)
-        self.addLink(s6,host10)
-        self.addLink(s6,host11)
-        self.addLink(s6,host12)
-        self.addLink(s6,host13)
-        self.addLink(s6,host14)
-        self.addLink(s6,host15)
-        self.addLink(s6,host16)
+        self.addLink( s6, host9 )
+        self.addLink( s6, host10 )
+        self.addLink( s6, host11 )
+        self.addLink( s6, host12 )
+        self.addLink( s6, host13 )
+        self.addLink( s6, host14 )
+        self.addLink( s6, host15 )
+        self.addLink( s6, host16 )
 
-        self.addLink(s7,host17)
-        self.addLink(s7,host18)
-        self.addLink(s7,host19)
-        self.addLink(s7,host20)
-        self.addLink(s7,host21)
-        self.addLink(s7,host22)
-        self.addLink(s7,host23)
-        self.addLink(s7,host24)
+        self.addLink( s7, host17 )
+        self.addLink( s7, host18 )
+        self.addLink( s7, host19 )
+        self.addLink( s7, host20 )
+        self.addLink( s7, host21 )
+        self.addLink( s7, host22 )
+        self.addLink( s7, host23 )
+        self.addLink( s7, host24 )
 
-        self.addLink(s1,s2)
-        self.addLink(s1,s3)
-        self.addLink(s1,s4)
-        self.addLink(s1,s5)
-        self.addLink(s2,s3)
-        self.addLink(s2,s5)
-        self.addLink(s2,s6)
-        self.addLink(s3,s4)
-        self.addLink(s3,s6)
-        self.addLink(s4,s7)
+        self.addLink( s1, s2 )
+        self.addLink( s1, s3 )
+        self.addLink( s1, s4 )
+        self.addLink( s1, s5 )
+        self.addLink( s2, s3 )
+        self.addLink( s2, s5 )
+        self.addLink( s2, s6 )
+        self.addLink( s3, s4 )
+        self.addLink( s3, s6 )
+        self.addLink( s4, s7 )
         topos = { 'mytopo': ( lambda: MyTopo() ) }
 
 # HERE THE CODE DEFINITION OF THE TOPOLOGY ENDS
 
+
 def setupNetwork():
     "Create network"
     topo = MyTopo()
-    network = Mininet(topo=topo, autoSetMacs=True, controller=None)
+    network = Mininet( topo=topo, autoSetMacs=True, controller=None )
     network.start()
     CLI( network )
     network.stop()
 
 if __name__ == '__main__':
-    setLogLevel('info')
-    #setLogLevel('debug')
+    setLogLevel( 'info' )
+    # setLogLevel( 'debug' )
     setupNetwork()
diff --git a/TestON/tests/SCPF/SCPFscaleTopo/dependencies/scaleTopoFunction.py b/TestON/tests/SCPF/SCPFscaleTopo/dependencies/scaleTopoFunction.py
index ae30723..7620354 100644
--- a/TestON/tests/SCPF/SCPFscaleTopo/dependencies/scaleTopoFunction.py
+++ b/TestON/tests/SCPF/SCPFscaleTopo/dependencies/scaleTopoFunction.py
@@ -1,5 +1,5 @@
 """
-Copyright 2015 Open Networking Foundation (ONF)
+Copyright 2015 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>,
@@ -8,7 +8,7 @@
     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.
+    ( 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
@@ -18,7 +18,6 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
 """
     Wrapper function for FuncTopo
     Includes onosclidriver and mininetclidriver functions
@@ -27,13 +26,15 @@
 import json
 import re
 
+
 def __init__( self ):
     self.default = ''
 
+
 def getTimestampFromString( main, targetString ):
-    #Get time string from the target string
+    # Get time string from the target string
     try:
-        assert type( targetString ) is str
+        assert isinstance( targetString, str )
         timeString = targetString.split( ' | ' )
         timeString = timeString[ 0 ]
         from datetime import datetime
@@ -53,10 +54,11 @@
         main.log.error( "Got wrong string from log" )
         return -1
 
+
 def getRoleRequestTimeFromTshark( main ):
     try:
         main.log.info( "Get role request time" )
-        with open(main.tsharkResultPath, "r" ) as resultFile:
+        with open( main.tsharkResultPath, "r" ) as resultFile:
             resultText = resultFile.readlines()
             # select the last role request string
             roleRequestString = resultText[ len( resultText ) - 1 ]
@@ -64,18 +66,19 @@
             # get timestamp from role request string
             roleRequestTime = roleRequestString.split( " " )
             resultFile.close()
-            return float(roleRequestTime[1])
+            return float( roleRequestTime[ 1 ] )
     except IndexError:
-        main.log.error("Got wrong role request string from Tshark file")
+        main.log.error( "Got wrong role request string from Tshark file" )
         return -1
 
-def compareTimeDiffWithRoleRequest(main, term, Mode, index=0 ):
-    '''
+
+def compareTimeDiffWithRoleRequest( main, term, Mode, index=0 ):
+    """
     Description:
         Compare the time difference between the time of target term and the time of role request
         Inclides onosclidriver functions
 
-    '''
+    """
     try:
         termInfo = main.Cluster.active( index ).CLI.logSearch( mode=Mode, searchTerm=term )
         termTime = getTimestampFromString( main, termInfo[ 0 ] )
@@ -91,37 +94,38 @@
         main.writeData = -1
         return -1
 
+
 def getInfoFromLog( main, term1, mode1, term2, mode2, index=0, funcMode='TD' ):
-    '''
+    """
     Description:
         Get needed informations of the search term from karaf.log
         Includes onosclidriver functions
     Function mode:
-        TD (time difference):
+        TD ( time difference ):
             Get time difference between start and end
             Term1: startTerm
             Term2: endTerm
-        DR (disconnect rate):
+        DR ( disconnect rate ):
             Get switch disconnect rate
             Term1: disconnectTerm
             Term2: connectTerm
 
-    '''
+    """
     try:
         termInfo1 = main.Cluster.active( index ).CLI.logSearch( mode=mode1, searchTerm=term1 )
         termInfo2 = main.Cluster.active( index ).CLI.logSearch( mode=mode2, searchTerm=term2 )
         if funcMode == 'TD':
-            startTime = getTimestampFromString( main, termInfo1[0] )
-            endTime = getTimestampFromString ( main, termInfo2[0] )
+            startTime = getTimestampFromString( main, termInfo1[ 0 ] )
+            endTime = getTimestampFromString( main, termInfo2[ 0 ] )
             if startTime == -1 or endTime == -1:
                 main.log.error( "Wrong Time!" )
                 main.writeData = -1
                 return -1
             return endTime - startTime
         if funcMode == 'DR':
-            #In this mode, termInfo1 means the total number of switch disconnection and
-            #termInfo2 means the total number of new switch connection
-            #termInfo2 - termInfo1 means the actual real number of switch connection.
+            # In this mode, termInfo1 means the total number of switch disconnection and
+            # termInfo2 means the total number of new switch connection
+            # termInfo2 - termInfo1 means the actual real number of switch connection.
             disconnection = int( termInfo1 ) * 1.0
             expectConnection = int( main.currScale ) ** 2
             realConnection = int( termInfo2 ) - int( termInfo1 )
@@ -136,6 +140,7 @@
         main.writeData = -1
         return -1
 
+
 def testTopology( main, topoFile='', args='', mnCmd='', timeout=300, clean=True ):
     """
     Description:
@@ -173,16 +178,16 @@
     # Starts topology
     startResult = startNewTopology( main, topoFile, args, mnCmd, timeout=timeout )
     # onos needs time to see the links
-    time.sleep(15)
+    time.sleep( 15 )
 
     # Gets list of switches in mininet
-    #assignSwitch( main )
+    # assignSwitch( main )
 
     testTopoResult = startResult and topoObjectResult
 
-
     return testTopoResult
 
+
 def startNewTopology( main, topoFile='', args='', mnCmd='', timeout=900 ):
     """
     Description:
@@ -215,14 +220,14 @@
         main.log.info( main.topoName + ": Starting topology with '" +
                        mnCmd + "' Mininet command" )
 
-
     result = main.Mininet1.startNet( topoFile=topoFile,
                                      args=args,
                                      mnCmd=mnCmd,
-                                     timeout=timeout)
+                                     timeout=timeout )
 
     return result
 
+
 def stopMininet( main ):
     """
         Stops current topology and execute mn -c basically triggers
@@ -235,9 +240,10 @@
     stopResult = main.Mininet1.stopNet()
     time.sleep( 30 )
     if not stopResult:
-        main.log.info(  main.topoName + ": Did not stop Mininet topology" )
+        main.log.info( main.topoName + ": Did not stop Mininet topology" )
     return stopResult
 
+
 def compareTopo( main ):
     """
         Compare topology( devices, links, ports, hosts ) between ONOS and
@@ -254,13 +260,14 @@
         main.topoRelated = Topology()
     return main.topoRelated.compareTopos( main.Mininet1 )
 
+
 def assignSwitch( main ):
     """
         Returns switch list using getSwitch in Mininet driver
     """
     switchList = []
     assignResult = main.TRUE
-    switchList =  main.Mininet1.getSwitch()
+    switchList = main.Mininet1.getSwitch()
     assignResult = main.Mininet1.assignSwController( sw=switchList,
                                                      ip=main.Cluster.active( 0 ).ipAddress,
                                                      port=6633 )
@@ -274,6 +281,7 @@
 
     return switchList
 
+
 def connectivity( main, timeout=900, shortCircuit=True, acceptableFailed=20 ):
     """
         Use fwd app and pingall to discover all the hosts
@@ -309,6 +317,7 @@
 
     return pingResult
 
+
 def getHostsData( main ):
     """
         Use fwd app and pingall to discover all the hosts
@@ -369,6 +378,7 @@
 
     return getDataResult
 
+
 def reinstallOnos( main ):
     """
     Description:
@@ -422,8 +432,4 @@
     if cliResult != main.TRUE:
         restartResult = main.FALSE
 
-
     return restartResult
-
-
-
diff --git a/TestON/tests/SCPF/SCPFscaleTopo/dependencies/spine.py b/TestON/tests/SCPF/SCPFscaleTopo/dependencies/spine.py
index 973385a..32c8419 100644
--- a/TestON/tests/SCPF/SCPFscaleTopo/dependencies/spine.py
+++ b/TestON/tests/SCPF/SCPFscaleTopo/dependencies/spine.py
@@ -1,7 +1,7 @@
 #!/usr/bin/python
 
 """
-Copyright 2015 Open Networking Foundation (ONF)
+Copyright 2015 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>,
@@ -10,7 +10,7 @@
     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.
+    ( 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
@@ -20,7 +20,6 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
 """
 Custom topology for Mininet
 Author: kelvin@onlab.us
@@ -45,7 +44,9 @@
 totalSwitches = 0
 totalEndSwitches = 0
 totalHosts = 0
-endSwitchCount = 0 # total count of end switch in each row in gui
+endSwitchCount = 0  # total count of end switch in each row in gui
+
+
 class spineTopo( Topo ):
 
     def __init__( self, **opts ):
@@ -71,8 +72,8 @@
         global endSwitchCount
         endSwitchCount = e
 
-        print "Creating topology with", s,"spine", l,"leaf", c,"core",\
-                e,"end switches and",h,"host for each end switches"
+        print "Creating topology with", s, "spine", l, "leaf", c, "core",\
+                e, "end switches and", h, "host for each end switches"
 
         self.addCore( c )
         self.addSpine( s )
@@ -89,7 +90,6 @@
         deviceData = self.createSwitchDict()
         self.genCfgJson( deviceData )
 
-
     def addCore( self, numSwitch ):
         global totalSwitches
         global coreSwitches
@@ -134,7 +134,6 @@
 
         return host
 
-
     def linkHosts( self, numHosts ):
         global endSwitches
         switches = sorted( endSwitches.values() )
@@ -143,7 +142,6 @@
             for i in xrange( numHosts ):
                 self.addLink( sw, self.addEndHosts() )
 
-
     def linkLayer( self, topLayer, botLayer ):
         """
         Description:
@@ -156,7 +154,6 @@
                        layer below
             botLater - Layer that is below the upper layer to be linked at
         """
-
         topSwitches = sorted( topLayer.keys() )
         botSwitches = sorted( botLayer.keys() )
 
@@ -164,7 +161,6 @@
             for botSw in botSwitches:
                 self.addLink( topLayer.get( topSw ), botLayer.get( botSw ) )
 
-
     def linkEndSwitch( self, numSwitch, leafLayer ):
         global totalSwitches
         global totalEndSwitches
@@ -182,7 +178,7 @@
                     self.addLink( leaf[ i ], endSw )
                     self.addLink( leaf[ i + 1 ], endSw )
                 break
-            if i == ( len( leafSwitches ) - 1 ) and len( leafSwitches )%2:
+            if i == ( len( leafSwitches ) - 1 ) and len( leafSwitches ) % 2:
                 for j in xrange( numSwitch ):
                     self.addLink( leaf[ i ], self.addEnd() )
                 break
@@ -194,7 +190,7 @@
                 continue
             if i == 1:
                 continue
-            if i%2 == 0:
+            if i % 2 == 0:
                 for j in xrange( numSwitch ):
                     endSw = self.addEnd()
                     self.addLink( leaf[ i ], endSw )
@@ -206,11 +202,9 @@
         configJson[ "devices" ] = deviceData
         with open( 'spine.json', 'w+' ) as outfile:
             json.dump( configJson, outfile )
-        #cfgFile = open( "spine.json" , 'w+' )
-        #cfgFile.write( configJson )
-        #cfgFile.close()
-
-
+        # cfgFile = open( "spine.json" , 'w+' )
+        # cfgFile.write( configJson )
+        # cfgFile.close()
 
     def createSwitchDict( self ):
         global allSwitches
@@ -222,18 +216,18 @@
         spineLong = -80
         leafLong = -90
         endLat = 30
-        rowCount = 0 # count of end switches or rows
-        colOffSet = 0 # off set for end switches; longitude
+        rowCount = 0  # count of end switches or rows
+        colOffSet = 0  # off set for end switches; longitude
 
-        #for i in xrange( len( allSwitches ) ):
+        # for i in xrange( len( allSwitches ) ):
         deviceList = []
         deviceDict = {}
         for sw in allSwitches:
             tempSw = allSwitches.get( sw )
-            uri = str( "{0:0>16}".format( str( hex( int( tempSw[ 1: ] ) )\
-                            ).split( "x" )[ 1 ] ) )
-            mac = str( "{0:0>12}".format( str( hex( int( tempSw[ 1: ] ) )\
-                            ).split( "x" )[ 1 ] ) )
+            uri = str( "{0:0>16}".format( str( hex( int( tempSw[ 1: ] ) )
+                                               ).split( "x" )[ 1 ] ) )
+            mac = str( "{0:0>12}".format( str( hex( int( tempSw[ 1: ] ) )
+                                               ).split( "x" )[ 1 ] ) )
 
             if "core" in sw:
                 latitude = 45
@@ -259,7 +253,7 @@
                 endLat -= 1
                 rowCount += 1
 
-            tempItem = { "alias": allSwitches.get( sw ) ,
+            tempItem = { "alias": allSwitches.get( sw ),
                          "uri": "of:" + uri,
                          "mac": mac,
                          "annotations": { "name": sw,
@@ -269,21 +263,22 @@
             deviceList.append( tempItem )
 
         return deviceList
-    #def createHostsJson( hostDict ):
+    # def createHostsJson( hostDict ):
 
 topos = { 'spine': ( lambda s=2, l=3, c=1, e=5, h=1: spineTopo( s=s,
                                                                 l=l,
                                                                 c=c,
                                                                 e=e,
-                                                                h=h) ) }
+                                                                h=h ) ) }
 
 # HERE THE CODE DEFINITION OF THE TOPOLOGY ENDS
 
+
 def setupNetwork():
     "Create network"
     topo = spineTopo()
-    #if controller_ip == '':
-        #controller_ip = '10.0.2.2';
+    # if controller_ip == '':
+    # controller_ip = '10.0.2.2';
     #    controller_ip = '127.0.0.1';
     network = Mininet( topo=topo,
                        autoSetMacs=True,
@@ -294,5 +289,5 @@
 
 if __name__ == '__main__':
     setLogLevel( 'info' )
-    #setLogLevel('debug')
+    # setLogLevel( 'debug' )
     setupNetwork()
diff --git a/TestON/tests/SCPF/SCPFscaleTopo/dependencies/topo.py b/TestON/tests/SCPF/SCPFscaleTopo/dependencies/topo.py
index c5c1f88..373ed2b 100644
--- a/TestON/tests/SCPF/SCPFscaleTopo/dependencies/topo.py
+++ b/TestON/tests/SCPF/SCPFscaleTopo/dependencies/topo.py
@@ -1,5 +1,5 @@
 """
-Copyright 2015 Open Networking Foundation (ONF)
+Copyright 2015 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>,
@@ -8,7 +8,7 @@
     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.
+    ( 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
@@ -18,15 +18,14 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
 """
     These functions can be used for topology comparisons
 """
-
 import time
 import os
 import json
 
+
 def sendArpPackage( main, hostList ):
     import json
     import time
@@ -35,10 +34,10 @@
         return the total hosts number from Onos
     """
     main.log.info( "Sending Arping package..." )
-    if isinstance(hostList, list):
+    if isinstance( hostList, list ):
         for h in hostList:
             main.Mininet1.arping( srcHost=h, dstHost="10.0.0.1", output=main.FALSE, noResult=True )
-            time.sleep(0.5)
+            time.sleep( 0.5 )
     else:
         main.Mininet1.arping( srcHost=hostList, dstHost="10.0.0.1", output=main.FALSE, noResult=True )
     try:
@@ -46,8 +45,8 @@
         summaryStr = json.loads( main.Cluster.active( 0 ).CLI.summary().encode() )
         hostNum = summaryStr.get( 'hosts' )
 
-    except (TypeError, ValueError):
-        main.log.exception( " Object not as expected: {!r}".format( summaryStr) )
+    except ( TypeError, ValueError ):
+        main.log.exception( " Object not as expected: {!r}".format( summaryStr ) )
         return -1
     except Exception:
         main.log.exception( self.name + ": Uncaught exception!" )
diff --git a/TestON/tests/SCPF/SCPFscalingMaxIntents/SCPFscalingMaxIntents.py b/TestON/tests/SCPF/SCPFscalingMaxIntents/SCPFscalingMaxIntents.py
index 9ee512c..1633c44 100644
--- a/TestON/tests/SCPF/SCPFscalingMaxIntents/SCPFscalingMaxIntents.py
+++ b/TestON/tests/SCPF/SCPFscalingMaxIntents/SCPFscalingMaxIntents.py
@@ -1,5 +1,5 @@
 """
-Copyright 2016 Open Networking Foundation (ONF)
+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>,
@@ -8,7 +8,7 @@
     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.
+    ( 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
@@ -18,12 +18,11 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
 import sys
 import json
 import time
 import os
-'''
+"""
 SCPFscalingMaxIntents
 Push test Intents to onos
 CASE10: set up Null Provider
@@ -31,8 +30,9 @@
 Check flows number, if flows number is not as except, finished this test iteration
 Scale up when reach the Limited
 Start from 1 nodes, 8 devices. Then Scale up to 3,5,7 nodes
-'''
+"""
 class SCPFscalingMaxIntents:
+
     def __init__( self ):
         self.default = ''
 
@@ -63,7 +63,7 @@
             main.startUpSleep = int( main.params[ 'SLEEP' ][ 'startup' ] )
             main.installSleep = int( main.params[ 'SLEEP' ][ 'install' ] )
             main.verifySleep = int( main.params[ 'SLEEP' ][ 'verify' ] )
-            main.rerouteSleep = int ( main.params[ 'SLEEP' ][ 'reroute' ] )
+            main.rerouteSleep = int( main.params[ 'SLEEP' ][ 'reroute' ] )
             main.intentConfigRegiCfg = main.params[ 'CFG' ][ 'intentConfigRegi' ]
             main.nullProviderCfg = main.params[ 'CFG' ][ 'nullProvider' ]
             main.linkCollectionIntentCfg = main.params[ 'CFG' ][ 'linkCollectionIntent' ]
@@ -97,6 +97,7 @@
             main.testSetUp.envSetupException( e )
         main.testSetUp.evnSetupConclusion( stepResult )
         main.commit = main.commit.split( " " )[ 1 ]
+
     def CASE1( self ):
         copyResult = main.ONOSbench.copyMininetFile( main.topology,
                                                      main.dependencyPath,
@@ -133,25 +134,24 @@
         # Setup the null-provider
         main.step( "Configuring null-provider" )
         cfgStatus = utilities.retry( main.ONOSbench.onosCfgSet,
-                                    main.FALSE,
-                                    [ main.Cluster.active( 0 ).ipAddress,
-                                      main.nullProviderCfg, 'deviceCount 8' ],
-                                    sleep=main.verifySleep,
-                                    attempts = main.verifyAttempts )
+                                     main.FALSE,
+                                     [ main.Cluster.active( 0 ).ipAddress,
+                                       main.nullProviderCfg, 'deviceCount 8' ],
+                                     sleep=main.verifySleep,
+                                     attempts=main.verifyAttempts )
         cfgStatus = cfgStatus and utilities.retry( main.ONOSbench.onosCfgSet,
                                                    main.FALSE,
                                                    [ main.Cluster.active( 0 ).ipAddress,
                                                      main.nullProviderCfg, 'topoShape reroute' ],
                                                    sleep=main.verifySleep,
-                                                   attempts = main.verifyAttempts )
+                                                   attempts=main.verifyAttempts )
 
         cfgStatus = cfgStatus and utilities.retry( main.ONOSbench.onosCfgSet,
                                                    main.FALSE,
                                                    [ main.Cluster.active( 0 ).ipAddress,
                                                      main.nullProviderCfg, 'enabled true' ],
                                                    sleep=main.verifySleep,
-                                                   attempts = main.verifyAttempts )
-
+                                                   attempts=main.verifyAttempts )
 
         utilities.assert_equals( expect=main.TRUE,
                                  actual=cfgStatus,
@@ -197,9 +197,9 @@
             main.setupSkipped = True
 
     def CASE11( self, main ):
-        '''
+        """
             Setting up mininet
-        '''
+        """
         import json
         import time
         devices = []
@@ -210,10 +210,10 @@
         time.sleep( main.startUpSleep )
         if main.flowObj:
             main.Cluster.active( 0 ).CLI.setCfg( main.intentConfigRegiCfg,
-                                "useFlowObjectives", value="true" )
+                                                 "useFlowObjectives", value="true" )
             main.Cluster.active( 0 ).CLI.setCfg( main.intentConfigRegiCfg,
-                                "defaultFlowObjectiveCompiler",
-                                value=main.linkCollectionIntentCfg )
+                                                 "defaultFlowObjectiveCompiler",
+                                                 value=main.linkCollectionIntentCfg )
         main.step( 'Starting mininet topology' )
         mnStatus = main.Mininet1.startNet( topoFile='~/mininet/custom/rerouteTopo.py' )
         utilities.assert_equals( expect=main.TRUE,
@@ -277,8 +277,6 @@
         if not caseResult:
             main.setupSkipped = True
 
-
-
     def CASE20( self, main ):
         try:
             from tests.dependencies.utils import Utils
@@ -330,9 +328,9 @@
 
         # make sure the checkInterval divisible batchSize
         main.checkInterval = int( int( main.checkInterval / main.batchSize ) * main.batchSize )
-        flowTemp=0
+        flowTemp = 0
         intentVerifyTemp = 0
-        totalFlows=0
+        totalFlows = 0
         for i in range( limit ):
 
             # Threads pool
@@ -352,8 +350,8 @@
                                  kwargs={ "offset": offtmp,
                                           "options": "-i",
                                           "timeout": main.timeout,
-                                          "background":False,
-                                          "noExit":True } )
+                                          "background": False,
+                                          "noExit": True } )
                 pool.append( t )
                 t.start()
                 main.threadID = main.threadID + 1
@@ -420,10 +418,10 @@
                     main.log.info( "Total Intents: {}".format( verifyTotalIntents ) )
                     break
 
-        utilities.assert_equals( expect = main.TRUE,
-                                 actual = intentsState,
-                                 onpass = "Successfully pushed and verified intents",
-                                 onfail = "Failed to push and verify intents" )
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=intentsState,
+                                 onpass="Successfully pushed and verified intents",
+                                 onfail="Failed to push and verify intents" )
 
         main.log.info( "Total Intents Installed before crash: {}".format( totalIntents ) )
         main.log.info( "Total Flows ADDED before crash: {}".format( totalFlows ) )
diff --git a/TestON/tests/SCPF/SCPFscalingMaxIntents/dependencies/rerouteTopo.py b/TestON/tests/SCPF/SCPFscalingMaxIntents/dependencies/rerouteTopo.py
old mode 100755
new mode 100644
index dace730..a5336f0
--- a/TestON/tests/SCPF/SCPFscalingMaxIntents/dependencies/rerouteTopo.py
+++ b/TestON/tests/SCPF/SCPFscalingMaxIntents/dependencies/rerouteTopo.py
@@ -1,7 +1,7 @@
 #!/usr/bin/python
 
 """
-Copyright 2015 Open Networking Foundation (ONF)
+Copyright 2015 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>,
@@ -10,7 +10,7 @@
     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.
+    ( 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
@@ -20,7 +20,6 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
 """
 Custom topology for Mininet
 """
@@ -34,19 +33,20 @@
 from mininet.util import dumpNodeConnections
 from mininet.node import ( UserSwitch, OVSSwitch, IVSSwitch )
 
+
 class MyTopo( Topo ):
 
     def __init__( self ):
         # Initialize topology
         Topo.__init__( self )
 
-        host1 = self.addHost('h1', ip='10.1.0.1/24')
-        host2 = self.addHost('h2', ip='10.1.0.2/24')
-        host3 = self.addHost('h3', ip='10.1.0.3/24')
-        host4 = self.addHost('h4', ip='10.1.0.4/24')
-        host5 = self.addHost('h5', ip='10.1.0.5/24')
-        host6 = self.addHost('h6', ip='10.1.0.6/24')
-        host7 = self.addHost('h7', ip='10.1.0.7/24')
+        host1 = self.addHost( 'h1', ip='10.1.0.1/24' )
+        host2 = self.addHost( 'h2', ip='10.1.0.2/24' )
+        host3 = self.addHost( 'h3', ip='10.1.0.3/24' )
+        host4 = self.addHost( 'h4', ip='10.1.0.4/24' )
+        host5 = self.addHost( 'h5', ip='10.1.0.5/24' )
+        host6 = self.addHost( 'h6', ip='10.1.0.6/24' )
+        host7 = self.addHost( 'h7', ip='10.1.0.7/24' )
 
         s1 = self.addSwitch( 's1' )
         s2 = self.addSwitch( 's2' )
@@ -57,39 +57,37 @@
         s7 = self.addSwitch( 's7' )
         s8 = self.addSwitch( 's8' )
 
+        self.addLink( s1, host1 )
+        self.addLink( s2, host2 )
+        self.addLink( s3, host3 )
+        self.addLink( s4, host4 )
+        self.addLink( s5, host5 )
+        self.addLink( s6, host6 )
+        self.addLink( s7, host7 )
 
-        self.addLink(s1, host1)
-        self.addLink(s2, host2)
-        self.addLink(s3, host3)
-        self.addLink(s4, host4)
-        self.addLink(s5, host5)
-        self.addLink(s6, host6)
-        self.addLink(s7, host7)
-
-
-
-        self.addLink(s1,s2)
-        self.addLink(s2,s3)
-        self.addLink(s3,s4)
-        self.addLink(s4,s5)
-        self.addLink(s5,s6)
-        self.addLink(s6,s7)
-        self.addLink(s4,s8)
-        self.addLink(s8,s5)
+        self.addLink( s1, s2 )
+        self.addLink( s2, s3 )
+        self.addLink( s3, s4 )
+        self.addLink( s4, s5 )
+        self.addLink( s5, s6 )
+        self.addLink( s6, s7 )
+        self.addLink( s4, s8 )
+        self.addLink( s8, s5 )
 
         topos = { 'mytopo': ( lambda: MyTopo() ) }
 
 # HERE THE CODE DEFINITION OF THE TOPOLOGY ENDS
 
+
 def setupNetwork():
     "Create network"
     topo = MyTopo()
-    network = Mininet(topo=topo, autoSetMacs=True, controller=None)
+    network = Mininet( topo=topo, autoSetMacs=True, controller=None )
     network.start()
     CLI( network )
     network.stop()
 
 if __name__ == '__main__':
-    setLogLevel('info')
-    #setLogLevel('debug')
+    setLogLevel( 'info' )
+    # setLogLevel( 'debug' )
     setupNetwork()
diff --git a/TestON/tests/SCPF/SCPFswitchLat/SCPFswitchLat.py b/TestON/tests/SCPF/SCPFswitchLat/SCPFswitchLat.py
index 66b3dc0..fa168f6 100644
--- a/TestON/tests/SCPF/SCPFswitchLat/SCPFswitchLat.py
+++ b/TestON/tests/SCPF/SCPFswitchLat/SCPFswitchLat.py
@@ -1,5 +1,5 @@
 """
-Copyright 2015 Open Networking Foundation (ONF)
+Copyright 2015 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>,
@@ -8,7 +8,7 @@
     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.
+    ( 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
@@ -18,8 +18,7 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
-'''
+"""
     SCPFswitchLat
     Test Switch add/remove latency
     calculate package latency between switch and ONOS
@@ -27,8 +26,7 @@
     TCP -- Feature Reply -- Role Request -- Role Reply -- Device -- Graph
     Siwtch Down:
     Openflow FIN/ACK -- ACK -- Device -- Graph
-'''
-
+"""
 class SCPFswitchLat:
 
     def __init__( self ):
@@ -37,7 +35,7 @@
     def CASE0( self, main ):
         import os
         import imp
-        '''
+        """
         - GIT
         - BUILDING ONOS
             Pull specific ONOS branch, then Build ONOS ono ONOS Bench.
@@ -45,7 +43,7 @@
             test env. We want Jenkins jobs to pull&build for flexibility to handle
             different versions of ONOS.
         - Construct tests variables
-        '''
+        """
         try:
             from tests.dependencies.ONOSSetup import ONOSSetup
             main.testSetUp = ONOSSetup()
@@ -56,10 +54,10 @@
         stepResult = main.FALSE
         try:
             # The dictionary to record different type of wrongs
-            main.wrong = { 'totalWrong': 0, 'skipDown' : 0, 'TsharkValueIncorrect': 0,
-                    'TypeError' : 0, 'decodeJasonError': 0,
-                    'checkResultIncorrect': 0 }
-            main.maxWrong = int( main.params[ 'TEST' ] [ 'MaxWrong' ] )
+            main.wrong = { 'totalWrong': 0, 'skipDown': 0, 'TsharkValueIncorrect': 0,
+                           'TypeError': 0, 'decodeJasonError': 0,
+                           'checkResultIncorrect': 0 }
+            main.maxWrong = int( main.params[ 'TEST' ][ 'MaxWrong' ] )
             main.resultRange = main.params[ 'TEST' ][ 'ResultRange' ]
             main.searchTerm = main.params[ 'TEST' ][ 'SearchTerm' ]
             main.MN1Ip = main.params[ 'MN' ][ 'ip1' ]
@@ -72,7 +70,7 @@
             main.scale = ( main.params[ 'SCALE' ] ).split( "," )
 
             main.ofPackage = main.params[ 'TSHARK' ]
-            main.defaultTopoCfg = main.params [ 'CFG' ][ 'defaultTopo' ]
+            main.defaultTopoCfg = main.params[ 'CFG' ][ 'defaultTopo' ]
             main.tsharkResultPath = main.params[ 'TEST' ][ 'tsharkResultPath' ]
             main.sampleSize = int( main.params[ 'TEST' ][ 'sampleSize' ] )
             main.warmUp = int( main.params[ 'TEST' ][ 'warmUp' ] )
@@ -90,9 +88,9 @@
             resultsDB.close()
 
             main.switchFunc = imp.load_source( main.dependencyFunc,
-                                           main.dependencyPath +
-                                           main.dependencyFunc +
-                                           ".py" )
+                                               main.dependencyPath +
+                                               main.dependencyFunc +
+                                               ".py" )
         except Exception as e:
             main.testSetUp.envSetupException( e )
         main.testSetUp.evnSetupConclusion( stepResult )
@@ -144,26 +142,26 @@
         import json
         import numpy
 
-        resultDict = { 'up' : {}, 'down' : {} }
+        resultDict = { 'up': {}, 'down': {} }
         for i in range( 1, main.Cluster.numCtrls + 1 ):
             resultDict[ 'up' ][ 'node' + str( i ) ] = {}
             resultDict[ 'up' ][ 'node' + str( i ) ][ 'Ave' ] = {}
             resultDict[ 'up' ][ 'node' + str( i ) ][ 'Std' ] = {}
-            resultDict[ 'up' ][ 'node' + str( i ) ][ 'T_F' ] = []#TCP to Feature
-            resultDict[ 'up' ][ 'node' + str( i ) ][ 'F_R' ] = []#Feature to Role
-            resultDict[ 'up' ][ 'node' + str( i ) ][ 'RQ_RR' ] = []#role request to role reply
-            resultDict[ 'up' ][ 'node' + str( i ) ][ 'RR_D' ] = []#role reply to Device
-            resultDict[ 'up' ][ 'node' + str( i ) ][ 'D_G' ] = []#Device to Graph
-            resultDict[ 'up' ][ 'node' + str( i ) ][ 'E_E' ] = []#TCP to Graph
+            resultDict[ 'up' ][ 'node' + str( i ) ][ 'T_F' ] = []  # TCP to Feature
+            resultDict[ 'up' ][ 'node' + str( i ) ][ 'F_R' ] = []  # Feature to Role
+            resultDict[ 'up' ][ 'node' + str( i ) ][ 'RQ_RR' ] = []  # role request to role reply
+            resultDict[ 'up' ][ 'node' + str( i ) ][ 'RR_D' ] = []  # role reply to Device
+            resultDict[ 'up' ][ 'node' + str( i ) ][ 'D_G' ] = []  # Device to Graph
+            resultDict[ 'up' ][ 'node' + str( i ) ][ 'E_E' ] = []  # TCP to Graph
 
         for i in range( 1, main.Cluster.numCtrls + 1 ):
             resultDict[ 'down' ][ 'node' + str( i ) ] = {}
             resultDict[ 'down' ][ 'node' + str( i ) ][ 'Ave' ] = {}
             resultDict[ 'down' ][ 'node' + str( i ) ][ 'Std' ] = {}
-            resultDict[ 'down' ][ 'node' + str( i ) ][ 'FA_A' ] = []#Fin_ack to ACK
-            resultDict[ 'down' ][ 'node' + str( i ) ][ 'A_D' ] = []#Ack to Device
-            resultDict[ 'down' ][ 'node' + str( i ) ][ 'D_G' ] = []#Device to Graph
-            resultDict[ 'down' ][ 'node' + str( i ) ][ 'E_E' ] = []#fin_ack to Graph
+            resultDict[ 'down' ][ 'node' + str( i ) ][ 'FA_A' ] = []  # Fin_ack to ACK
+            resultDict[ 'down' ][ 'node' + str( i ) ][ 'A_D' ] = []  # Ack to Device
+            resultDict[ 'down' ][ 'node' + str( i ) ][ 'D_G' ] = []  # Device to Graph
+            resultDict[ 'down' ][ 'node' + str( i ) ][ 'E_E' ] = []  # fin_ack to Graph
         for i in range( 0, main.sampleSize + main.warmUp ):
             main.log.info( "************************************************************" )
             main.log.info( "************************ Iteration: {} **********************" .format( str( i + 1 ) ) )
@@ -176,12 +174,12 @@
             else:
                 main.switchFunc.captureOfPack( main, main.device, main.ofPackage,
                                                "up", resultDict, False )
-                main.switchFunc.captureOfPack ( main, main.device, main.ofPackage,
-                                               "down", resultDict, False )
+                main.switchFunc.captureOfPack( main, main.device, main.ofPackage,
+                                                "down", resultDict, False )
                 main.Cluster.active( 0 ).CLI.removeDevice( "of:0000000000000001" )
 
         # Dictionary for result
-        maxDict  = {}
+        maxDict = {}
         maxDict[ 'down' ] = {}
         maxDict[ 'up' ] = {}
         maxDict[ 'down' ][ 'max' ] = 0
diff --git a/TestON/tests/SCPF/SCPFswitchLat/dependencies/switchFunc.py b/TestON/tests/SCPF/SCPFswitchLat/dependencies/switchFunc.py
index cde275e..7a159ba 100644
--- a/TestON/tests/SCPF/SCPFswitchLat/dependencies/switchFunc.py
+++ b/TestON/tests/SCPF/SCPFswitchLat/dependencies/switchFunc.py
@@ -1,5 +1,5 @@
 """
-Copyright 2016 Open Networking Foundation (ONF)
+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>,
@@ -8,7 +8,7 @@
     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.
+    ( 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
@@ -18,29 +18,29 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
-'''
+"""
     Wrapper function for SCPFswitchLat test
     Assign switch and capture openflow package
     remove switch and caputer openflow package
     calculate latency
-'''
+"""
 import time
 import json
 
+
 def getTimestampFromLog( index, searchTerm ):
-    '''
+    """
     Get timestamp value of the search term from log.
     Args:
         index: the index of cli
         searchTerm: the key term of timestamp
 
-    '''
+    """
     lines = main.Cluster.active( index ).CLI.logSearch( mode='last', searchTerm=searchTerm )
     try:
-        assert lines != None
-        logString = lines[ len ( lines ) - 1 ]
-        #get the target value
+        assert lines is not None
+        logString = lines[ len( lines ) - 1 ]
+        # get the target value
         line = logString.split( "time = " )
         key = line[ 1 ].split( " " )
         return int( key[ 0 ] )
@@ -51,13 +51,14 @@
         main.log.warn( "Search Term Not Found" )
         return 0
 
+
 def processPackage( package ):
-    '''
+    """
     split package information to dictionary
     Args:
         package: Package String
 
-    '''
+    """
     pacakge = package.split( " " )
     dic = {}
     for s in pacakge:
@@ -68,28 +69,30 @@
             continue
     return dic
 
+
 def findSeqBySeqAck( seq, packageList ):
-    '''
+    """
     Find specific Seq of package in packageList
     Args:
         seq: seq from last TCP package
         packageList: find package in packageList
 
-    '''
+    """
     for l in packageList:
         temp = processPackage( l )
         tA = temp[ 'Ack' ]
         if int( seq ) + 1 == int( tA ):
             return temp[ 'Seq' ]
 
+
 def arrangeTsharkFile( switchStatus, keyTerm ):
-    '''
+    """
     Arrange different tshark messeage from overall file to different specific files
     Args:
         switchStatus: switch up or down
         keyTerm: A dictionary that store the path name as value and the searchTerm as key
 
-    '''
+    """
     with open( main.tsharkResultPath[ switchStatus ][ 'ALL' ], 'r' ) as resultFile:
         resultText = resultFile.readlines()
         resultFile.close()
@@ -102,13 +105,14 @@
                     outputfile.write( line )
                     outputfile.close()
 
+
 def checkResult( result1, result2, result3 ):
-    '''
+    """
     Check if the inputs meet the requirement
     Returns:
             1 means the results are right, 0 means the results are wrong
 
-    '''
+    """
     result = check( result1 ) + check( result2 ) + check( result3 )
     if result < 3:
         # if any result is wrong, increase the main wrong number
@@ -118,32 +122,34 @@
         return 0
     return 1
 
+
 def check( result ):
-    '''
+    """
     Check the single input.
     Returns:
             1 means the input is good, 0 means the input is wrong
 
-    '''
+    """
     if result < int( main.resultRange[ 'Min' ] ) or result > int( main.resultRange[ 'Max' ] ):
         main.log.debug( str( result ) + " is not meet the requirement" )
         return 0
     return 1
 
+
 def checkTotalWrongNum():
-    '''
+    """
     Check if the total wrong number is bigger than the max wrong number. If it is, then exit the
     test.
 
-    '''
+    """
     # if there are too many wrongs in this test, then exit
-    if main.wrong['totalWrong'] > main.maxWrong:
+    if main.wrong[ 'totalWrong' ] > main.maxWrong:
         main.log.error( "The total wrong number exceeds %d, test terminated" % main.maxWrong )
         main.cleanAndExit()
 
-def captureOfPack( main, deviceName, ofPack, switchStatus, resultDict, warmup ):
-    '''
 
+def captureOfPack( main, deviceName, ofPack, switchStatus, resultDict, warmup ):
+    """
     Args:
         main: TestON class
         deviceName: device name
@@ -152,7 +158,7 @@
         resultDict: dictionary to contain result
         warmup: warm up boolean
 
-    '''
+    """
     main.log.debug( "TOTAL WRONG: " + str( main.wrong ) )
     for d in ofPack[ switchStatus ]:
         main.log.info( "Clean up Tshark" )
@@ -168,14 +174,14 @@
         cleanTerm = ofPack[ switchStatus ][ d ].replace( '\\', '' )
         keyTerm[ cleanTerm ] = d
     # Delete the last '|'
-    grepString = grepString[:-1]
+    grepString = grepString[ :-1 ]
     # open tshark
     main.log.info( "starting tshark capture" )
     main.ONOSbench.tsharkGrep( grepString, main.tsharkResultPath[ switchStatus ][ 'ALL' ], grepOptions='-E' )
     if switchStatus == 'up':
         # if up, assign switch to controller
         time.sleep( main.measurementSleep )
-        main.log.info( 'Assigning {} to controller'.format( deviceName ))
+        main.log.info( 'Assigning {} to controller'.format( deviceName ) )
         main.Mininet1.assignSwController( sw=deviceName, ip=main.Cluster.active( 0 ).ipAddress )
         time.sleep( main.measurementSleep )
     if switchStatus == 'down':
@@ -208,8 +214,8 @@
                 main.log.info( "Capture result:" + resultText )
                 resultText = resultText.strip()
                 resultText = resultText.split( " " )
-                if len(resultText) > 1:
-                    tempResultDict[d]= int( ( float( resultText[ 1 ] ) * 1000 ) )
+                if len( resultText ) > 1:
+                    tempResultDict[ d ] = int( ( float( resultText[ 1 ] ) * 1000 ) )
                 resultFile.close()
     elif switchStatus == 'down':
         # if state is down, we should capture Fin/Ack and ACK package
@@ -220,7 +226,7 @@
             resultFile.close()
         FinAckSeq = processPackage( FinAckText )[ 'Seq' ]
         FinAckOFseq = findSeqBySeqAck( FinAckSeq, resultText )
-        if FinAckOFseq == None:
+        if FinAckOFseq is None:
             main.log.warn( "Tshark Result was incorrect!" )
             main.log.warn( resultText )
             main.wrong[ 'TsharkValueIncorrect' ] += 1
@@ -269,7 +275,7 @@
                 return
             if not warmup:
                 resultDict[ switchStatus ][ d ][ 'T_F' ].append( T_Ftemp )
-                resultDict[ switchStatus ][ d ][ 'F_R' ].append( F_Rtemp  )
+                resultDict[ switchStatus ][ d ][ 'F_R' ].append( F_Rtemp )
                 resultDict[ switchStatus ][ d ][ 'RQ_RR' ].append( RQ_RRtemp )
 
             main.log.info( "{} TCP to Feature: {}".format( d, str( T_Ftemp ) ) )
@@ -284,7 +290,7 @@
             # get onos metrics timestamps
             try:
                 response = json.loads( main.Cluster.active( i - 1 ).CLI.topologyEventsMetrics() )
-                DeviceTime = getTimestampFromLog( i - 1, searchTerm=main.searchTerm[switchStatus] )
+                DeviceTime = getTimestampFromLog( i - 1, searchTerm=main.searchTerm[ switchStatus ] )
                 main.log.info( "ONOS{} device Event timestamp: {}".format( i, "%.2f" % DeviceTime ) )
                 GraphTime = int( response.get( "topologyGraphEventTimestamp" ).get( "value" ) )
                 main.log.info( "ONOS{} Graph Event timestamp: {}".format( i, GraphTime ) )
@@ -331,14 +337,14 @@
                     checkTotalWrongNum()
                     break
                 if not warmup and check == 1:
-                    resultDict[ switchStatus ][ 'node' + str( i )][ 'RR_D' ].append( RR_Dtemp )
-                    resultDict[ switchStatus ][ 'node' + str( i )][ 'D_G' ].append( D_Gtemp )
-                    resultDict[ switchStatus ][ 'node' + str( i )][ 'E_E' ].append( E_Etemp )
+                    resultDict[ switchStatus ][ 'node' + str( i ) ][ 'RR_D' ].append( RR_Dtemp )
+                    resultDict[ switchStatus ][ 'node' + str( i ) ][ 'D_G' ].append( D_Gtemp )
+                    resultDict[ switchStatus ][ 'node' + str( i ) ][ 'E_E' ].append( E_Etemp )
             else:
-                main.wrong['checkResultIncorrect'] += 1
+                main.wrong[ 'checkResultIncorrect' ] += 1
                 main.wrong[ 'totalWrong' ] += 1
                 checkTotalWrongNum()
-                main.log.debug("Skip this iteration due to the None Devicetime")
+                main.log.debug( "Skip this iteration due to the None Devicetime" )
 
     if switchStatus == "down":
         # down Latency
@@ -389,7 +395,7 @@
                     check = checkResult( A_Dtemp, D_Gtemp, E_Etemp )
                     if check == 1:
                         main.log.info( "ACK to device: {}".format( A_Dtemp ) )
-                        main.log.info( "Device to Graph: {}".format( D_Gtemp )  )
+                        main.log.info( "Device to Graph: {}".format( D_Gtemp ) )
                         main.log.info( "End to End: {}".format( E_Etemp ) )
                         main.log.info( "================================================" )
                 except KeyError:
@@ -417,8 +423,7 @@
                     resultDict[ switchStatus ][ 'node' + str( i ) ][ 'E_E' ].append( E_Etemp )
 
             else:
-                main.wrong['checkResultIncorrect'] += 1
-                main.wrong['totalWrong'] += 1
+                main.wrong[ 'checkResultIncorrect' ] += 1
+                main.wrong[ 'totalWrong' ] += 1
                 checkTotalWrongNum()
-                main.log.debug("Skip this iteration due to the None Devicetime")
-
+                main.log.debug( "Skip this iteration due to the None Devicetime" )
diff --git a/TestON/tests/SCPF/SCPFswitchLat/dependencies/topo-perf-1sw.py b/TestON/tests/SCPF/SCPFswitchLat/dependencies/topo-perf-1sw.py
index 1793e2b..3652c82 100644
--- a/TestON/tests/SCPF/SCPFswitchLat/dependencies/topo-perf-1sw.py
+++ b/TestON/tests/SCPF/SCPFswitchLat/dependencies/topo-perf-1sw.py
@@ -1,5 +1,5 @@
 """
-Copyright 2015 Open Networking Foundation (ONF)
+Copyright 2015 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>,
@@ -8,7 +8,7 @@
     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.
+    ( 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
@@ -18,17 +18,17 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
-'''
+"""
 Simple 1 switch topology for topologoy performance test
-'''
-
+"""
 from mininet.topo import Topo
 
-class MyTopo( Topo ):
-    def __init__(self):
-        Topo.__init__(self)
 
-        s3 = self.addSwitch( "s3", dpid="0000000000000001")
+class MyTopo( Topo ):
+
+    def __init__( self ):
+        Topo.__init__( self )
+
+        s3 = self.addSwitch( "s3", dpid="0000000000000001" )
 
 topos = { 'mytopo': ( lambda: MyTopo() ) }
