diff --git a/TestON/drivers/common/cli/onosclusterdriver.py b/TestON/drivers/common/cli/onosclusterdriver.py
index 63bee60..5093cfe 100755
--- a/TestON/drivers/common/cli/onosclusterdriver.py
+++ b/TestON/drivers/common/cli/onosclusterdriver.py
@@ -39,10 +39,10 @@
     def __repr__( self ):
         #TODO use repr() for components?
         return "%s<IP=%s, CLI=%s, REST=%s, Bench=%s >" % ( self.name,
-                                                          self.ipAddress,
-                                                          self.CLI,
-                                                          self.REST,
-                                                          self.Bench )
+                                                           self.ipAddress,
+                                                           self.CLI,
+                                                           self.REST,
+                                                           self.Bench )
 
     def __getattr__( self, name ):
         """
@@ -79,7 +79,7 @@
 
 
 
-    def __init__( self, name, ipAddress, CLI=None, REST=None, Bench=None, pos=None, userName=None ):
+    def __init__( self, name, ipAddress, CLI=None, REST=None, Bench=None, pos=None, userName=None, server=None ):
         #TODO: validate these arguments
         self.name = str( name )
         self.ipAddress = ipAddress
@@ -90,6 +90,7 @@
         self.pos = pos
         self.ip_address = ipAddress
         self.user_name = userName
+        self.server = server
 
 class OnosClusterDriver( CLI ):
 
@@ -365,7 +366,56 @@
             main.log.error( name + " component already exists!" )
             main.cleanAndExit()
 
-    def createComponents( self, prefix='' ):
+
+    def setServerOptions( self, name, ipAddress ):
+        """
+        Parse the cluster options to create an ONOS "server" component with the given name
+
+        Arguments:
+            name - The name of the server componet
+            ipAddress - The ip address of the server
+        """
+        main.componentDictionary[name] = main.componentDictionary[self.name].copy()
+        main.componentDictionary[name]['type'] = "OnosDriver"
+        main.componentDictionary[name]['host'] = ipAddress
+        home = main.componentDictionary[name]['COMPONENTS'].get( "onos_home", None )
+        main.componentDictionary[name]['home'] = self.checkOptions( home, None )
+        main.componentDictionary[name]['connect_order'] = str( int( main.componentDictionary[name]['connect_order'] ) + 1 )
+        main.log.debug( main.componentDictionary[name] )
+
+
+    def createServerComponent( self, name, ipAddress ):
+        """
+        Creates a new onos "server" component. This will be connected to the
+        node ONOS is running on.
+
+        Arguments:
+            name - The string of the name of this component. The new component
+                   will be assigned to main.<name> .
+                   In addition, main.<name>.name = str( name )
+            ipAddress - The ip address of the server
+        """
+        try:
+            # look to see if this component already exists
+            getattr( main, name )
+        except AttributeError:
+            # namespace is clear, creating component
+            self.setServerOptions( name, ipAddress )
+            return main.componentInit( name )
+        except pexpect.EOF:
+            main.log.error( self.name + ": EOF exception found" )
+            main.log.error( self.name + ":     " + self.handle.before )
+            main.cleanAndExit()
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
+            main.cleanAndExit()
+        else:
+            # namespace is not clear!
+            main.log.error( name + " component already exists!" )
+            main.cleanAndExit()
+
+
+    def createComponents( self, prefix='', createServer=True ):
         """
         Creates a CLI and REST component for each nodes in the cluster
         """
@@ -373,11 +423,12 @@
         cliPrefix = prefix + "cli"
         restPrefix = prefix + "rest"
         benchPrefix = prefix + "bench"
-        #self.nodes = []
+        serverPrefix = prefix + "server"
         for i in xrange( 1, self.maxNodes + 1 ):
             cliName = cliPrefix + str( i  )
             restName = restPrefix + str( i )
             benchName = benchPrefix + str( i )
+            serverName = serverPrefix + str( i )
 
             # Unfortunately this means we need to have a cell set beofre running TestON,
             # Even if it is just the entire possible cluster size
@@ -386,4 +437,5 @@
             cli = self.createCliComponent( cliName, ip )
             rest = self.createRestComponent( restName, ip )
             bench = self.createBenchComponent( benchName )
-            self.nodes.append( Controller( prefix + str( i ), ip, cli, rest, bench, i - 1, self.user_name ) )
\ No newline at end of file
+            server = self.createServerComponent( serverName, ip ) if createServer else None
+            self.nodes.append( Controller( prefix + str( i ), ip, cli, rest, bench, i - 1, self.user_name, server=server ) )
diff --git a/TestON/drivers/common/clidriver.py b/TestON/drivers/common/clidriver.py
index 55f05ba..b7ad8c8 100644
--- a/TestON/drivers/common/clidriver.py
+++ b/TestON/drivers/common/clidriver.py
@@ -80,15 +80,14 @@
         self.handle.logfile = self.logfile_handler
         i = 5
         while i == 5:
-            i = self.handle.expect( [
-                                    ssh_newkey,
-                                    'password:|Password:',
-                                    pexpect.EOF,
-                                    pexpect.TIMEOUT,
-                                    refused,
-                                    'teston>',
-                                    self.prompt ],
-                            120 )
+            i = self.handle.expect( [ ssh_newkey,
+                                      'password:|Password:',
+                                      pexpect.EOF,
+                                      pexpect.TIMEOUT,
+                                      refused,
+                                      'teston>',
+                                      self.prompt ],
+                                    120 )
             if i == 0:  # Accept key, then expect either a password prompt or access
                 main.log.info( "ssh key confirmation received, send yes" )
                 self.handle.sendline( 'yes' )
@@ -97,7 +96,7 @@
             if i == 1:  # Password required
                 if self.pwd:
                     main.log.info(
-                    "ssh connection asked for password, gave password" )
+                            "ssh connection asked for password, gave password" )
                 else:
                     main.log.info( "Server asked for password, but none was "
                                     "given in the .topo file. Trying "
@@ -327,7 +326,7 @@
                 main.log.error( "Permission denied. Check folder permissions" )
                 returnVal = main.FALSE
             elif i == 6:  # prompt returned
-               return returnVal
+                return returnVal
             elif i == 7:  # EOF
                 main.log.error( "Pexpect.EOF found!!!" )
                 main.cleanAndExit()
@@ -378,15 +377,14 @@
 
         i = 5
         while i == 5:
-            i = handle.expect( [
-                                    ssh_newkey,
-                                    'password:|Password:',
-                                    pexpect.EOF,
-                                    pexpect.TIMEOUT,
-                                    refused,
-                                    'teston>',
-                                    self.prompt ],
-                            120 )
+            i = handle.expect( [ ssh_newkey,
+                                 'password:|Password:',
+                                 pexpect.EOF,
+                                 pexpect.TIMEOUT,
+                                 refused,
+                                 'teston>',
+                                 self.prompt ],
+                               120 )
             if i == 0:  # Accept key, then expect either a password prompt or access
                 main.log.info( "ssh key confirmation received, send yes" )
                 handle.sendline( 'yes' )
@@ -395,7 +393,7 @@
             if i == 1:  # Password required
                 if pwd:
                     main.log.info(
-                    "ssh connection asked for password, gave password" )
+                            "ssh connection asked for password, gave password" )
                 else:
                     main.log.info( "Server asked for password, but none was "
                                     "given in the .topo file. Trying "
@@ -434,14 +432,14 @@
         handle.sendline( "cd" )
         handle.expect( self.prompt )
 
-        main.log.info ( "Successfully ssh to " + ipAddress + "." )
+        main.log.info( "Successfully ssh to " + ipAddress + "." )
         return handle
 
     def exitFromSsh( self, handle, ipAddress ):
         try:
             handle.sendline( "logout" )
             handle.expect( "closed." )
-            main.log.info ( "Successfully closed ssh connection from " + ipAddress )
+            main.log.info( "Successfully closed ssh connection from " + ipAddress )
         except pexpect.EOF:
             main.log.error( "Failed to close the connection from " + ipAddress )
         try:
@@ -451,3 +449,67 @@
         except pexpect.EOF:
             main.log.error( self.handle.before )
             main.log.error( "EOF after closing ssh connection" )
+
+    def folderSize( self, path, size='10', unit='M', ignoreRoot=True ):
+        """
+        Run `du -h` on the folder path and verifies the folder(s) size is
+        less than the given size. Note that if multiple subdirectories are
+        present, the result will be the OR of all the individual subdirectories.
+
+        Arguments:
+        path - A string containing the path supplied to the du command
+        size - The number portion of the file size that the results will be compared to
+        unit - The unit portion of the file size that the results will be compared to
+        ignoreRoot - If True, will ignore the "root" of the path supplied to du. I.E. will ignore `.`
+
+        Returns True if the folder(s) size(s) are less than SIZE UNITS, else returns False
+        """
+        sizeRe = r'(?P<number>\d+\.*\d*)(?P<unit>\D)'
+        unitsList = [ 'K', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y' ]
+        try:
+            # make sure we convert units if size is too big
+            size = float( size )
+            if size >= 1000:
+                size = size / 1000
+                unit = unitsList[ unitsList.index( unit + 1 ) ]
+            cmdStr = "du -h " + path
+            self.handle.sendline( cmdStr )
+            self.handle.expect( self.prompt )
+            output = self.handle.before
+            assert "cannot access" not in output
+            assert "command not found" not in output
+            main.log.debug( output )
+            lines = [ line for line in output.splitlines() ]
+            retValue = True
+            if ignoreRoot:
+                lastIndex = -2
+            else:
+                lastIndex = -1
+            for line in lines[1:lastIndex]:
+                parsed = line.split()
+                sizeMatch = parsed[0]
+                folder = parsed[1]
+                match = re.search( sizeRe, sizeMatch )
+                num = match.group( 'number' )
+                unitMatch = match.group( 'unit' )
+                if unitsList.index( unitMatch ) < unitsList.index( unit ):
+                    retValue &= True
+                elif unitsList.index( unitMatch ) == unitsList.index( unit ):
+                    if float( num ) < float( size ):
+                        retValue &= True
+                    else:
+                        retValue &= False
+                elif unitsList.index( unitMatch ) > unitsList.index( unit ):
+                    retValue &= False
+            return retValue
+        except AssertionError:
+            main.log.error( self.name + ": Could not execute command: " + output )
+            return False
+        except pexpect.TIMEOUT:
+            main.log.exception( self.name + ": TIMEOUT exception found" )
+            main.log.error( self.name + ":    " + self.handle.before )
+            return False
+        except pexpect.EOF:
+            main.log.error( self.name + ": EOF exception found" )
+            main.log.error( self.name + ":    " + self.handle.before )
+            main.cleanAndExit()
diff --git a/TestON/tests/CHOTestMonkey/CHOTestMonkey.params b/TestON/tests/CHOTestMonkey/CHOTestMonkey.params
index 6bb3467..b1b9d0f 100644
--- a/TestON/tests/CHOTestMonkey/CHOTestMonkey.params
+++ b/TestON/tests/CHOTestMonkey/CHOTestMonkey.params
@@ -134,6 +134,14 @@
             <maxRerunNum>5</maxRerunNum>
         </ONOSCheck>
 
+        <RaftLogSizeCheck>
+            <status>on</status>
+            <typeIndex>15</typeIndex>
+            <typeString>CHECK_RAFT_LOG_SIZE</typeString>
+            <CLI>check-raft-size</CLI>
+            <CLIParamNum>0</CLIParamNum>
+        </RaftLogSizeCheck>
+
         <LinkDown>
             <status>on</status>
             <typeIndex>20</typeIndex>
diff --git a/TestON/tests/CHOTestMonkey/CHOTestMonkey.py b/TestON/tests/CHOTestMonkey/CHOTestMonkey.py
index 2a0dc55..3e21612 100644
--- a/TestON/tests/CHOTestMonkey/CHOTestMonkey.py
+++ b/TestON/tests/CHOTestMonkey/CHOTestMonkey.py
@@ -785,6 +785,7 @@
             main.eventGenerator.triggerEvent( EventType().CHECK_TRAFFIC, EventScheduleMethod().RUN_NON_BLOCK )
             main.eventGenerator.triggerEvent( EventType().CHECK_FLOW, EventScheduleMethod().RUN_NON_BLOCK )
             main.eventGenerator.triggerEvent( EventType().CHECK_INTENT, EventScheduleMethod().RUN_NON_BLOCK )
+            main.eventGenerator.triggerEvent( EventType().CHECK_RAFT_LOG_SIZE, EventScheduleMethod().RUN_NON_BLOCK )
             with main.eventScheduler.idleCondition:
                 while not main.eventScheduler.isIdle():
                     main.eventScheduler.idleCondition.wait()
diff --git a/TestON/tests/CHOTestMonkey/CHOTestMonkey.topo b/TestON/tests/CHOTestMonkey/CHOTestMonkey.topo
index 9930443..5fdf91d 100644
--- a/TestON/tests/CHOTestMonkey/CHOTestMonkey.topo
+++ b/TestON/tests/CHOTestMonkey/CHOTestMonkey.topo
@@ -33,4 +33,4 @@
         </Mininet1>
 
     </COMPONENT>
-</TOPOLOGY>
\ No newline at end of file
+</TOPOLOGY>
diff --git a/TestON/tests/CHOTestMonkey/dependencies/events/CheckEvent.py b/TestON/tests/CHOTestMonkey/dependencies/events/CheckEvent.py
index 786bfa8..fc03203 100644
--- a/TestON/tests/CHOTestMonkey/dependencies/events/CheckEvent.py
+++ b/TestON/tests/CHOTestMonkey/dependencies/events/CheckEvent.py
@@ -328,3 +328,19 @@
                 checkResult = EventStates().FAIL
                 main.log.warn( "Traffic Check - ping6 failed" )
         return checkResult
+
+class RaftLogSizeCheck( CheckEvent ):
+
+    def __init__( self ):
+        CheckEvent.__init__( self )
+        self.typeString = main.params[ 'EVENT' ][ self.__class__.__name__ ][ 'typeString' ]
+        self.typeIndex = int( main.params[ 'EVENT' ][ self.__class__.__name__ ][ 'typeIndex' ] )
+
+    def startCheckEvent( self, args=None ):
+        checkResult = EventStates().PASS
+        main.log.info( "Starting checking Raft Log size" )
+        if not main.Cluster.checkPartitionSize():
+            checkResult = EventStates().FAIL
+            main.log.warn( "Raft Log Size Check - Raft log grew too big" )
+
+        return checkResult
diff --git a/TestON/tests/HA/dependencies/HA.py b/TestON/tests/HA/dependencies/HA.py
index f1ddaef..48b64c6 100644
--- a/TestON/tests/HA/dependencies/HA.py
+++ b/TestON/tests/HA/dependencies/HA.py
@@ -136,7 +136,8 @@
         main.log.warn( javaArgs )
         main.log.warn( repr( javaArgs ) )
         handle = main.ONOSbench.handle
-        sed = r"sed -i 's/bash/bash\nexport JAVA_OPTS=${{JAVA_OPTS:-{}}}\n/' {}".format( javaArgs, main.onosServicepath )
+        sed = r"sed -i 's/bash/bash\nexport JAVA_OPTS=${{JAVA_OPTS:-{}}}\n/' {}".format( javaArgs,
+                                                                                         main.onosServicepath )
         main.log.warn( sed )
         main.log.warn( repr( sed ) )
         handle.sendline( sed )
@@ -326,8 +327,6 @@
         """
         rest of initialSetup
         """
-
-
         if main.params[ 'tcpdump' ].lower() == "true":
             main.step( "Start Packet Capture MN" )
             main.Mininet2.startTcpdump(
@@ -450,7 +449,8 @@
             main.log.exception( "Error parsing leaders" )
             main.log.error( repr( leaders ) )
         if missing:
-            #NOTE Can we refactor this into the Cluster class? Maybe an option to print the output of a command from each node?
+            # NOTE Can we refactor this into the Cluster class?
+            #      Maybe an option to print the output of a command from each node?
             for ctrl in main.Cluster.active():
                 response = ctrl.CLI.leaders( jsonFormat=False )
                 main.log.debug( str( ctrl.name ) + " leaders output: \n" +
@@ -569,7 +569,7 @@
                 if re.search( "tcp:" + ctrl.ipAddress, response ):
                     mastershipCheck = mastershipCheck and main.TRUE
                 else:
-                    main.log.error( "Error, node " + repr( ctrl )+ " is " +
+                    main.log.error( "Error, node " + repr( ctrl ) + " is " +
                                     "not in the list of controllers s" +
                                     str( i ) + " is connecting to." )
                     mastershipCheck = main.FALSE
@@ -915,7 +915,7 @@
                                      indent=4,
                                      separators=( ',', ': ' ) )
             except ( ValueError, TypeError ):
-               output = repr( tmpIntents )
+                output = repr( tmpIntents )
             main.log.debug( "ONOS1 intents: " + output )
         utilities.assert_equals(
             expect=main.TRUE,
@@ -1099,14 +1099,12 @@
             mastershipCheck = main.TRUE
             mastershipState = ONOSMastership[ 0 ]
 
-
         global intentState
         intentState = []
         ONOSIntents, intentsResults = self.checkingIntents()
         intentCheck = main.FALSE
         consistentIntents = True
 
-
         main.step( "Check for consistency in Intents from each controller" )
         if all( [ sorted( i ) == sorted( ONOSIntents[ 0 ] ) for i in ONOSIntents ] ):
             main.log.info( "Intents are consistent across all ONOS " +
@@ -1178,7 +1176,7 @@
         main.step( "Get the flows from each controller" )
         global flowState
         flowState = []
-        ONOSFlows = main.Cluster.command( "flows", specificDriver=2 ) # TODO: Possible arg: sleep = 30
+        ONOSFlows = main.Cluster.command( "flows", specificDriver=2 )  # TODO: Possible arg: sleep = 30
         ONOSFlowsJson = []
         flowCheck = main.FALSE
         consistentFlows = True
@@ -2025,8 +2023,8 @@
             main.step( "Distributed Set clear()" )
             main.onosSet.clear()
             clearResponses = main.Cluster.command( "setTestRemove",
-                    args=[ main.onosSetName, " " ],  # Values doesn't matter
-                    kwargs={ "clear": True } )
+                                                   args=[ main.onosSetName, " " ],  # Values doesn't matter
+                                                   kwargs={ "clear": True } )
             # main.TRUE = successfully changed the set
             # main.FALSE = action resulted in no change in set
             # main.ERROR - Some error in executing the function
@@ -2536,7 +2534,17 @@
         colors = { 'cyan': '\033[96m', 'purple': '\033[95m',
                    'blue': '\033[94m', 'green': '\033[92m',
                    'yellow': '\033[93m', 'red': '\033[91m', 'end': '\033[0m' }
+
         main.case( "Test Cleanup" )
+
+        main.step( "Checking raft log size" )
+        # TODO: this is a flaky check, but the intent is to make sure the raft logs
+        #       get compacted periodically
+        logCheck = main.Cluster.checkPartitionSize()
+        utilities.assert_equals( expect=True, actual=logCheck,
+                                 onpass="Raft log size is not too big",
+                                 onfail="Raft logs grew too big" )
+
         main.step( "Killing tcpdumps" )
         main.Mininet2.stopTcpdump()
 
@@ -2780,11 +2788,11 @@
         utilities.assert_equals( expect=main.TRUE, actual=runResults,
                                  onpass="ONOS nodes reran for election topic",
                                  onfail="Errror rerunning for election" )
+
     def tempCell( self, cellName, ipList ):
         main.step( "Create cell file" )
         cellAppString = main.params[ 'ENV' ][ 'appString' ]
 
-
         main.ONOSbench.createCellFile( main.ONOSbench.ip_address, cellName,
                                        main.Mininet1.ip_address,
                                        cellAppString, ipList , main.ONOScli1.karafUser )
@@ -2792,7 +2800,6 @@
         cellResult = main.ONOSbench.setCell( cellName )
         verifyResult = main.ONOSbench.verifyCell()
 
-
     def checkStateAfterEvent( self, main, afterWhich, compareSwitch=False, isRestart=False ):
         """
         afterWhich :
@@ -3108,9 +3115,11 @@
             mnHosts = main.Mininet1.getHosts()
             for controller in range( len( main.Cluster.active() ) ):
                 controllerStr = str( main.Cluster.active( controller ) )
-                currentDevicesResult = main.topoRelated.compareDevicePort( main.Mininet1, controller,
-                                                          mnSwitches,
-                                                          devices, ports )
+                currentDevicesResult = main.topoRelated.compareDevicePort( main.Mininet1,
+                                                                           controller,
+                                                                           mnSwitches,
+                                                                           devices,
+                                                                           ports )
                 utilities.assert_equals( expect=main.TRUE,
                                          actual=currentDevicesResult,
                                          onpass=controllerStr +
@@ -3118,10 +3127,9 @@
                                          onfail=controllerStr +
                                          " Switches view is incorrect" )
 
-
                 currentLinksResult = main.topoRelated.compareBase( links, controller,
-                                                        main.Mininet1.compareLinks,
-                                                        [mnSwitches, mnLinks] )
+                                                                   main.Mininet1.compareLinks,
+                                                                   [ mnSwitches, mnLinks ] )
                 utilities.assert_equals( expect=main.TRUE,
                                          actual=currentLinksResult,
                                          onpass=controllerStr +
@@ -3428,7 +3436,7 @@
                       "working properly"
         main.case( description )
 
-        main.step( "Bring link between " + fromS + " and " + toS +" back up" )
+        main.step( "Bring link between " + fromS + " and " + toS + " back up" )
         LinkUp = main.Mininet1.link( END1=fromS, END2=toS, OPTION="up" )
         main.log.info( "Waiting " + str( linkSleep ) +
                        " seconds for link up to be discovered" )
diff --git a/TestON/tests/dependencies/Cluster.py b/TestON/tests/dependencies/Cluster.py
index 5c6e679..16dfd79 100644
--- a/TestON/tests/dependencies/Cluster.py
+++ b/TestON/tests/dependencies/Cluster.py
@@ -24,15 +24,14 @@
 
     def __str__( self ):
         return self.name
+
     def __repr__( self ):
-        #TODO use repr of cli's?
         controllers = []
         runningNodes = []
         for ctrl in self.controllers:
             controllers.append( str( ctrl ) )
         return "%s[%s]" % ( self.name, ", ".join( controllers ) )
 
-
     def __init__( self, ctrlList=[], name="Cluster" ):
         '''
             controllers : All the nodes
@@ -186,7 +185,7 @@
         """
         result = main.TRUE
         uninstallResult = self.command( "onosUninstall",
-                                        kwargs={ "nodeIp":"ipAddress" },
+                                        kwargs={ "nodeIp": "ipAddress" },
                                         specificDriver=1,
                                         getFrom=0 if uninstallMax else 1,
                                         funcFromCtrl=True )
@@ -206,12 +205,12 @@
         """
 
         setCellResult = self.command( "setCell",
-                      args=[ cellName ],
-                      specificDriver=1,
-                      getFrom=0 if installMax else 1 )
+                                      args=[ cellName ],
+                                      specificDriver=1,
+                                      getFrom=0 if installMax else 1 )
         verifyResult = self.command( "verifyCell",
-                      specificDriver=1,
-                      getFrom=0 if installMax else 1 )
+                                     specificDriver=1,
+                                     getFrom=0 if installMax else 1 )
         result = main.TRUE
         for i in range( len( setCellResult ) ):
             result = result and setCellResult[ i ] and verifyResult[ i ]
@@ -267,7 +266,7 @@
                                    specificDriver=1,
                                    getFrom=0 if killMax else 1,
                                    funcFromCtrl=True )
-        for i in range( len ( killResult ) ):
+        for i in range( len( killResult ) ):
             result = result and killResult[ i ]
             self.controllers[ i ].active = False
         return result
@@ -283,7 +282,7 @@
         """
         result = main.TRUE
         sshResult = self.command( "onosSecureSSH",
-                                   kwargs={ "node":"ipAddress" },
+                                   kwargs={ "node": "ipAddress" },
                                    specificDriver=1,
                                    getFrom=1,
                                    funcFromCtrl=True )
@@ -309,10 +308,10 @@
             if installMax and i >= self.numCtrls:
                 options = "-nf"
             if installParallel:
-                t= main.Thread( target=ctrl.Bench.onosInstall,
-                                name="install-" + ctrl.name,
-                                kwargs={ "node" : ctrl.ipAddress,
-                                         "options" : options } )
+                t = main.Thread( target=ctrl.Bench.onosInstall,
+                                 name="install-" + ctrl.name,
+                                 kwargs={ "node" : ctrl.ipAddress,
+                                          "options" : options } )
                 threads.append( t )
                 t.start()
             else:
@@ -338,7 +337,7 @@
                                    specificDriver=2,
                                    getFrom=1,
                                    funcFromCtrl=True )
-        for i in range ( len( cliResults ) ):
+        for i in range( len( cliResults ) ):
             result = result and cliResults[ i ]
             self.controllers[ i ].active = True
         return result
@@ -354,8 +353,8 @@
         Returns:
         """
         f = getattr( main.log, logLevel )
-        for i in range ( len ( results ) ):
-            f( activeList[ i ].name + "'s result : " + str ( results[ i ] ) )
+        for i in range( len( results ) ):
+            f( activeList[ i ].name + "'s result : " + str( results[ i ] ) )
 
     def allTrueResultCheck( self, results, activeList ):
         """
@@ -447,7 +446,7 @@
                             funcArgs.append( getattr( ctrl, args[ i ] ) )
                     if kwargs:
                         for k in kwargs:
-                            funcKwargs.update( { k:getattr( ctrl, kwargs[ k ] ) } )
+                            funcKwargs.update( { k: getattr( ctrl, kwargs[ k ] ) } )
             except AttributeError:
                 main.log.error( "Function " + function + " not found. Exiting the Test." )
                 main.cleanAndExit()
@@ -465,4 +464,16 @@
             return self.allTrueResultCheck( results, fromNode[ getFrom ] )
         elif contentCheck:
             return self.notEmptyResultCheck( results, fromNode[ getFrom ] )
-        return results
\ No newline at end of file
+        return results
+
+    def checkPartitionSize( self, segmentSize='64', units='M', multiplier='3' ):
+        # max segment size in bytes: 1024 * 1024 * 64
+        # multiplier is somewhat arbitrary, but the idea is the logs would have
+        # been compacted before this many segments are written
+
+        maxSize = float( segmentSize ) * float( multiplier )
+        ret = True
+        for n in self.runningNodes:
+            ret = ret and n.server.folderSize( "/opt/onos/apache-karaf-*/data/partitions/*/*.log",
+                                               size=maxSize, unit=units, ignoreRoot=False )
+        return ret
